cyrus-setup-launch
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?
- pm2 (recommended) — Node.js process manager. Simple to set up, auto-restarts on crash, log management built in. Best for most users.
- systemd (Linux only) — OS-level service manager. Starts on boot automatically, managed with
systemctl. Best for dedicated Linux servers.- Neither — just run
cyrusin the foreground for now (you can set up persistence later).
Option 1: pm2
The agent should run all of these commands directly:
- Check if pm2 is installed (
which pm2). If not, install it (npm install -g pm2). - Start Cyrus:
pm2 start cyrus --name cyrus - Save the process list:
pm2 save - Run
pm2 startup— this prints a system-specific command. The agent should run that output command too (it typically requiressudo).
After setup, inform the user of useful commands:
pm2 logs cyrus— view logspm2 restart cyrus— restartpm2 stop cyrus— stop
Option 2: systemd (Linux only)
The agent should run all of these commands directly:
-
Resolve the actual values for the service file:
CYRUS_BIN=$(which cyrus) CYRUS_USER=$(whoami) -
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 -
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 statussudo journalctl -u cyrus -f— view logssudo 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: 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 Linear issue or @mention in Slack to test it out!