/cyrus-setup-launch
Print a summary of the Cyrus setup and offer to start the agent.
$ npx -y skills add cyrusagents/cyrus --skill cyrus-setup-launch --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/cyrus-setup-launch
Context preview
The summary Claude sees to decide when to auto-load this skill.
Print a summary of the Cyrus setup and offer to start the agent.
SKILL.md
cyrus-setup-launch.SKILL.mdname: cyrus-setup-launch
description: Print a summary of the Cyrus setup and offer to start the agent.
**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.**
Setup Launch
Prints a summary of the completed setup and offers to start Cyrus.
Step 1: Gather Configuration
Read current state:
# Base URL
grep '^CYRUS_BASE_URL=' ~/.cyrus/.env 2>/dev/null | cut -d= -f2-
# Linear
grep -c '^LINEAR_CLIENT_ID=' ~/.cyrus/.env 2>/dev/null
# GitHub
gh auth status 2>&1 | head -1
# Slack
grep -c '^SLACK_BOT_TOKEN=' ~/.cyrus/.env 2>/dev/null
# Repositories
cat ~/.cyrus/config.json 2>/dev/null
# Claude auth
grep -c -E '^(ANTHROPIC_API_KEY|CLAUDE_CODE_OAUTH_TOKEN)=' ~/.cyrus/.env 2>/dev/null
Step 2: Print Summary
Print a formatted summary:
┌─────────────────────────────────────┐
│ Cyrus Setup Complete │
├─────────────────────────────────────┤
│ │
│ Endpoint: https://your-url.com │
│ Claude: ✓ API key configured │
│ │
│ Surfaces: │
│ Linear: ✓ Workspace connected │
│ GitHub: ✓ CLI authenticated │
│ Slack: ✓ Bot configured │
│ │
│ Repositories: │
│ • yourorg/yourrepo │
│ • yourorg/another-repo │
│ │
└─────────────────────────────────────┘
Use ✓ for configured items and ✗ for skipped/unconfigured items.
Step 3: Make Cyrus Persistent
Cyrus needs to run as a background process so it stays alive and restarts after reboots. **Use the `AskUserQuestion` tool if available** to ask:
> **How would you like to keep Cyrus running in the background?** > > 1. **pm2** (recommended) — Node.js process manager. Simple to set up, auto-restarts on crash, log management built in. Best for most users. > 2. **systemd** (Linux only) — OS-level service manager. Starts on boot automatically, managed with `systemctl`. Best for dedicated Linux servers. > 3. **Neither** — just run `cyrus` in the foreground for now (you can set up persistence later).
Option 1: pm2
The agent should run all of these commands directly:
1. Check if pm2 is installed (`which pm2`). If not, install it (`npm install -g pm2`). 2. Start Cyrus: `pm2 start cyrus --name cyrus` 3. Save the process list: `pm2 save` 4. Run `pm2 startup` — this prints a system-specific command. The agent should run that output command too (it typically requires `sudo`).
After setup, inform the user of useful commands:
- `pm2 logs cyrus` — view logs
- `pm2 restart cyrus` — restart
- `pm2 stop cyrus` — stop
Option 2: systemd (Linux only)
The agent should run all of these commands directly:
1. Resolve the actual values for the service file:
CYRUS_BIN=$(which cyrus)
CYRUS_USER=$(whoami)
2. Write the service file:
sudo tee /etc/systemd/system/cyrus.service > /dev/null << EOF
[Unit]
Description=Cyrus AI Agent
After=network.target
[Service]
Type=simple
User=$CYRUS_USER
EnvironmentFile=/home/$CYRUS_USER/.cyrus/.env
ExecStart=$CYRUS_BIN
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF
3. Enable and start:
sudo systemctl daemon-reload
sudo systemctl enable cyrus
sudo systemctl start cyrus
After setup, inform the user of useful commands:
- `sudo systemctl status cyrus` — check status
- `sudo journalctl -u cyrus -f` — view logs
- `sudo systemctl restart cyrus` — restart
Option 3: Foreground
Run directly:
cyrus
Step 4: Start ngrok (if applicable)
If the user configured ngrok in the endpoint step, the agent should start it:
ngrok start cyrus
If using pm2, also make ngrok persistent:
pm2 start "ngrok start cyrus" --name ngrok
pm2 save
Step 5: Sandbox CA Certificate Trust (if sandbox enabled)
If the user's `~/.cyrus/config.json` has `sandbox.enabled: true`, check whether the egress proxy CA certificate is trusted in the system keychain.
**Check if sandbox is enabled:**
grep -o '"enabled":\s*true' ~/.cyrus/config.json 2>/dev/null | head -1
If sandbox is enabled, check trust status:
# macOS — check System keychain for the Cyrus CA
security find-certificate -c "Cyrus Egress Proxy CA" /Library/Keychains/System.keychain 2>&1
- If the cert is found (exit code 0): report ✓ trusted. Offer to set `sandbox.systemWideCert: true` in config.json to skip per-session cert env vars.
- If not found (exit code 44): inform the user and offer to run the trust command:
sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain ~/.cyrus/certs/cyrus-egress-ca.pem
On Linux, check with `test -f /usr/local/share/ca-certificates/cyrus-egress-ca.crt`. If not present:
sudo cp ~/.cyrus/certs/cyrus-egress-ca.pem /usr/local/share/ca-certificates/cyrus-egress-ca.crt
sudo update-ca-certificates
After trusting system-wide, offer to set `sandbox.systemWideCert: true` in config.json. This skips per-session cert env vars (`NODE_EXTRA_CA_CERTS`, `GIT_SSL_CAINFO`, etc.) since the OS cert store handles trust for all tools.
If the user declines system-wide trust, Cyrus still works — it sets cert env vars per-session. But some tools (Bun, .NET, curl on macOS with SecureTransport) will only work with system-wide trust.
Step 6: Verify Running
Once Cyrus starts, verify it's listening:
curl -s http://localhost:3456/status
Should return `{"status":"idle"}` or similar.
> Then try assigning a Linear issue to Cyrus, or @mentioning it in Slack, to verify the full pipeline works!
Completion
> ✓ Cyrus is running and ready. Assign a L
Read more
name: cyrus-setup-launch description: Print a summary of the Cyrus setup and offer to start the agent.
**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.**
Setup Launch
Prints a summary of the completed setup and offers to start Cyrus.
Step 1: Gather Configuration
Read current state:
# Base URL grep '^CYRUS_BASE_URL=' ~/.cyrus/.env 2>/dev/null | cut -d= -f2- # Linear grep -c '^LINEAR_CLIENT_ID=' ~/.cyrus/.env 2>/dev/null # GitHub gh auth status 2>&1 | head -1 # Slack grep -c '^SLACK_BOT_TOKEN=' ~/.cyrus/.env 2>/dev/null # Repositories cat ~/.cyrus/config.json 2>/dev/null # Claude auth grep -c -E '^(ANTHROPIC_API_KEY|CLAUDE_CODE_OAUTH_TOKEN)=' ~/.cyrus/.env 2>/dev/null
Step 2: Print Summary
Print a formatted summary:
┌─────────────────────────────────────┐ │ Cyrus Setup Complete │ ├─────────────────────────────────────┤ │ │ │ Endpoint: https://your-url.com │ │ Claude: ✓ API key configured │ │ │ │ Surfaces: │ │ Linear: ✓ Workspace connected │ │ GitHub: ✓ CLI authenticated │ │ Slack: ✓ Bot configured │ │ │ │ Repositories: │ │ • yourorg/yourrepo │ │ • yourorg/another-repo │ │ │ └─────────────────────────────────────┘
Use ✓ for configured items and ✗ for skipped/unconfigured items.
Step 3: Make Cyrus Persistent
Cyrus needs to run as a background process so it stays alive and restarts after reboots. **Use the `AskUserQuestion` tool if available** to ask:
> **How would you like to keep Cyrus running in the background?** > > 1. **pm2** (recommended) — Node.js process manager. Simple to set up, auto-restarts on crash, log management built in. Best for most users. > 2. **systemd** (Linux only) — OS-level service manager. Starts on boot automatically, managed with `systemctl`. Best for dedicated Linux servers. > 3. **Neither** — just run `cyrus` in the foreground for now (you can set up persistence later).
Option 1: pm2
The agent should run all of these commands directly:
1. Check if pm2 is installed (`which pm2`). If not, install it (`npm install -g pm2`). 2. Start Cyrus: `pm2 start cyrus --name cyrus` 3. Save the process list: `pm2 save` 4. Run `pm2 startup` — this prints a system-specific command. The agent should run that output command too (it typically requires `sudo`).
After setup, inform the user of useful commands:
- `pm2 logs cyrus` — view logs
- `pm2 restart cyrus` — restart
- `pm2 stop cyrus` — stop
Option 2: systemd (Linux only)
The agent should run all of these commands directly:
1. Resolve the actual values for the service file:
CYRUS_BIN=$(which cyrus) CYRUS_USER=$(whoami)
2. Write the service file:
sudo tee /etc/systemd/system/cyrus.service > /dev/null << EOF [Unit] Description=Cyrus AI Agent After=network.target [Service] Type=simple User=$CYRUS_USER EnvironmentFile=/home/$CYRUS_USER/.cyrus/.env ExecStart=$CYRUS_BIN Restart=always RestartSec=10 [Install] WantedBy=multi-user.target EOF
3. Enable and start:
sudo systemctl daemon-reload sudo systemctl enable cyrus sudo systemctl start cyrus
After setup, inform the user of useful commands:
- `sudo systemctl status cyrus` — check status
- `sudo journalctl -u cyrus -f` — view logs
- `sudo systemctl restart cyrus` — restart
Option 3: Foreground
Run directly:
cyrus
Step 4: Start ngrok (if applicable)
If the user configured ngrok in the endpoint step, the agent should start it:
ngrok start cyrus
If using pm2, also make ngrok persistent:
pm2 start "ngrok start cyrus" --name ngrok pm2 save
Step 5: Sandbox CA Certificate Trust (if sandbox enabled)
If the user's `~/.cyrus/config.json` has `sandbox.enabled: true`, check whether the egress proxy CA certificate is trusted in the system keychain.
**Check if sandbox is enabled:**
grep -o '"enabled":\s*true' ~/.cyrus/config.json 2>/dev/null | head -1
If sandbox is enabled, check trust status:
# macOS — check System keychain for the Cyrus CA security find-certificate -c "Cyrus Egress Proxy CA" /Library/Keychains/System.keychain 2>&1
- If the cert is found (exit code 0): report ✓ trusted. Offer to set `sandbox.systemWideCert: true` in config.json to skip per-session cert env vars.
- If not found (exit code 44): inform the user and offer to run the trust command:
sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain ~/.cyrus/certs/cyrus-egress-ca.pem
On Linux, check with `test -f /usr/local/share/ca-certificates/cyrus-egress-ca.crt`. If not present:
sudo cp ~/.cyrus/certs/cyrus-egress-ca.pem /usr/local/share/ca-certificates/cyrus-egress-ca.crt sudo update-ca-certificates
After trusting system-wide, offer to set `sandbox.systemWideCert: true` in config.json. This skips per-session cert env vars (`NODE_EXTRA_CA_CERTS`, `GIT_SSL_CAINFO`, etc.) since the OS cert store handles trust for all tools.
If the user declines system-wide trust, Cyrus still works — it sets cert env vars per-session. But some tools (Bun, .NET, curl on macOS with SecureTransport) will only work with system-wide trust.
Step 6: Verify Running
Once Cyrus starts, verify it's listening:
curl -s http://localhost:3456/status
Should return `{"status":"idle"}` or similar.
> Then try assigning a Linear issue to Cyrus, or @mentioning it in Slack, to verify the full pipeline works!
Completion
> ✓ Cyrus is running and ready. Assign a L
Your (Claude Code|Codex|Cursor|Gemini) powered (Linear|GitHub|GitLab|Slack) agent.
Repo: cyrusagents/cyrus
Other skills on cyrus.
- /google
Search the web for information. Use when you need to look something up, find current information, or research a topic.
Open skill - /release-core-test
Invoke when dev-testing a Cyrus change that spans CYPACK (edgeworker + CLI) and CYHOST (Vercel-hosted GUI) and the hosted GUI needs to point at an unreleased `cyrus-core` from this repo. Publishes `cyrus-core` (and `claude-runner` if needed) as a `-test.N` prerelease under the
Open skill - /cyrus-setup-claude-auth
Configure Claude Code authentication for Cyrus — API key, OAuth token, or third-party provider.
Open skill - /cyrus-setup-endpoint
Configure the public webhook endpoint for Cyrus — ngrok, Cloudflare Tunnel, or custom URL.
Open skill - /cyrus-setup-github
Configure GitHub for Cyrus — gh CLI login and git config for PRs, with optional webhook setup to enable @mention responses in PR comments, automated rebases and merges, and auto-fixing based on CI failures (coming soon).
Open skill - /cyrus-setup-gitlab
Configure GitLab authentication for Cyrus — glab CLI login and git config for creating merge requests.
Open skill

