cyrus-setup-endpoint

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese
CRITICAL: Never use
Read
,
Edit
, or
Write
tools on
~/.cyrus/.env
or any file inside
~/.cyrus/
. Use only
Bash
commands (
grep
,
printf >>
, etc.) to interact with env files — secrets must never be read into the conversation context.
重要提示:永远不要对
~/.cyrus/.env
~/.cyrus/
目录下的任何文件使用
Read
Edit
Write
工具。仅使用
Bash
命令(
grep
printf >>
等)操作环境变量文件——密钥绝对不能被读取到对话上下文中。

Setup Endpoint

配置端点

Configures a public URL so Linear (and other integrations) can send webhooks to your Cyrus instance.
配置公共URL,以便Linear(以及其他集成服务)可以向你的Cyrus实例发送webhook。

Step 1: Check Existing Configuration

步骤1:检查现有配置

bash
grep -E '^CYRUS_BASE_URL=' ~/.cyrus/.env 2>/dev/null
If
CYRUS_BASE_URL
is already set, inform the user:
Webhook endpoint already configured:
<value>
To reconfigure, remove
CYRUS_BASE_URL
from
~/.cyrus/.env
and re-run this skill.
Skip to Step 4 (write port/webhooks if missing).
bash
grep -E '^CYRUS_BASE_URL=' ~/.cyrus/.env 2>/dev/null
如果
CYRUS_BASE_URL
已存在,请告知用户:
Webhook端点已配置:
<value>
如需重新配置,请从
~/.cyrus/.env
中删除
CYRUS_BASE_URL
后重新运行本技能。
跳转到步骤4(若缺失端口/webhook相关配置则补充写入)。

Step 2: Choose Endpoint Method

步骤2:选择端点配置方式

Ask the user:
How will you expose Cyrus to the internet for webhooks?
  1. ngrok (recommended — every free account includes one static domain that persists across restarts)
  2. Cloudflare Tunnel (permanent, requires Cloudflare account)
  3. Own URL (you already have a public URL/domain)
Important: ngrok's free tier includes a permanent static domain — do NOT tell the user this is a paid feature or that URLs change on restart. Every free ngrok account gets one static domain at https://dashboard.ngrok.com/domains.
询问用户:
你将通过哪种方式将Cyrus暴露到公网以接收webhook?
  1. ngrok(推荐——所有免费账户都包含1个静态域名,重启后不会失效)
  2. Cloudflare Tunnel(永久可用,需要Cloudflare账户)
  3. 自有URL(你已经拥有公共URL/域名)
注意:ngrok免费版包含永久静态域名——请勿告知用户这是付费功能,或URL会在重启后变化。所有免费ngrok账户都可以在https://dashboard.ngrok.com/domains获取1个静态域名。

Step 3: Configure Endpoint

步骤3:配置端点

Option 1: ngrok

选项1:ngrok

3a. Check if ngrok is installed

3a. 检查ngrok是否已安装

bash
which ngrok
If not installed, provide install instructions:
macOS:
bash
brew install ngrok
Linux:
bash
curl -sSL https://ngrok-agent.s3.amazonaws.com/ngrok-v3-stable-linux-amd64.tgz | sudo tar xvz -C /usr/local/bin
bash
which ngrok
如果未安装,提供安装说明:
macOS:
bash
brew install ngrok
Linux:
bash
curl -sSL https://ngrok-agent.s3.amazonaws.com/ngrok-v3-stable-linux-amd64.tgz | sudo tar xvz -C /usr/local/bin

3b. Guide ngrok domain setup

3b. 指导ngrok域名配置

Instruct the user:
ngrok provides a free static domain so your URL doesn't change between restarts.
  1. Sign up or log in at https://dashboard.ngrok.com
  2. Go to https://dashboard.ngrok.com/domains
  3. Copy your free static domain (e.g.,
    your-name-here.ngrok-free.app
    )
  4. Go to https://dashboard.ngrok.com/get-started/your-authtoken and copy your authtoken
Ask the user to provide:
  • Their ngrok domain
  • Their ngrok authtoken
