nov1n/squawk

GitHub: nov1n/squawk

squawk 是一款 macOS 上为 Claude Code 提供上下文感知智能通知的工具,支持在通知中内联回复和一键批准权限。

Stars: 5 | Forks: 0

https://github.com/user-attachments/assets/e99fe0b1-1423-4f97-bf2a-b0fd287f4eb5 # squawk `squawk` 为 Claude Code 带来了智能的 macOS 通知功能。它只会在 Claude 不在视线范围内时提醒你,并提供快速操作以便回复、批准或跳转到该面板。 ## 功能 - **上下文感知提醒:** 聚焦时保持静默,可见时显示面板内横幅,离开屏幕时发送通知。 - **内联回复:** 直接在通知中回复以让 Claude 继续。 - **一键批准:** 直接在提醒中允许权限提示。 - **消息预览:** 一眼即可查看 Claude 的最新回复。 - **智能生命周期:** 提醒会持续存在直至被处理,但当你聚焦该面板时会自动清除。 - **整洁分组:** 会话通知会原地更新,而不会堆满你的屏幕。 - **零配置:** 开箱即用,并支持可选的环境变量覆盖(参见[配置](#configuration))。 ## 事件 `squawk` 使用 Claude Code hooks 在以下事件发生时发送通知: | 事件 | 触发条件 | 通知 | | ------------------- | ----------------------------------------------------------- | ------------------------------------------------- | | `Stop` | Claude 完成其轮次 | **已完成**;回复以让其继续 | | `StopFailure` | 轮次因 API 错误(速率限制、服务器错误等)而终止 | **轮次失败** | | `Notification` | Claude 正在等待你或 MCP 服务器请求输入 | **需要你的输入** | | `PermissionRequest` | Claude 需要权限才能运行工具 | **需要你的权限**;在提醒中批准 | ## 要求 - **Claude Code**、**`tmux`**、**`jq`** 和 **`alerter`**(核心依赖) - **Claude for Desktop** _(可选)_ `squawk` 会借用其应用图标,使通知看起来更原生。如果没有它,你会得到一个默认的后备图标(或者你可以手动设置 `SQUAWK_ICON`)。 ``` brew install jq tmux claude brew install vjeantet/tap/alerter brew install --cask claude-code ``` ## 安装 ``` git clone https://github.com/nov1n/squawk ~/.local/share/squawk ~/.local/share/squawk/bin/squawk install ``` 将克隆的仓库保留在原处,因为 `squawk install` 会创建指向它的符号链接,并在运行时读取它(因此 `git pull` 即可实现原处升级)。`squawk install` 会执行以下操作: 1. 检查所需依赖是否已正确安装。 2. 将 `squawk` 符号链接到 `~/.local/bin`(可通过 `PREFIX=` 覆盖)。 3. 将其 hooks(`Stop`、`StopFailure`、`Notification`、`PermissionRequest`)合并到 `~/.claude/settings.json` 中。 4. 提示将面板内横幅所需的 tmux 代码片段添加到 `~/.tmux.conf`(或者打印出来供你自行添加)。 ## 配置 全部通过环境变量(或者如果存在则读取可选的 `~/.config/squawk/config`)进行配置: | 变量 | 默认值 | 用途 | | ------------------ | -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `SQUAWK_ICON` | _(自动)_ | 通知所使用的 **图标** 的 Bundle id(`alerter --sender`)。如果 Claude for Desktop 安装在标准路径下,则默认使用 **Claude 图标**。设置一个 bundle id 以使用其他应用的图标,或设为 `none` 以禁用。 | | `SQUAWK_BANNER` | _(黄色 ⬤ 样式)_ | 面板内横幅的完整 tmux `pane-border-format`;`{label}` 会被替换为对应的事件。重新设置颜色、符号、填充/宽度和对齐方式 —— 例如 `#[align=left,bg=magenta,fg=white,bold] ▶ {label} `。 | | `SQUAWK_TIMEOUT` | `0` | 通知自动消失前的秒数。`0` 表示**持续保留**(当你返回面板时 squawk 会将其清除)。设置一个数字则以自动消失代替。 | | `SQUAWK_SOUND` | _(静音)_ | 在通知时播放声音。设置为 `default` 或 macOS 系统声音名称(`Ping`、`Glass`、`Submarine` 等)。 | | `SQUAWK_APPROVE` | `1` | 在权限通知上显示批准按钮。设为 `0` 表示仅通知(在终端中决定)。 | | `SQUAWK_REPLY` | `1` | 在“已完成”通知上显示回复字段(你的回复会继续对话)。设为 `0` 表示仅通知。 | | `SQUAWK_ENABLE` | `1` | 设为 `0` 将完全禁用 squawk。 | | `SQUAWK_DEBUG` | _(未设置)_ | 设为 `1` 可将决策记录到 `SQUAWK_DEBUG_LOG`。 | | `SQUAWK_DEBUG_LOG` | `$TMPDIR/squawk-debug.log` | 调试日志路径。 | ## 卸载 ``` squawk uninstall ``` 移除 Claude Code hooks(保留同级内容)、`~/.local/bin/squawk` 符号链接以及 tmux 代码片段。 ## 开发 ``` make test # bats suite make lint # shellcheck + shfmt make fmt # auto-format ``` ## 常见问题
为什么我没有收到通知? macOS 必须允许 squawk 借用图标的应用(默认为 Claude Desktop)发送通知。打开 **系统设置 → 通知 → Claude**,开启 **允许通知**,并将样式设置为 **提醒**,以便回复/批准按钮出现并持续显示。如果通知仍然没有显示,macOS 可能正在丢弃模拟的发送方 —— 请设置 `SQUAWK_ICON=none` 以使用默认图标。 ![macOS 系统设置中的 Claude 通知权限](https://static.pigsec.cn/wp-content/uploads/repos/cas/a3/a342196fdfb3d0616774b81bbad8e21d2b4c99d3c8276cabb9381824862bf20f.png)
为什么批准按钮没有显示? **命令过长或多行。** 你无法安全地批准无法完整查看的内容,因此当它超出显示范围时,正文会被 `…` 截断并且按钮会被隐藏 —— 点击正文可打开面板并在那里批准完整的命令。
squawk 支持多个 tmux 客户端吗? 不完全支持。当两个客户端连接到同一个会话时,tmux 是按_会话_而不是按客户端报告其面板/窗口状态的,因此 squawk 无法分辨你实际正在查看哪个终端,并且可能会在该通知时保持静默。单个已连接的客户端 —— 无论是否有任何分割、窗口和分离的会话 —— 都能得到完全支持。
## AI 声明 squawk 几乎完全由 Claude Code 构建。其设计、实现和测试均是在人类指导和审查下,通过 AI 结对编程产生的。 ## 许可证 [MIT](LICENSE)
标签:Claude Code, Cutter, tmux, 开发辅助, 通知工具