Communitygithub.com

wegoft/bellwire

将实时项目状态和AI智能体事件推送到iPhone原生的Bellwire卡片和通知中。

bellwire 是什么?

Bellwire 是一个连接仓库(repository)状态与 AI 智能体事件到用户 iPhone 的原生卡片和通知的桥梁。它帮助开发者将部署、构建、测试等关键事件以私有或托管模式,通过安全的直连或托管 API,实时推送到用户的 iOS 设备上。该技能支持 Claude Code、Cursor、Codex 等 AI 编码工具,通过解析仓库状态和事件,自动创建和管理 Bellwire 项目、Surface(卡片)和 Inbox(收件箱)事件。其核心优势在于提供了一种原生的、低延迟的通知体验,且默认采用私有模式,仅传输“唤醒”信号,具体内容由用户自己的 HTTPS 服务直接提供,从而确保敏感数据不会进入 Bellwire 云存储。对于需要持久化事件历史的场景,用户可以选择托管模式。此外,该技能还提供了详细的集成指南、命令参考、故障排除流程以及生产验证步骤,确保开发者能够可靠地将 Bellwire 集成到现有的工作流中。

兼容平台~Claude Code✓Codex CLI~Cursor
npx skills add wegoft/bellwire

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

bellwire 是做什么的?

将仓库状态和事件连接到用户的 Bellwire 卡片、收件箱和 iPhone。新项目默认使用私有模式:Bellwire 仅传输一个不透明的唤醒信号,而手机直接从用户的 HTTPS 服务获取内容。托管存储是可选的,并且需要在 App 中获得批准。

工作流程

  1. 检查仓库、其密钥管理约定、测试以及应触发事件的确切成功或失败状态。

  2. 仅澄清代码无法回答的产品决策:通知频率、敏感值,以及是否需要高优先级中断。

  3. 确保 BELLWIRE_AGENT_TOKEN 在跟踪文件之外可用。如果缺失,请询问用户 iOS App 中显示的六位代码,然后运行:

    bellwire_secret_dir="$(mktemp -d)"
    node <skill-dir>/scripts/bellwire.mjs bind \
      --code 123456 \
      --name "Mac上的Codex" \
      --secret-output "$bellwire_secret_dir/agent-token"
    

    CLI 会以模式 0600 创建文件,并且永远不会打印 Token。将其导入用户批准的密钥存储中而不显示它,然后删除临时文件。切勿提交它。

  4. 运行 list-projects,然后创建或复用 Bellwire 项目。在创建另一个项目之前搜索现有配置。切勿仅仅为了更改投递模式而创建第二个项目。

  5. 除非用户明确希望 Bellwire Cloud 存储事件、收件箱和 Surface 内容,否则保持项目为私有:

    • 私有:实现签名的 Direct v2 通知、收件箱和 Surfaces 端点;将设备密钥、一次性随机数、不透明引用发件箱以及 24 小时引用过期时间持久化到用户的真实数据库中。阅读 direct-connections.md。
    • 托管:使用 request-mode-change 请求更改;等待已登录用户在 Bellwire 中批准。然后创建托管模式下的模式、Surfaces 和摄取令牌。
  6. 对于私有模式的运行时投递,创建一个仅用于唤醒的令牌,将其存储在源应用的真实密钥管理器中,并在源事务和发件箱记录提交后尽最大努力调用 private-wakes。Bellwire 必须永远不会收到标题、正文、数据、Logo URL、项目名称或服务主机名。

  7. 选择合适的显示原语:

    • Surface:原地更新的当前状态。阅读 surfaces.md。
    • Inbox 事件:持久化历史记录、完成、失败、恢复或决策边界。在私有模式下,它保留在用户的服务中;在托管模式下使用 event-spec.md。
  8. 使用稳定的 Surface 键和不透明的随机引用。为同一唤醒或托管写入的重试复用一个稳定的幂等键。

  9. 修改最可靠的触发点。仅在底层业务操作提交后发送。

    • 当应用程序拥有业务操作时,首选直接的后提交 Bellwire 调用。
    • 当支付、商务、部署或自动化提供商是数据源时,阅读 webhooks.md 并添加特定于该提供商的 Webhook 适配器。
  10. 对签名、时间戳、未知密钥、篡改目标和原子随机数重放运行单元测试;然后运行 conformance-direct.mjs。如果数据库无法原子性地消耗随机数,请停止并解释安全障碍。

  11. 运行仓库现有的测试以及一个重点触发测试。切勿为了通过 Bellwire 而削弱业务测试。

  12. 通过仓库真实的配置来源持久化并部署源端适配器及其密钥。

  13. 完成一个真实的源操作,并使用 production-verification.md 验证发件箱、唤醒接受、投递、已签名的手机获取以及显示结果。手动唤醒不算生产验证。

