背景

我每天启动 Claude Code 大约 30 次。在不同项目之间切换,每次都要执行同样的流程:

cd ~/Projects/my-app
claude "fix the login bug"

换个项目,再来一遍:

cd ~/Projects/api-server
claude "add rate limiting"

一天 30 次,4 步操作 × 20 秒 = 每天浪费 10 分钟。一年就是 60 小时。

问题不在 Claude Code 本身——它很好用。问题在于启动它的工作流太笨了。所以我做了 GroAsk,一个 macOS 菜单栏的 AI 启动器,用全局快捷键 ⌥Space 一步到位。

一键启动的实现

用户视角

传统方式:
  打开终端 → cd ~/Projects/my-app → claude "fix the login bug" → 等

GroAsk:
  ⌥Space → 输入 "fix the login bug" → 回车

⌥Space(可自定义),弹出输入框。选 Claude Code 通道,写 prompt,回车。终端自动打开,cd 到正确目录,带着 prompt 直接启动 Agent。

关键点:不是打开终端让你输入,而是终端打开时 Claude Code 已经带着你的指令在跑了。

工作目录检测

路径来源有三个优先级:

  1. Finder 联动 — 自动读取当前 Finder 窗口目录
  2. 别名系统/app fix bug 展开为 cd ~/Projects/my-app && claude "fix bug"
  3. 默认目录 — 兜底的工作路径

四种终端的自动化差异

这是项目里最有技术含量的部分。macOS 上四种主流终端,每一种的自动化实现完全不同。

Terminal.app — AppleScript do script

tell application "Terminal"
    activate
    do script "cd ~/Projects/my-app && claude \"fix the login bug\""
end tell

最标准的实现。AppleScript 字典完整,可以控制窗口、Tab、执行任意命令。

iTerm2 — AppleScript create window with profile

tell application "iTerm"
    activate
    create window with profile "Default" command "cd ~/Projects/my-app && claude \"fix the login bug\""
end tell

和 Terminal.app 类似,但 API 更现代。Profile 支持让你可以指定特定的终端配置。

Ghostty — -e 参数 + login shell 包装

Ghostty 是 Mitchell Hashimoto 做的新终端,性能很好但没有 AppleScript 支持。用 -e 参数启动:

open -na Ghostty --args -e bash -l -c 'cd ~/Projects/my-app && claude "fix the login bug"'

踩坑点-e 是替换 shell 而不是在 shell 里执行,.zshrc 不会加载,PATH 不完整。所以必须包一层 bash -l -c 来加载完整的 shell profile。

Warp — YAML Launch Config + URI scheme

Warp 是最棘手的。没有 AppleScript,没有 -e 参数,没有任何编程接口。

唯一能用的是 Launch Configuration 机制:

# ~/.warp/launch_configurations/groask_session.yaml
---
name: groask_session
windows:
  - tabs:
      - layout:
          cwd: ~/Projects/my-app
          command: claude "fix the login bug"

然后通过 URI scheme 触发:

open "warp://action/launch?config=groask_session"

GroAsk 每次启动时动态生成这个 YAML 文件,写入 Warp 配置目录,再触发 URI scheme。多了一步文件 I/O,但用户体验和其他终端一致。

为什么不统一抽象?

因为没法统一。四种终端的能力边界完全不同:

终端AppleScript-e 参数配置文件触发窗口控制
Terminal.app完整--完整
iTerm2完整--完整
Ghostty有(替换 shell)-
Warp

只能逐个适配,做四套实现。

一键安装 CLI 工具

依赖链自动处理

不同 CLI AI 工具的安装路径差异很大:

有 curl 安装器的工具(Claude Code、Kimi Code):

# 一行搞定
curl -fsSL https://cli.example.com/install.sh | bash
# 自动追加 PATH 到 .zshrc
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc

依赖 npm 的工具(Gemini CLI、Codex)需要处理依赖链:

检测 npm → 有就直接装
         → 没有,检测 fnm → 有就用 fnm 装 Node.js 再装 CLI
                          → 没有 → 装 fnm → 装 Node.js → 装 CLI

全程不需要 sudo、Homebrew、Xcode Command Line Tools。

安装状态轮询

安装触发后,后台每 2 秒执行一次检测:

bash -l -c 'command -v claude'

bash -l 加载完整 shell 环境,确保能发现 fnm 刚安装的工具。检测到就立刻刷新 UI。设了 3 分钟超时保护。

PATH 问题的解决

macOS GUI 应用不加载 shell profile,PATH 和终端里不一样。GroAsk 的做法:

bash -l -c 'printf MARKER%s "$PATH"'

MARKER 前缀隔离 conda/pyenv 等工具在 shell 初始化时输出到 stdout 的噪声。

再加上文件系统扫描兜底——扫描 ~/.local/bin~/.cargo/bin、Homebrew 路径、nvm/fnm/Volta/mise 的安装路径,覆盖所有安装方式。

不只是 Claude Code

GroAsk 支持 6 个 CLI AI + 4 个 Web AI:

  • CLI:Claude Code、Gemini CLI、Codex、CodeBuddy、Kimi Code、Qwen Code
  • Web:ChatGPT、Claude、Gemini、Monica(自动注入 prompt 到输入框)

同一个 ⌥Space 输入框,Tab 切换不同 AI。还支持划词即问——选中文本,按快捷键,自动填入输入框发给 AI。

竞品对比

| 能力 | Claude Code Now | Raycast 插件 | GroAsk |
|------|:-:|:-:|:-:|
| 启动方式 | Dock 图标 | Raycast 搜索 | ⌥Space 全局快捷键 |
| 带 prompt 启动 | 不支持 | 不支持 | 支持 |
| 多终端 | 仅 Terminal.app | Terminal/Alacritty/Ghostty/Warp | Terminal/iTerm2/Ghostty/Warp |
| 图形化安装 | 不支持 | 不支持 | 支持,依赖链全自动 |
| 多 AI 切换 | 仅 Claude Code | 仅 Claude Code | 6 CLI + 4 Web AI |
| 划词即问 | 不支持 | 不支持 | 支持 |

用 Claude Code 做了一个 Claude Code 启动器

GroAsk 本身就是 Claude Code 协作的产物:

  • 190 次提交,49% 由 Claude Code 协作完成
  • 14 天从零到上线
  • 5,600 行 Swift(纯 AppKit)+ 1,200 行 Server(Cloudflare Workers)
  • 内存占用 < 30MB

每个模块——AppleScript 终端控制、WebKit 注入脚本、PATH 环境检测、Cloudflare Workers 后端——都是我定方向、Claude Code 写实现、我审代码的循环。


GroAsk 免费,macOS 原生,100% 本地桥接,不存数据。

欢迎 Star,有问题到 GitHub Discussions 聊。

标签: none

添加新评论