200 lines
5.1 KiB
Bash
200 lines
5.1 KiB
Bash
#!/bin/bash
|
|
set -e
|
|
|
|
echo "========================================="
|
|
echo " Aetheel — Discord-Claude Gateway Setup"
|
|
echo "========================================="
|
|
echo ""
|
|
|
|
PROJECT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
|
|
CONFIG_DIR="$PROJECT_DIR/config"
|
|
|
|
# --- Step 1: Check prerequisites ---
|
|
echo "Checking prerequisites..."
|
|
|
|
if ! command -v node &> /dev/null; then
|
|
echo "ERROR: Node.js is not installed. Install Node.js 18+ first."
|
|
exit 1
|
|
fi
|
|
|
|
NODE_VERSION=$(node -v | cut -d'v' -f2 | cut -d'.' -f1)
|
|
if [ "$NODE_VERSION" -lt 18 ]; then
|
|
echo "ERROR: Node.js 18+ required. Found: $(node -v)"
|
|
exit 1
|
|
fi
|
|
echo " ✓ Node.js $(node -v)"
|
|
|
|
if ! command -v claude &> /dev/null; then
|
|
echo "WARNING: Claude Code CLI not found in PATH."
|
|
echo " Install: npm install -g @anthropic-ai/claude-code"
|
|
echo " Then run: claude (to sign in)"
|
|
echo ""
|
|
read -p "Continue anyway? (y/n) " -n 1 -r
|
|
echo ""
|
|
if [[ ! $REPLY =~ ^[Yy]$ ]]; then exit 1; fi
|
|
else
|
|
echo " ✓ Claude Code CLI $(claude --version 2>/dev/null || echo 'installed')"
|
|
fi
|
|
|
|
# --- Step 2: Install dependencies ---
|
|
echo ""
|
|
echo "Installing dependencies..."
|
|
cd "$PROJECT_DIR"
|
|
npm install
|
|
echo " ✓ Dependencies installed"
|
|
|
|
# --- Step 3: Create .env ---
|
|
echo ""
|
|
if [ -f "$PROJECT_DIR/.env" ]; then
|
|
echo ".env already exists. Skipping."
|
|
else
|
|
echo "Setting up environment variables..."
|
|
read -p "Discord Bot Token: " DISCORD_TOKEN
|
|
read -p "Output Channel ID (for heartbeat/cron, press Enter to skip): " OUTPUT_CHANNEL
|
|
|
|
cat > "$PROJECT_DIR/.env" << EOF
|
|
DISCORD_BOT_TOKEN=$DISCORD_TOKEN
|
|
EOF
|
|
|
|
if [ -n "$OUTPUT_CHANNEL" ]; then
|
|
echo "OUTPUT_CHANNEL_ID=$OUTPUT_CHANNEL" >> "$PROJECT_DIR/.env"
|
|
fi
|
|
|
|
echo " ✓ .env created"
|
|
fi
|
|
|
|
# --- Step 4: Create config directory ---
|
|
echo ""
|
|
echo "Setting up config directory..."
|
|
mkdir -p "$CONFIG_DIR"
|
|
mkdir -p "$CONFIG_DIR/skills"
|
|
mkdir -p "$CONFIG_DIR/ipc/outbound"
|
|
mkdir -p "$CONFIG_DIR/messages"
|
|
mkdir -p "$CONFIG_DIR/conversations"
|
|
|
|
# --- Step 5: Create CLAUDE.md if missing ---
|
|
if [ ! -f "$CONFIG_DIR/CLAUDE.md" ]; then
|
|
echo ""
|
|
read -p "Agent name (default: Aetheel): " AGENT_NAME
|
|
AGENT_NAME=${AGENT_NAME:-Aetheel}
|
|
|
|
cat > "$CONFIG_DIR/CLAUDE.md" << EOF
|
|
# $AGENT_NAME
|
|
|
|
## Identity
|
|
- **Name:** $AGENT_NAME
|
|
- **Vibe:** Helpful, sharp, slightly witty
|
|
- **Emoji:** ⚡
|
|
|
|
## Personality
|
|
Be genuinely helpful, not performatively helpful. Skip the filler words — just help.
|
|
Have opinions. Be resourceful before asking. Earn trust through competence.
|
|
Keep Discord messages concise. Use markdown formatting.
|
|
|
|
## User Context
|
|
(Add info about yourself here — name, timezone, preferences, projects)
|
|
|
|
## Tools
|
|
(Add notes about specific tools, APIs, or services the agent should know about)
|
|
EOF
|
|
echo " ✓ CLAUDE.md created for $AGENT_NAME"
|
|
else
|
|
echo " ✓ CLAUDE.md already exists"
|
|
fi
|
|
|
|
# --- Step 6: Create agents.md if missing ---
|
|
if [ ! -f "$CONFIG_DIR/agents.md" ]; then
|
|
cat > "$CONFIG_DIR/agents.md" << 'EOF'
|
|
# Operating Rules
|
|
|
|
Be helpful and concise. Keep Discord messages short.
|
|
|
|
## Cron Jobs
|
|
|
|
## Hooks
|
|
|
|
### startup
|
|
Instruction: Say hello briefly, you just came online.
|
|
EOF
|
|
echo " ✓ agents.md created"
|
|
else
|
|
echo " ✓ agents.md already exists"
|
|
fi
|
|
|
|
# --- Step 7: Create heartbeat.md if missing ---
|
|
if [ ! -f "$CONFIG_DIR/heartbeat.md" ]; then
|
|
cat > "$CONFIG_DIR/heartbeat.md" << 'EOF'
|
|
# Heartbeat
|
|
|
|
# Add checks below. Example:
|
|
# ## check-name
|
|
# Interval: 3600
|
|
# Instruction: Check something and report.
|
|
EOF
|
|
echo " ✓ heartbeat.md created"
|
|
else
|
|
echo " ✓ heartbeat.md already exists"
|
|
fi
|
|
|
|
# --- Step 8: Create memory.md if missing ---
|
|
if [ ! -f "$CONFIG_DIR/memory.md" ]; then
|
|
echo "# Memory" > "$CONFIG_DIR/memory.md"
|
|
echo " ✓ memory.md created"
|
|
else
|
|
echo " ✓ memory.md already exists"
|
|
fi
|
|
|
|
# --- Step 9: Set up systemd service (optional) ---
|
|
echo ""
|
|
read -p "Set up systemd service for auto-start? (y/n) " -n 1 -r
|
|
echo ""
|
|
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
|
NPX_PATH=$(which npx)
|
|
CURRENT_USER=$(whoami)
|
|
|
|
sudo tee /etc/systemd/system/aetheel.service > /dev/null << EOF
|
|
[Unit]
|
|
Description=Aetheel Discord-Claude Gateway
|
|
After=network.target
|
|
|
|
[Service]
|
|
Type=simple
|
|
User=$CURRENT_USER
|
|
WorkingDirectory=$PROJECT_DIR
|
|
EnvironmentFile=$PROJECT_DIR/.env
|
|
ExecStart=$NPX_PATH tsx src/index.ts
|
|
Restart=on-failure
|
|
RestartSec=10
|
|
StandardOutput=journal
|
|
StandardError=journal
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
EOF
|
|
|
|
sudo systemctl daemon-reload
|
|
sudo systemctl enable aetheel
|
|
echo " ✓ systemd service created and enabled"
|
|
echo ""
|
|
echo " Start: sudo systemctl start aetheel"
|
|
echo " Stop: sudo systemctl stop aetheel"
|
|
echo " Logs: sudo journalctl -u aetheel -f"
|
|
echo " Restart: sudo systemctl restart aetheel"
|
|
else
|
|
echo " Skipped systemd setup. Run manually with: npm run dev"
|
|
fi
|
|
|
|
echo ""
|
|
echo "========================================="
|
|
echo " Setup complete!"
|
|
echo "========================================="
|
|
echo ""
|
|
echo "Config directory: $CONFIG_DIR"
|
|
echo ""
|
|
echo "Next steps:"
|
|
echo " 1. Edit config/CLAUDE.md with your persona"
|
|
echo " 2. Add cron jobs to config/agents.md"
|
|
echo " 3. Add heartbeat checks to config/heartbeat.md"
|
|
echo " 4. Start: npm run dev (or sudo systemctl start aetheel)"
|
|
echo ""
|