cyrus-setup-launch — Claude Code skill: what it does, how to install
Checks Cyrus configuration, prints an integration status summary, and launches the agent as a background service via pm2 or systemd.
npx skills add cyrusagents/cyrus --skill cyrus-setup-launch -a claude-codeWhat cyrus-setup-launch does
The skill inspects local configurations in ~/.cyrus/.env and ~/.cyrus/config.json. It formats a summary table showing whether credentials for Linear, GitHub, Slack, and Claude are set up before running the agent.
Cyrus needs to stay online after reboots. The skill asks how to handle persistence, offering pm2, a Linux systemd unit, or running directly in the foreground. If proxy sandboxing is enabled, it also verifies CA certificate trust in the operating system store.
Secrets are guarded by an explicit restriction. The agent is forbidden from loading ~/.cyrus/.env using file read tools, relying on grep instead to protect keys from conversational context. Creating systemd units or installing root certificates requires sudo access.
What it helps with
- audit Cyrus connection status for Linear, GitHub, and Slack
- configure background persistence using pm2 or systemd
- install Cyrus egress proxy CA certificate into the system keychain
- start and persist ngrok tunnels for external endpoints
Example prompts for the agent
- Check my Cyrus setup and launch the agent in the background using pm2
- Review Cyrus configuration and generate a systemd service file
- Show the Cyrus setup summary and start it in the foreground
How to install cyrus-setup-launch
1Skills CLI (Vercel)
npx skills add cyrusagents/cyrus --skill cyrus-setup-launch -a claude-code2Manually: put the files in place
~/.claude/skills/cyrus-setup-launch/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/cyrus-setup-launch/
1Skills CLI (Vercel)
npx skills add cyrusagents/cyrus --skill cyrus-setup-launch -a codex2Manually: put the files in place
.agents/skills/cyrus-setup-launch/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add cyrusagents/cyrus --skill cyrus-setup-launch -a cursor2Manually: put the files in place
.cursor/skills/cyrus-setup-launch/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install cyrusagents/cyrus cyrus-setup-launch2Manually: put the files in place
.github/skills/cyrus-setup-launch/SKILL.md1Skills CLI (Vercel)
npx skills add cyrusagents/cyrus --skill cyrus-setup-launch -a gemini-cli2Platform CLI
gemini skills install https://github.com/cyrusagents/cyrus --path skills/cyrus-setup-launchManually: put the files in place
.devin/skills/cyrus-setup-launch/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add cyrusagents/cyrus --skill cyrus-setup-launch -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about cyrus-setup-launch
How do I install cyrus-setup-launch in Claude Code?
Run npx skills add cyrusagents/cyrus --skill cyrus-setup-launch -a claude-code in your terminal.
What does cyrus-setup-launch do?
It validates your Cyrus setup, displays a summary of connected surfaces, and configures background execution using pm2 or systemd.
Why does the skill avoid reading .env files directly?
The skill instructions explicitly ban file reading tools on environment files. It relies on Bash and grep so API keys stay out of the conversation context.
Source text
SKILL.md · Apache-2.0
---
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:
```bash
# 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:
```bash
CYRUS_BIN=$(which cyrus)
CYRUS_USER=$(whoami)
```
2. Write the service file:
```bash
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:
```bash
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:
```bash
cyrus
```
## Step 4: Start ngrok (if applicable)
If the user configured ngrok in the endpoint step, the agent should start it:
```bash
ngrok start cyrus
```
If using pm2, also make ngrok persistent:
```bash
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:**
```bash
grep -o '"enabled":\s*true' ~/.cyrus/config.json 2>/dev/null | head -1
```
If sandbox is enabled, check trust status:
```bash
# 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:
```bash
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:
```bash
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:
```bash
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 Linear issue or @mention in Slack to test it out!
© cyrusagents · Apache-2.0 · cyrusagents/cyrus