我为 macOS 打造了一个“smart Spotlight”,它能够识别屏幕并执行任务,以下是几个要点

发布: (2026年4月19日 GMT+8 18:41)
4 分钟阅读
原文: Dev.to

Source: Dev.to

Introduction

我厌倦了在 Spotlight、终端和 AI 聊天机器人之间来回切换,只为执行一些简单的任务。于是我构建了 Castor,一个 macOS 上的 Spotlight 风格覆盖层,它不仅可以查找文件,还能根据当前打开的内容的上下文执行命令。它是免费且开源的。

How it looks

Castor UI

How it works

Spotlight 的 UI 很棒,因为它完全无摩擦。我想要同样的用户体验来进行自动化——按下快捷键后输入 “rename all selected files to lowercase” 或 “summarize this Safari tab”。

为了实现无缝体验,Castor 在发送提示之前会先获取你的上下文。它会悄悄抓取:

  • 活动的 Finder 路径和选中的文件
  • 浏览器标签页和 URL(Safari 和 Chrome)
  • 剪贴板文本
  • 当前屏幕的截图(通过 ScreenCaptureKit

你只需直接说明想要的结果,而不必解释你正在看什么。

The backend (and fighting Node.js)

我使用 Gemini Flash,通过 gemini-cli 调用。它速度快,且易于在 Swift 中接入。问题在于 gemini-cli 基于 Node,冷启动延迟破坏了 Spotlight 的流畅感。

为了解决这个问题,Castor 会保持一个后台进程常驻。当你关闭 UI 时,它会为下次运行预热一个新实例。现在只有第一次启动会稍慢。

Skipping the AI round‑trip

我发现自己反复运行同几个脚本(例如 “resize to 800 px”、 “convert to PDF”)。Castor 现在拥有 Script Memory 功能,会保存成功的 shell 命令并在以后进行模糊匹配。如果匹配度高,你会得到一个即时建议,只需一次按键即可触发,完全绕过 AI。

Handling concurrency

第一版在任务运行时会阻塞其他操作。现在你可以并行触发多个任务。它们会以垂直堆叠的形式显示(类似 iMessage),每个任务都有自己的输出流和取消按钮。让这些与 Swift 6.2 严格的 actor 隔离协同工作曾是个头疼的问题,但现在代码已经安全得多。

UI & Specs

  • 该覆盖层是一个非激活的 NSPanel,漂浮在屏幕上且不抢占焦点。
  • 使用全新的原生 .glassEffect(),让它看起来像一款一方工具。
  • 包含一个菜单栏 Live Activity,用于跟踪进度。

What’s next

仍有不少粗糙的地方,因为它是个人项目。我目前在研究:

  • 更好的上下文提取(Terminal、VS Code、Xcode)
  • 本地模型支持
  • 可编辑的脚本记忆
  • Shortcuts 集成

代码已托管在 GitHub。欢迎提交 PR、issue 和反馈。

GitHub:

Built with Swift 6.2, SwiftUI, ScreenCaptureKit, AppKit, and gemini-cli. Requires macOS 26 (Tahoe).

0 浏览
Back to Blog

相关文章

阅读更多 »

Windows 的 Sudo

欢迎来到 Sudo for Windows 的代码仓库 https://aka.ms/sudo 🥪。Sudo for Windows 允许用户直接在未提升权限的终端中运行提升权限的命令 w...