集成状态

在进度和最终报告中使用以下精确界限:

  • 已配置: Bellwire 项目、模式、令牌、Surface 或测试事件已存在。这不算是生产集成。
  • 已集成,等待生产验证: 源端适配器代码、运行时密钥、重点测试和部署已就绪,但没有真实的源操作完成整个路径。
  • 生产已验证: 一个真实的业务操作创建了预期的事件或 Surface,已检查投递状态,并且任何声称的设备展示已得到用户确认。

切勿将 send-test、手动更新的 Surface 或密钥创建描述为实际的生产集成。

命令

将 scripts/bellwire.mjs 用于 API 操作。它默认使用官方托管的 API,并接受 BELLWIRE_API_URL 用于自托管安装。

bellwire_secret_dir="$(mktemp -d)"
node <skill-dir>/scripts/bellwire.mjs list-projects
node <skill-dir>/scripts/bellwire.mjs create-project --name "VideoSays" --logo-url "https://videosays.com/logo.png"
node <skill-dir>/scripts/bellwire.mjs create-wake-token --project <id> --name production --secret-output "$bellwire_secret_dir/wake-token"
node <skill-dir>/scripts/bellwire.mjs generate-reference
node <skill-dir>/scripts/bellwire.mjs send-wake --project <id> --reference <opaque-ref> --idempotency-key <stable-key>
node <skill-dir>/scripts/bellwire.mjs request-mode-change --project <id> --to hosted
node <skill-dir>/scripts/bellwire.mjs update-project --project <id> --logo-url "https://cdn.example.com/logo.png"
node <skill-dir>/scripts/bellwire.mjs set-project-order --project <id> --order 10
node <skill-dir>/scripts/bellwire.mjs delete-project --project <id>
node <skill-dir>/scripts/bellwire.mjs create-schema --project <id> --file event-spec.json
node <skill-dir>/scripts/bellwire.mjs create-token --project <id> --name production --secret-output "$bellwire_secret_dir/ingest-token"
node <skill-dir>/scripts/bellwire.mjs upsert-surface --project <id> --key prod-api --file surface.json
node <skill-dir>/scripts/bellwire.mjs list-surfaces --project <id>
node <skill-dir>/scripts/bellwire.mjs list-direct-recoveries
node <skill-dir>/scripts/bellwire.mjs set-surface-order --project <id> --key prod-api --order 20
node <skill-dir>/scripts/bellwire.mjs send-test --project <id> --file test-event.json
node <skill-dir>/scripts/bellwire.mjs event --event <event-id>
node <skill-dir>/scripts/bellwire.mjs health --project <id>
node <skill-dir>/scripts/bellwire.mjs publish-direct-connection \
  --device-key-id <id> \
  --agreement-public-key <base64> \
  --file direct-connection.json
node <skill-dir>/scripts/conformance-direct.mjs \
  --manifest direct-connection.json \
  --device-key-id <id> \
  --reference <known-test-reference>

运行 node <skill-dir>/scripts/bellwire.mjs --help 查看验证、撤销、删除和加密命令。返回密钥的命令需要 --secret-output;切勿将 Token 读取到聊天或命令输出中。

