后端与接口
为 Cyrus 配置公网 webhook 端点:通过…
当 Cyrus 需要接收 Linear、Slack、GitHub 等 webhook 时,配置 `CYRUS_BASE_URL` 并选择公网暴露方式(ngrok、Cloudflare Tunnel 或自有 URL)。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
为 Cyrus 配置公网 webhook特定
解决思路
- 禁止使用 Read、Edit、Write 工具操作 `~/.cyrus/.env` 或 `~/.cyrus/` 内任何文件;只能通过 Bash 命令(如 `grep`、`printf >>`)与环境文件交互,避免 secrets 进入对话上下文。
- 运行 `grep -E '^CYRUS_BASE_URL=' ~/.cyrus/.env 2>/dev/null` 检查是否已配置 `CYRUS_BASE_URL`。
- 如果 `CYRUS_BASE_URL` 已设置,告知用户:`Webhook endpoint already configured: <value>`;若要重新配置,提示从 `~/.cyrus/.env` 移除 `CYRUS_BASE_URL` 后重新运行本技能。
- 已配置时跳转到 Step 4,仅在缺失时写入端口/webhooks 配置。
- 询问用户如何将 Cyrus 暴露到互联网以接收 webhooks,并提供三个选项:1. ngrok(推荐,免费账号包含一个静态域名,重启后仍持久);2. Cloudflare Tunnel(永久,需要 Cloudflare 账号);3. Own URL(已有公网 URL/域名)。
- 不要告诉用户 ngrok 免费静态域名是付费功能或 URL 会在重启后变化;每个免费 ngrok 账号在 https://dashboard.ngrok.com/domains 可获取一个静态域名。
- 若选择 ngrok:运行 `which ngrok` 检查是否已安装。
- 若未安装 ngrok:macOS 运行 `brew install ngrok`;Linux 运行 `curl -sSL https://ngrok-agent.s3.amazonaws.com/ngrok-v3-stable-linux-amd64.tgz | sudo tar xvz -C /usr/local/bin`。
- ngrok 域名设置指引:让用户注册或登录 https://dashboard.ngrok.com,访问 https://dashboard.ngrok.com/domains 复制免费静态域名,再访问 https://dashboard.ngrok.com/get-started/your-authtoken 复制 authtoken。
- 要求用户提供 ngrok 域名和 ngrok authtoken。
- ngrok authtoken 是 secret,必须使用 clipboard-to-file 命令处理。
- 运行 `mkdir -p ~/.config/ngrok`。
- 写入 `~/.config/ngrok/ngrok.yml`,若已存在则合并;配置应包含 `version: 3`、`agent.authtoken: <token>`、`endpoints` 下 `name: cyrus`、`url: <domain>`、`upstream.url: 3456`。
- macOS 写入 ngrok authtoken:用户复制 authtoken 后运行 `NGROK_TOKEN=$(pbpaste) && cat > ~/.config/ngrok/ngrok.yml << EOF version: 3 agent: authtoken: $NGROK_TOKEN endpoints: - name: cyrus url: <domain> upstream: url: 3456 EOF`。
- 通用兜底写入 ngrok authtoken:运行 `read -s -p "Paste your ngrok authtoken: " NGROK_TOKEN && cat > ~/.config/ngrok/ngrok.yml << EOF version: 3 agent: authtoken: $NGROK_TOKEN endpoints: - name: cyrus url: <domain> upstream: url: 3456 EOF echo " ✓ Saved"`。
- 写入 `CYRUS_BASE_URL`:运行 `printf 'CYRUS_BASE_URL=https://%s\n' "<domain>" >> ~/.cyrus/.env`,其中 `<domain>` 是用户提供的 ngrok 域名(例如 `your-name-here.ngrok-free.app`)。
- 告知用户启动 ngrok:运行 `ngrok start cyrus`,并在启动 Cyrus 前于单独终端中运行。
- 若选择 Cloudflare Tunnel:要求用户提供 Cloudflare Tunnel token 和 tunnel hostname(例如 `cyrus.yourdomain.com`)。
- Cloudflare token 是 secret,使用 clipboard-to-env;macOS 运行 `printf 'CLOUDFLARE_TOKEN=%s\n' "$(pbpaste)" >> ~/.cyrus/.env`。
- Cloudflare token 通用兜底:运行 `read -s -p "Paste your Cloudflare token: " val && printf 'CLOUDFLARE_TOKEN=%s\n' "$val" >> ~/.cyrus/.env && echo " ✓ Saved"`。
- 写入 Cloudflare base URL(非 secret,可直接写):运行 `printf 'CYRUS_BASE_URL=https://<hostname>\n' >> ~/.cyrus/.env`。
- 若选择 Own URL:要求用户提供 URL,并验证其以 `https://` 开头。
- 写入自有 URL:运行 `printf 'CYRUS_BASE_URL=%s\n' "<url>" >> ~/.cyrus/.env`。
- Step 4 确保 `~/.cyrus/.env` 中以下配置存在,仅在缺失时添加:`grep -q '^CYRUS_SERVER_PORT=' ~/.cyrus/.env 2>/dev/null || printf 'CYRUS_SERVER_PORT=3456\n' >> ~/.cyrus/.env`。
- 确保 `LINEAR_DIRECT_WEBHOOKS`:`grep -q '^LINEAR_DIRECT_WEBHOOKS=' ~/.cyrus/.env 2>/dev/null || printf 'LINEAR_DIRECT_WEBHOOKS=true\n' >> ~/.cyrus/.env`;该值启用直接 Linear webhook 签名验证。
- 确保 `CYRUS_HOST_EXTERNAL`:`grep -q '^CYRUS_HOST_EXTERNAL=' ~/.cyrus/.env 2>/dev/null || printf 'CYRUS_HOST_EXTERNAL=true\n' >> ~/.cyrus/.env`;该值启用直接 Slack 和 GitHub webhook 签名验证。
- 说明 `LINEAR_DIRECT_WEBHOOKS=true` 和 `CYRUS_HOST_EXTERNAL=true` 对自托管是必需的,因为 webhooks 直接来自服务而非经 CYHOST 转发。
- 完成后输出:`✓ Webhook endpoint configured: <CYRUS_BASE_URL>`、`✓ Server port: 3456`、`✓ Direct webhooks: enabled`。
适用边界 · 注意事项
- 没有 Cyrus 实例或不需要接收 Linear/Slack/GitHub webhooks 时。
- 无法或不愿把 Cyrus 服务暴露到公网,且没有 ngrok、Cloudflare Tunnel 或自有 HTTPS URL 时。
- 已设置 `CYRUS_BASE_URL` 且不想重新配置时(应先移除该变量或跳过本技能,仅执行 Step 4 补齐缺失配置)。