CRITICAL: The authtoken is a secret. Use clipboard-to-file commands.
告知用户:
ngrok提供免费静态域名,因此你的URL不会在重启后发生变化。
  1. 访问https://dashboard.ngrok.com注册或登录账户
  2. 打开https://dashboard.ngrok.com/domains页面
  3. 复制你的免费静态域名(例如:
    your-name-here.ngrok-free.app
  4. 打开https://dashboard.ngrok.com/get-started/your-authtoken页面复制你的authtoken
请用户提供:
  • 他们的ngrok域名
  • 他们的ngrok authtoken
重要提示:authtoken属于密钥,请使用剪贴板写入文件的命令进行操作。

3c. Write ngrok configuration

3c. 写入ngrok配置

Write the ngrok config so it can be started with
ngrok start cyrus
:
bash
mkdir -p ~/.config/ngrok
Then write
~/.config/ngrok/ngrok.yml
(merge with existing if present):
yaml
version: 3
agent:
  authtoken: <token>
endpoints:
  - name: cyrus
    url: <domain>
    upstream:
      url: 3456
For the authtoken, use a clipboard-to-file approach:
macOS:
bash
undefined
写入ngrok配置,以便可以通过
ngrok start cyrus
启动:
bash
mkdir -p ~/.config/ngrok
然后写入
~/.config/ngrok/ngrok.yml
(如果文件已存在则合并配置):
yaml
version: 3
agent:
  authtoken: <token>
endpoints:
  - name: cyrus
    url: <domain>
    upstream:
      url: 3456
对于authtoken,使用剪贴板写入文件的方式:
macOS:
bash
undefined

User copies authtoken, then runs:

用户复制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

**Universal fallback:**
```bash
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"
NGROK_TOKEN=$(pbpaste) && cat > ~/.config/ngrok/ngrok.yml << EOF version: 3 agent: authtoken: $NGROK_TOKEN endpoints:
  • name: cyrus url: <domain> upstream: url: 3456 EOF

**通用方案:**
```bash
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"

3d. Write CYRUS_BASE_URL

3d. 写入CYRUS_BASE_URL

bash
printf 'CYRUS_BASE_URL=https://%s\n' "<domain>" >> ~/.cyrus/.env
Where
<domain>
is the ngrok domain the user provided (e.g.,
your-name-here.ngrok-free.app
).
Inform the user:
To start ngrok, run:
ngrok start cyrus
Run this in a separate terminal before starting Cyrus.
bash
printf 'CYRUS_BASE_URL=https://%s\n' "<domain>" >> ~/.cyrus/.env
其中
<domain>
是用户提供的ngrok域名(例如:
your-name-here.ngrok-free.app
)。
告知用户:
如需启动ngrok,请运行:
ngrok start cyrus
请在启动Cyrus前,在独立的终端中运行该命令。

Option 2: Cloudflare Tunnel

选项2:Cloudflare Tunnel

Ask the user for:
  • Their Cloudflare Tunnel token
  • Their tunnel hostname (e.g.,
    cyrus.yourdomain.com
    )
Token is a secret — use clipboard-to-env:
macOS:
bash
printf 'CLOUDFLARE_TOKEN=%s\n' "$(pbpaste)" >> ~/.cyrus/.env
Universal fallback:
bash
read -s -p "Paste your Cloudflare token: " val && printf 'CLOUDFLARE_TOKEN=%s\n' "$val" >> ~/.cyrus/.env && echo " ✓ Saved"
Then write the base URL (not a secret — agent can write directly):
bash
printf 'CYRUS_BASE_URL=https://<hostname>\n' >> ~/.cyrus/.env
请用户提供:
  • 他们的Cloudflare Tunnel token
  • 他们的隧道主机名(例如:
    cyrus.yourdomain.com
Token属于密钥——请使用剪贴板写入环境变量的方式:
macOS:
bash
printf 'CLOUDFLARE_TOKEN=%s\n' "$(pbpaste)" >> ~/.cyrus/.env
通用方案:
bash
read -s -p "Paste your Cloudflare token: " val && printf 'CLOUDFLARE_TOKEN=%s\n' "$val" >> ~/.cyrus/.env && echo " ✓ Saved"
然后写入基础URL(不属于密钥,可直接写入):
bash
printf 'CYRUS_BASE_URL=https://<hostname>\n' >> ~/.cyrus/.env

Option 3: Own URL

选项3:自有URL

Ask the user for their URL. Validate it starts with
https://
.
bash
printf 'CYRUS_BASE_URL=%s\n' "<url>" >> ~/.cyrus/.env
请用户提供他们的URL,校验其是否以
https://
开头。
bash
printf 'CYRUS_BASE_URL=%s\n' "<url>" >> ~/.cyrus/.env

Step 4: Write Common Config

步骤4:写入通用配置

Ensure these are present in
~/.cyrus/.env
(add only if missing):
bash
grep -q '^CYRUS_SERVER_PORT=' ~/.cyrus/.env 2>/dev/null || printf 'CYRUS_SERVER_PORT=3456\n' >> ~/.cyrus/.env
grep -q '^LINEAR_DIRECT_WEBHOOKS=' ~/.cyrus/.env 2>/dev/null || printf 'LINEAR_DIRECT_WEBHOOKS=true\n' >> ~/.cyrus/.env
grep -q '^CYRUS_HOST_EXTERNAL=' ~/.cyrus/.env 2>/dev/null || printf 'CYRUS_HOST_EXTERNAL=true\n' >> ~/.cyrus/.env
LINEAR_DIRECT_WEBHOOKS=true
enables direct Linear webhook signature verification.
CYRUS_HOST_EXTERNAL=true
enables direct Slack and GitHub webhook signature verification. Both are required for self-hosted setups where webhooks come directly from the services (not forwarded through CYHOST).
确保
~/.cyrus/.env
中存在以下配置(仅在缺失时添加):
bash
grep -q '^CYRUS_SERVER_PORT=' ~/.cyrus/.env 2>/dev/null || printf 'CYRUS_SERVER_PORT=3456\n' >> ~/.cyrus/.env
grep -q '^LINEAR_DIRECT_WEBHOOKS=' ~/.cyrus/.env 2>/dev/null || printf 'LINEAR_DIRECT_WEBHOOKS=true\n' >> ~/.cyrus/.env
grep -q '^CYRUS_HOST_EXTERNAL=' ~/.cyrus/.env 2>/dev/null || printf 'CYRUS_HOST_EXTERNAL=true\n' >> ~/.cyrus/.env
LINEAR_DIRECT_WEBHOOKS=true
用于开启Linear webhook签名直接校验。
CYRUS_HOST_EXTERNAL=true
用于开启Slack和GitHub webhook签名直接校验。对于webhook直接来自对应服务(而非通过CYHOST转发)的自托管部署场景,这两项配置都是必填的。

Completion

配置完成

✓ Webhook endpoint configured:
<CYRUS_BASE_URL>
✓ Server port: 3456 ✓ Direct webhooks: enabled
✓ Webhook端点已配置:
<CYRUS_BASE_URL>
✓ 服务端口:3456 ✓ 直接webhook:已开启