关于 pushary
Pushary 是面向 AI Agent 的推送通知 MCP 服务,可将消息发送到用户的手机、Mac 或 Slack。它提供提问和通知工具,并包含设备连接、权限与任务执行时机的操作指引。
主要功能
- 01向手机、Mac 或 Slack 推送
- 02支持是非题、选择题和自由文本提问
- 03发送任务完成或失败通知
- 04提供无人值守时的询问指引
- 05包含安装与连接状态检查
适用场景
- 01无人值守任务遇到决策分歧时询问用户
- 02任务完成或构建失败时发送通知
- 03执行不可逆操作前征求所需决定
MCP 相关
Pushary 是 MCP 服务,向 Agent 提供 ask_user 和 send_notification 工具。前者提问并返回用户答复,后者发送通知。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ pushary/ pushary-skill --skill pushary安装后在 Claude Code 中输入/pushary确认已加载。
附带文件SKILL-LITE.md
详细介绍
Pushary — 面向 AI Agent 的推送通知
当用户说“继续做吧,如果需要我处理什么,就发消息到我手机上”时,负责发送消息的就是这个技能。Pushary 是一个 MCP 服务,可通过手机、Mac 或 Slack 联系用户:
- 使用
ask_user提问:是/否、选择题或自由文本。答案会返回给你。 - 使用
send_notification告知用户某件事:任务已完成、构建失败或结果已就绪。
一个工具负责提问,一个工具负责告知。主动使用它们。不要等用户来要求通知。
无需用户提出,就主动联系
遵守用户在本次会话中已经授予你的授权。只针对你尚未获得决定的事项、授权范围之外的操作,或主机策略要求确认的情况提问。任务步骤多,并不意味着需要单独征求计划批准。不要因为下一个已获批准的步骤会删除、部署或发布内容,就再次询问。Pushary 钩子批准某个确切的工具调用后,不要再询问是否执行该调用。之后再次运行同一命令,是一个新的步骤。此技能为你提供指引。钩子和运行时门控负责执行策略。绝不要绕过门控。
用户不必说“发消息给我”。出现以下情况时,立即行动:如果用户正在聊天中,就在聊天里提问(参见“在哪里提问”);否则调用 ask_user,并通过 send_notification 告知用户。不要拖延。不要猜测。不要把问题写进一个没人查看的聊天里。
- 你即将执行不可逆操作。 删除、丢弃、截断、强制推送、重写历史记录、覆盖并非由你创建的文件。
- 你即将花钱或操作生产环境。 部署、发布、公开发布、大规模调用付费 API、配置任何会产生费用的资源。
- 决定超出你的权限范围。 产品决策、命名决策、架构变更、安全取舍,以及任何用户希望亲自决定的事项。
- 无人值守运行时遇到真正的歧义。 对任务存在两种合理解读,而选错会让整次运行白费。
- 其他技能要求你向用户确认。 这类指示默认有人在看终端,但通常并非如此。和这里的其他情况一样,在用户所在之处提问,这样他们回答后,任务就能继续。
- 长任务已完成或失败,但无人查看。 发送结果,不要让它只留在用户已经离开的屏幕上。
如果没有设备连接,请遵照结果中的交接指示,并继续处理不依赖该答案且已获批准的工作。无法送达的消息不代表你获准执行受阻的操作。
少问,好好问
每个问题都会打断用户。打断次数就是代价。尽量用更少的打断,一次问清同一类事项。
事实由你查明;决定由用户做出。 如果文件、命令或工具调用可以查明事实,就不要问用户。绝不要替用户做他们希望亲自决定的事:产品决策、命名、成本,以及他们必须承担后果的取舍。
提问前先自问:如果不问,你会按默认方案执行吗?
- 会,而且选择可撤销、不花钱、不向团队外发送内容、不部署或发布任何内容,并且在授予你的权限范围内。 不要提问。采用默认方案,继续工作,并在最终消息中列出这项决定,方便用户更改。
- 不会,或者该操作不可逆、会花钱,或属于用户尚未批准且超出你权限范围的决定。 这就需要提问或取得批准。提问并等待答复。缺少答复绝不等于获批。
用户已经批准的步骤无需再次询问,即使该步骤不可逆也一样。
任务超过两步时,先规划问题:
- 了解当前环境:所在目录、目录结构、配置以及你拥有的工具。
- 将任务拆分为多个步骤。
- 找出分歧点:存在两个答案都正确、但你无法独自择一的地方。
- 查证所有可以通过查询解决的分歧。这是事实,不是分歧。
- 将剩余分歧合并为一轮提问。为每个问题编号,并给出你推荐的答案。然后等待回答,不要开始任何依赖这些答案的工作。
- 每个答案都会引出新的分歧,也会消除旧的分歧。提出下一轮问题。没有剩余分歧时停止。
一轮提问应包含所有输入已知的决策。依赖同一轮其他决策的决策应放到下一轮。措辞应确保回答“是”即表示接受你的建议。在 select 中,将你的建议放在首位。
终端轮次的格式如下:
❓ **Q1** - **Which app**: apps/dashboard and apps/subscribe both import this helper. Change both apps, not just the dashboard?
➡️ Yes, both. The helper has one definition, and a split copy will drift.
---
❓ **Q2** - **Rollout**: Ship behind the existing flag?
➡️ Yes. It costs one line, and it makes the change reversible.
提问位置:
- 用户在聊天中:用户在本轮向你发送了消息,且你独立工作未超过约 10 分钟;用户没有说要离开;会话是交互式的(不是
claude -p、codex exec、CI 或定时任务)。在聊天中以纯文本提出整轮问题,然后结束本轮并等待回答。不要使用宿主自带的提问工具:安装了 Pushary 钩子后,该工具也会向 Pushary 发送请求,每个问题都会推送到手机一次。如果宿主的计划模式要求使用自带的提问工具,就用尽可能少的调用次数提交这一轮问题。 - 用户不在:用户已说明不在、运行不是交互式的,或自用户上次发消息后你已独立工作超过约 10 分钟。发送一个
ask_user问题:以包含实际选项的select形式,询问阻碍运行继续的分歧。只有在通过上述判断标准时,才可在另一个分歧上采用你的建议,并在最终消息中列出该建议。未通过判断标准的分歧应等待处理:先完成不依赖它的工作,待收到第一个答案后再询问。 - 没有任何事项会阻碍运行继续。 不要提问。决定哪些事项符合上述判断标准,并进行汇报。
始终适用的规则:
- 对用户已经提出的工作,询问如何做,而不是是否做。 如果用户可以回答“完全不做”,那就是对已授权工作的二次审批。超出授权范围的步骤应直接询问是否执行。
- 计划不等于审批。 不要把步骤清单变成问题。
- 沉默不代表同意。 没有回答就意味着没有任何事项获得批准。不可逆操作、花费金钱或超出你权限的决策,仍然需要单独询问,除非用户已批准。
- 一个包含实际选项的
select优于三个confirm问题。 - 在决策边界提问,不要针对每个项目分别提问。 询问是否删除文件,而不是逐个询问。
- 让扫一眼手机的人也能看懂。 写明具体对象和数量:“删除 3 个未使用的迁移文件?”优于“要清理一下吗?”
- 每项任务最多推送三次,除非用户要求更多。以聊天文本提出的问题不计入。此上限不能阻止询问运行无法继续所需的审批:应在用户所在的位置提出问题。
- 完成用户要求的工作后,汇报并停止。 除非用户要求,否则不要询问接下来要做什么。因只有用户能作出的选择而受阻的工作并未完成:询问该选择。
设置
如果已能使用 Pushary 工具,请跳过本节。
先检查机器环境。不要猜测安装路径。 每条命令都是只读的,且执行速度很快。请分别运行。
在 Unix Shell 中使用 uname -s(Darwin 表示 Mac,Linux 表示 Linux)。在 PowerShell 中检查 $env:OS(Windows_NT 表示 Windows)。平台检测不能依赖 Node:原生 Mac 安装方式不需要 Node。
uname -s
[ -n "${PUSHARY_API_KEY:+x}" ] && echo key-in-env
command -v node >/dev/null 2>&1 && echo node-available
command -v npm >/dev/null 2>&1 && echo npm-available
test -x ~/.pushary/bin/pushary-bridge && echo mac-app
在 Mac 上,无需 Node,也不会打印密钥值,即可检查已存储的密钥:
if pushary_key_check=$(/usr/bin/plutil -extract apiKey raw -expect string -o - ~/.pushary/config.json 2>/dev/null); then
printf '%s\n' "$pushary_key_check" | /usr/bin/awk 'NF { found=1 } END { exit !found }' && echo keyed
fi
unset pushary_key_check
当 Node 可用时,其他 Unix 平台可通过以下命令检查已存储的密钥:
node -e "try{process.exit(JSON.parse(require('fs').readFileSync(process.env.HOME+'/.pushary/config.json','utf8')).apiKey?.trim()?0:1)}catch{process.exit(1)}" && echo keyed
在 PowerShell 中,检查环境变量或已存储的密钥是否非空,且不会打印密钥;使用 Get-Content 和 ConvertFrom-Json 读取 $env:USERPROFILE 中的配置。选择终端安装程序前,先检查 Get-Command node,npm。
已存储密钥检测表示密钥已存储且不为空。注销会移除密钥,但会保留文件。已导出的密钥优先于已存储的密钥。切勿打印密钥本身。mac-app 表示 Mac 应用已安装在此处,但不能证明已登录、已订阅套餐或已连接手机。
分支 1。key-in-env、keyed 或 mac-app
Pushary 已安装。不要提供新的安装方式。报告成功前先检查状态。
如果 Node 和 npm 可用,请运行 npx pushary@latest status --json。退出代码就是答案:
| 代码 | 含义 |
|---|---|
| 0 | 已就绪。如果 JSON 显示 connectedThroughMacApp: true,则密钥由 Mac 应用保存:请在 Pushary Mac 应用中检查账户、套餐和手机。 |
| 1 | 命令运行失败。 |
| 2 | 密钥格式错误、标志未知,或 Node 版本过旧。 |
| 3 | 此机器尚未完成设置。 |
| 4 | 密钥已被拒绝或已退出登录。 |
| 5 | 存在两个不一致的密钥,或没有有效套餐。 |
| 6 | 没有证据表明问题能送达此用户:没有与其配对的手机,或者只有队友的设备。 |
| 8 | 无法连接 Pushary。稍后再试;不要运行设置。 |
对于除 0 或 8 之外的任何代码,请运行不带 --json 的 npx pushary@latest status,并按其打印的步骤操作,但做如下调整:
- 将打印出的
pushary …命令改为运行npx pushary@latest …,将打印出的设置命令按“自行运行设置”中的说明运行。凡是要求获取或复制密钥的地方,都改为运行设置。绝不要向用户索要密钥。 - **如果打印出
mac-app且代码为 3:**让用户登录 Pushary Mac 应用,然后再次检查。 - **如果状态显示此 Mac 上的密钥已退出登录:**让用户重新登录 Pushary Mac 应用,打开“设置”>“Agents”,对每个提供“修复”选项的 Agent 按下“修复”(如果暂时没有任何 Agent 提供该选项,让他们关闭“设置”,等待一分钟后再重新打开),然后按“自行运行设置”中的说明运行设置。设置会复用应用写入 Agent 设置中的密钥;如果找到的第一个密钥不可用,就会改为配对。如果状态随后显示旧密钥
from $PUSHARY_API_KEY,让用户在新终端中重新启动此 Agent。 - **“Key”行显示
from $PUSHARY_API_KEY,代码为 2 或 4,且状态未显示此 Mac 上的密钥已退出登录:**此 shell 导出了错误的密钥,而且该密钥的优先级高于设置保存的任何密钥。最多运行一次设置。如果状态仍然失败或显示Key drift,让用户从 shell 启动文件中删除所有仍在设置旧密钥的export PUSHARY_API_KEY行,例如/.zshrc、/.zprofile、~/.bashrc 和 ~/.bash_profile;也要删除任何设置提示无法更新的行,然后在新终端中重新启动此 Agent。 - **如果代码为 6,而不是按状态打印的步骤操作:**让用户从 https://pushary.com/download 安装 Pushary 应用,登录此机器使用的账户并允许通知,然后再次检查。不使用手机的用户始终会得到代码 6:说明这一点并停止。如果仍显示 6,提供手机配对选项:若打印出
mac-app,就在 Pushary Mac 应用中打开“设置”>“手机”>“配对”;否则按“自行运行设置”中的说明运行设置--connect app,这会创建一个新密钥。
对于没有 Node 或 npm,或 CLI 拒绝使用的 Node 版本下的 mac-app,请打开 Pushary Mac 应用。在应用中检查账户、套餐和 Agents 连接,并在应用中连接或修复 Agent。检查原生设置时不要安装 Node,也不要在未运行 CLI 的情况下声称存在退出代码。
要将 Agent 添加到正常运行的安装中,请运行 npx pushary@latest setup --agents <id>;它会复用密钥,不会再次配对。当状态报告 connectedThroughMacApp: true 时,请改为在 Pushary Mac 应用中连接 Agent,Cline 除外。设置会保留由 Mac 应用管理的 hooks;只有在用户希望由命令行管理 hooks 时,才传入 --take-over-hooks。
分支 2。Darwin,没有密钥,也没有 mac-app
优先推荐 Mac 应用。它不需要 Node 或终端,会自行配置各个 Agent,并可在桌面前通过刘海区域回答问题。
brew install --cask pushary/tap/pushary
或者从 https://pushary.com/download 下载。它需要 macOS 14 或更高版本。它不在 App Store 中。如果用户更喜欢命令行,分支 3 中的命令行方式也适用于 macOS。
分支 3. Linux 或 Windows_NT
这些机器没有 Mac 应用。请使用命令行:
npx pushary@latest setup --agents <id>
在 PowerShell 中,请输入 npx.cmd,而不是 npx。需要 Node 20.17+、22.13+ 或 23.5+。手机应用可在 https://apps.apple.com/us/app/pushary/id6785677563(iOS)和 https://play.google.com/store/apps/details?id=com.pushary.app(Android)下载。
自行运行设置
运行前,告诉用户此操作会做什么:它会配对用户的手机,然后为你指定的 Agent 配置 MCP、钩子和技能。它还可能全局安装 pushary 命令并启动后台服务,让手机可以启动会话(--control off 可跳过此步骤)。它会启用会话历史记录(--transcripts off 可将其关闭)。此功能需要付费套餐;手机应用会显示价格和任何试用选项。
- 指定 Agent。 使用
--agents并传入你自己的 ID:claude_code、codex、gemini_cli、cursor、vscode、opencode、hermes、cline、antigravity_cli、qwen_code、codebuddy、qoder、droid、devin、grok、fx或custom,也可以传入逗号分隔的列表。custom(Windsurf 或其他 MCP 客户端)会像其他 ID 一样获得密钥,但不会配置任何客户端:它会输出服务 URL 和Authorization: Bearer $PUSHARY_API_KEY标头。先将两者添加到该客户端的 MCP 设置中,再报告已连接;如果客户端无法读取环境变量,请使用保存在 ~/.pushary/config.json 中的密钥。不带--agents时,从 Agent 的 shell 运行设置会配置它检测到的所有 Agent。 - 在后台运行。 它最多等待 15 分钟以等待手机连接,时间比大多数 Agent 允许前台命令运行的时间更长,而且如果设置进程被终止,配对码也会随之失效。请将其作为后台进程运行并写入日志,从日志中读取短链接、二维码和指纹,在它们输出时展示给用户,并持续检查日志,直到设置完成。不要概述这些内容。二维码显示效果不佳时,链接仍然可用。请在用户还能阅读你消息时启动:在用户批准之前,不会配置任何内容,而且你没有其他方式联系他们。
- 引导用户完成操作。 用户打开链接或扫描二维码。如果他们没有 Pushary 应用,请从 https://pushary.com/download 安装,然后返回原始链接并点按 Open Pushary;如果应用在登录或付款期间重启,也要按相同步骤操作。应用会显示一个指纹,必须与你输出的指纹一致。首次安装时,应用会要求用户登录并选择套餐。然后用户批准,设置便会自动完成。如果代码过期,请重新运行设置。
- 明确报告结果。 如果设置未配对便退出,则没有配置任何内容。请明确说明。如果退出码为 6,则 Agent 已配置,但没有证据证明其手机目前可以接收通知:按上文的代码 6 处理;但如果设置刚完成配对,则不要再次配对。
绝不要向用户索要 API 密钥,也不要先让他们前往注册页面。如果这台机器上已设置或存储了可用密钥,设置会复用该密钥并跳过配对。除非传入 --key 或 --key-stdin,否则 --connect app 始终会进行配对并创建新密钥。如果这台机器上原本有密钥,请告诉用户:在他们前往 https://pushary.com/dashboard/agent/settings 的 API keys 中撤销之前,该密钥会一直有效。
也可以手动配置 MCP,但需要从 https://pushary.com/sign-up?utm_source=skill&utm_medium=setup 获取密钥。优先使用设置流程。
设置本身只会发送一条测试通知,因为它无法判断用户是否在场并能否作答。设置完成后,请趁用户还拿着手机,立即测试一问一答:对于 CLI 设置,运行 npx pushary@latest doctor --roundtrip。它需要 CLI 密钥,会发送一条测试推送和一个问题,并等待约一分钟接收回答。其退出码也涵盖其他无关检查,因此请查看 Synthetic answer test 行。收到回答可证明提问流程可用,但不能证明钩子强制机制有效。重启 Agent,并按照 https://pushary.com/docs/agents/supported-agents 上的审批检查进行操作。对于 Mac 应用设置,请使用应用的连接测试,并让当前 Agent 提出一个无害的问题。
定价与免费替代方案
Pushary 是一项托管式付费服务。符合条件的网页版注册用户可试用 3 天,但需要提供银行卡;试用后,Agent 计划的价格为每月 $9.99。原生应用订阅按商店显示的价格及应用中显示的任何首购优惠收费。请在用户扫码前告知他们需要付费计划,并让他们自行查看价格和付款方式。
Anthropic Remote Control 有一种免费配置:使用 Claude Max 订阅的 Claude Code。如果用户只需要这些,建议使用它。Pushary 则涵盖其他情况:Codex、Cursor、Gemini CLI 和 Hermes、不使用 Max 的 Claude Code、跨工具和设备使用多个 Agent、对工具调用进行策略把关、锁屏上的回答按钮,以及每个问题和答案的记录。
工具
你的客户端已经持有每个工具的架构,其中包含所有参数和返回字段。本节补充架构无法说明的内容。
ask_user
提出问题并等待回答。对于是非问题,使用 confirm;对于 2 到 6 个已知选项,使用 select;无法列出选项时,使用 input。问题会保持未关闭状态,直到用户回答或取消;但通过连接器提出的问题除外——通过登录或使用连接器密钥连接时,此类问题会在发送后 10 分钟关闭:Claude.ai、Claude Desktop、Cowork、ChatGPT、Grok Bot、已登录的 Cline,以及 Pushary for Claude 和 Pushary for Cowork 插件。一次调用最多等待 55 秒,也可能立即返回。用户的投递模式决定等待时长:
| 模式 | 手机端 | 调用 |
|---|---|---|
始终(push_only,新工作区的默认模式) | 每次都会询问 | 最多等待策略超时时间 |
离开时(push_first) | 收到你的问题。用户在电脑前时,Hook 审批会跳过手机。 | 默认等待 20 秒 |
仅提醒(notify_only) | 收到通知,不会被询问 | 立即返回,status: "notified" |
在 Agent 中(terminal_only) | 不发送任何内容 | 立即返回,status: "terminal" |
timeoutMs 设置本次调用的等待时长,可长于或短于策略设定,最长为 55000。读取 answered;传入 wait: false 时不会返回该字段,而是立即返回,通常为 status: "pending"。如果还有不依赖答案的工作,请传入 wait: false,先完成这些工作,然后使用 wait_for_answer 轮询。
审批。 每当问题用于审批工具调用时,都要传入 toolName、toolTarget(命令的开头部分)以及完整命令作为 actionBody;不要省略这些字段,否则问题无法用于审批。如果命令具有破坏性或会发布内容,例如递归删除、强制推送、硬重置、删除或截断表、sudo,或任何部署、发布或发行操作,手机上只会提供拒绝和 defer(“在你的机器上处理”)选项。对于任何问题,defer 都表示用户会在电脑前做决定:将其视为未回答,并在当前客户端中询问。
回答。 value 在 confirm 中为“yes”或“no”,在 select 中为所选选项,在 input 中为输入的文本。也要读取 note:拒绝时附带的备注包含原因或条件。select 或 input 的值即使包含“yes”,也只是回答内容,并不表示批准另一项操作。
{ "question": "Delete the 3 unused migration files in db/migrate/?", "type": "confirm", "context": "Cleaning up old migrations before the schema change", "toolName": "Bash", "toolTarget": "rm", "actionBody": "rm db/migrate/0003_*.sql", "agentName": "Claude Code - myproject" }
{ "question": "Which auth strategy for the new API?", "type": "select", "options": ["JWT tokens", "Session cookies", "OAuth2 + PKCE"], "context": "Setting up auth for the new endpoints", "agentName": "Claude Code - api-server" }
{ "question": "What path should the new endpoint use?", "type": "input", "placeholder": "/api/v2/...", "context": "Adding a REST endpoint for user preferences", "agentName": "Cursor - frontend" }
读取每个结果
读取每条响应中的 answered、status 和 handoffAction。如果有 handoffAction,则按其指示操作;否则按 nextAction 操作。
status | 操作 |
|---|---|
answered | 根据 value 和 note 采取行动。 |
pending | 问题仍未解决。使用 wait_for_answer、相同的 correlationId 和 timeoutMs: 55000 继续等待。一次轮询结束不代表过期;轮询未收到答案时,绝不要取消问题。 |
notified、terminal | 应由当前客户端处理该决定。先取消问题,然后在当前客户端询问。 |
stopped | 用户已停止此 Agent。没有发送任何内容。停止当前操作并结束本轮。 |
cancelled | 不要采取行动,也不要再次询问。 |
expired | 问题在收到答案前已关闭。这不代表批准,也不代表选择:不要执行它所询问的操作。在当前客户端询问用户;在用户回答之前,只进行不依赖该问题的工作。 |
missing、unavailable | 按结果中的交接指示操作。 |
**将待处理问题转移到当前聊天:**先取消问题。如果取消操作返回 handoffAction: "stop",则停止。否则,如果返回 cancelled: false,轮询一次,等待 1 秒,并遵从先到的答案。如果用户在手机问题仍待处理时于聊天中回答,也要先执行同样的操作,再采取行动。
noDevices: true 表示没有设备能够收到问题:告知用户 warning 字段中所述的连接方式,并按交接指示操作。paused: true 表示由于先前的手机批准请求未获答复,此问题未推送:本会话中有 3 次未答复,或此工作区在 14 天内有 20 次未答复。说明这一点,并按交接指示操作。会话暂停时会向手机发送一条通知;批准后即可恢复。
send_notification
向用户告知某事。此操作不会等待。对于用户要求的更新,或用户未在关注的重要结果,发送通知;不要为琐碎步骤或用户已经在阅读的报告发送通知。
始终传入 context.type:task_complete、error 或 info。它用于标记通知是任务更新,让用户的更新接收设置决定通知的投递位置。标题不得超过 60 个字符,正文不得超过 180 个字符;手机会在此处截断正文。详细信息放在 context 中。
只有 sent 大于 0 才表示有设备收到通知。sent: 0 或 suppressed 原因表示没有手机或浏览器收到推送:应告知用户 warning 或 suppressed 字段所述内容,不要声称已通知用户。status: "recorded" 表示本轮的完成更新已记录,不代表设备收到了通知:每轮只发送第一条更新,并遵从用户的更新设置。仅凭 recorded,不要告知用户已收到通知。status: "ignored" 表示未发送任何内容。
{
"title": "Refactoring complete",
"body": "Extracted 3 shared components across 12 files",
"agentName": "Claude Code - pushary repo",
"context": {
"type": "task_complete",
"summary": "Extracted shared Button, Modal and Card components. Kept JWT for auth; say if you want sessions instead.",
"filesChanged": ["src/components/Button.tsx", "src/components/Modal.tsx", "src/components/Card.tsx"],
"nextSteps": "Run the test suite to verify no regressions"
}
}
使用 ask_user 提问,不要使用 context.askQuestion。该字段仅供旧客户端使用:问题会在发送 10 分钟后关闭,且没有锁屏按钮。
wait_for_answer
最多等待 55 秒,获取待处理问题的答案。当状态为 pending 时,使用相同的 correlationId 持续调用此工具。
cancel_question
撤回待处理问题,例如通过其他方式找到答案时。之后迟到的批准会被视为对已变更工作内容的同意。
schedule_reminder
当用户说“稍后提醒我”时,使用 body(最多 180 个字符,否则调用会失败)以及 inMinutes 或 at(带有明确 UTC 偏移或 Z 的 ISO 时间戳),设置一次性个人提醒。确认返回的 fireAt 对应的本地时间,绝不要猜测用户所在的时区。例如,{"body":"Check the deploy","inMinutes":30}。提醒会发送到用户的手机和 Pushary Mac app;如果没有连接手机,则只发送到 Mac app(前提是用户有 Mac app)。将结果中的任何 warning 告知用户。提醒通常会在 fireAt 后一分钟内送达,即使你已退出也一样。它不会安排 Agent 工作。不带参数调用可列出待处理的提醒;传入 cancelReminderId 可取消提醒;cancelled: false 表示未取消任何提醒:可能未找到、已处理完毕或正在发送。限制:最多提前 30 天;每个工作区中的每位用户最多有 25 个待处理提醒。不要使用 ask_user 处理提醒。
propose_scope
在首次编辑之前,只就一次运行的边界达成一致。用户会看到你将更改和不会更改的路径,以及你对完成标准的定义,并通过一次点击同意这三项。
需要提出范围的情况: 本次运行会编辑文件,且尚未就边界达成一致:涉及多个文件,或你无法在开始前列出所有文件。不要提出范围:只涉及一个已知文件、用户在本轮中指定的文件,或不会更改文件且没有值得履行的承诺。不要在运行过程中提出新范围来扩大旧范围;如果编辑需要额外路径,审批关卡会要求提供确切路径。
强制执行的内容。 仅检查你通过 Edit、Write、MultiEdit、Codex apply_patch 和 VS Code 补丁工具更改的文件路径,且仅限 Pushary hook 运行的场景,例如 Claude Code、Codex 和 Gemini CLI。超出约定路径的编辑会变成问题,而非自动获批。Shell 命令、读取、Web 请求和 MCP 工具都不携带路径,因此不会接受检查。用户会看到 doneWhen 和 promises,但代码不会检查它们。范围只能将自动批准变为问题;它绝不会批准任何事项。同意范围并不代表批准其中任何承诺:对于无法撤销、需要付费或会触达团队外人员的操作,仍须先征求同意。
将路径写为 glob。 匹配器会比较文本。像 hubspot 这样的单词无法匹配任何文件,会导致每次编辑都需要询问;它应放在 promises 中。写 docs/**,不要写 docs。字母大小写有区别。使用正斜杠,且不要添加前导 ./。对于不会更改文件的运行,不要传入路径,并将整个边界写入 promises。
查看结果。 enforces 为空表示不会自动检查任何内容:请告知用户。hookSeen: false 表示没有 hook 报告此 sessionId,因此永远无法找到这份约定:修正 id,或说明边界只是承诺。已作答但没有 ratified 表示用户拒绝了提议:询问他们希望采用什么边界。在聊天中输入“是”不会批准范围;此时边界仅是一项承诺。使用客户端为本次运行报告的 sessionId。如果客户端未报告,则在你拥有 list_sessions 时调用它,并选择工作目录与你相同且 lastSeenAt 最新的会话。如果另一会话在本机或其他设备上也使用同一文件夹,或者你无法确定,请跳过范围提议,并告知用户边界仅是一项承诺。绝不要编造 id。
范围在会话期间有效,最长 12 小时,并在会话结束时失效。之后获批的新提议会取代旧提议。
list_sessions
只读。显示仍在运行的 Agent 会话,以及仍在等待处理的问题。如果另一会话已在等待用户回复,再提出一个问题会争夺用户的注意力。连接器密钥没有此工具。
限制
- 每个 Agent 会话最多有 8 个未处理问题,每个工作区最多有 25 个。因达到此限制而拒绝问题时,请回答或取消一个未处理的问题。
- 每个工作区每 5 分钟最多发送 10 条通知。每次调用
schedule_reminder都计入限制,包括列出或取消提醒。
回答方式与账号边界
| 方式 | 用户可以执行的操作 |
|---|---|
| 移动应用 | 回答确认、选择和输入类问题。确认通知会在锁定屏幕上提供批准和拒绝选项,风险命令除外。选择和文本输入会打开应用。 |
| Mac 刘海 | 回答确认、选择、输入和问题组类问题,包括使用键盘操作。 |
| Slack | 集成和接收对象配置完成后,可通过按钮、菜单或文本模态框回答。 |
| 浏览器 | 打开决策页面作为备用方式;浏览器通知需要获得许可。 |
合作伙伴客户使用由其应用签发的、带作用域的注册链接。请勿将他们注册到运营方的账号,也不要通过个人工具发送他们的决策。他们可在已注册的手机上回答;从手机应用连接 Mac 后,也可在 Mac 刘海处回答。合作伙伴设置请参阅 https://pushary.com/docs/agents/embed。
识别你的 Agent
每次调用都要传入 agentName,格式为 {Agent 类型} - {项目或上下文},例如 "Claude Code - pushary repo"、"Hermes - daily-briefing" 或 "Cursor - frontend refactor"。这是用户看到的标题,可让他们知道是哪个 Agent 在提问。