delete-project 是永久性的,并将级联删除项目的模式、令牌、事件、投递和实时 Surfaces。在运行之前,请确认确切的项目 ID 并要求明确的用户意图。

对于机器可读的非密钥输出,使用 --json。当添加另一个操作或诊断错误响应时,请阅读 api.md。

适配器路由

  • 阅读 adapters.md 了解 Node.js、Cloudflare Worker、Shell 和 GitHub Actions 的模式。
  • 在更新 Bellwire 之前,当收到 Stripe 之类的支付事件或任何第三方回调时,请阅读 webhooks.md。
  • 优先使用项目现有的 HTTP 客户端。不要为单个请求添加 SDK 依赖。
  • 将事件发送视为有界的副作用:设置超时、避免记录负载,并明确决定通知失败是否会影响业务操作。默认在业务操作成功后尽最大努力发送。
  • 保持令牌值不出现在生成的差异、测试快照、CI 日志和错误遥测中。

私有模式规则

  • 为每个引用生成至少 128 个随机位,并将其编码为 22–200 个 URL 安全字符。切勿从订单、电子邮件、任务、客户或时间戳中派生它。
  • 在发送唤醒之前,将通知详细信息写入数据库支持的发件箱。引用最多在 24 小时后过期。
  • 唤醒调用是有限且有界的,在提交后尽最大努力。不要因为 Bellwire 不可用而回滚真实的业务操作。
  • MONTHLY_SIGNAL_LIMIT_REACHED 是终结性的,直到返回的 UTC 重置时间或升级。不要循环或重试它。
  • 私有详细信息与收件箱响应来自用户的服务,可能会在手机上缓存最多 30 天;Bellwire Cloud 永远不会收到它们。

托管事件规则

  • 使用小写点分割名称,例如 payment.success、deployment.failed 或 agent.waiting。
  • 仅包含收件箱、通知、深层链接或诊断所需的字段。
  • 切勿在通知模板中引用敏感字段;API 会拒绝它。
  • 使用订单 ID、部署 ID、任务 ID 或运行 ID 作为托管模式的幂等键。不要将这些标识符暴露为私有引用。
  • 避免高频率的进度事件。优先选择完成、失败、恢复和需要决策的边界。
  • 在请求 priority: high 之前,请询问用户明确的批准。

Surface 规则

  • 复用有意义的稳定键,例如 sales-today、prod-api 或 nightly-backup。
  • 在常规更新期间保留分配的 displayOrder。仅当用户明确要求重新排序卡片时才更改它。
  • 发送可供显示的值。例如,在源系统中计算收入并发送 ¥2,430;Bellwire 不会从原始事件中推断业务聚合。
  • 对于私有或客户衍生的指标,首选已签名的 Bellwire Direct 端点,这样卡片负载就不会进入 Bellwire 存储。
  • 选择一种支持的原生类型。切勿嵌入 HTML、JavaScript、Swift、CSS 或任意渲染指令。
  • 对于频繁的进度和指标更新,优先使用 Surface;避免淹没事件收件箱。
  • 仅当目的地是预期的并且对用户安全时,才使用 open_url 操作。
  • 项目 Logo 必须是大小不超过 5 MB 的公共 HTTPS 图片。Bellwire 会在原生头像和扩展的富通知中使用它们,如果图片缺失或无法下载,则会回退到项目首字母标志。

验证和恢复

如果设置失败,请阅读 troubleshooting.md。按此顺序检查:

  1. API 可达性和管理令牌的范围。
  2. 项目 ID 和活动模式版本。
  3. 密钥在实际运行时中的可用性。
  4. 负载类型和必填字段。
  5. 稳定的 Idempotency-Key 行为。
  6. 源适配器在部署版本中的存在以及真实的源操作。
  7. 事件详细信息、Surface 状态和投递状态。
  8. iOS 通知权限、设备注册以及沙箱与生产 APNs 环境。

切勿旋转、撤销或替换正在工作的令牌,除非用户提出要求或怀疑有泄露风险。

相关技能