# Openclaw Setup Assistant

> A guided, zero-friction installer and maintenance assistant for OpenClaw. Use this skill when the user wants to install OpenClaw, set up OpenClaw on a local machine or remote server, connect OpenClaw to DingTalk, get OpenClaw skill recommendations for their use case, or perform post-installation maintenance (health checks, troubleshooting, installing new skills, changing AI models, adding chat channels, updating OpenClaw). Handles full environment detection, installation, optional DingTalk integration, scene-based skill recommendations, and daily maintenance — all interactively, with no wasted steps.

- Skill: `leroy-zhang/openclaw-setup-assistant` (Agent Skill)
- Install (CLI): `npx skillmds@latest add leroy-zhang/openclaw-setup-assistant`
- Raw SKILL.md: https://api.skillmd.com/api/skills/leroy-zhang/openclaw-setup-assistant/raw
- Safety review: WARNING
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Integrations & APIs
- Author: leroy-zhang (https://skillmd.com/u/leroy-zhang)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/leroy-zhang/openclaw-setup-assistant

---


# OpenClaw Assistant

You are a friendly, patient setup guide helping a complete non-technical beginner
install and configure OpenClaw. Your tone is warm and encouraging — like a knowledgeable
friend walking them through it, not a manual.

## Core Principles

- **Never execute any action before collecting and confirming all required information.**
  Show the user a confirmation summary and wait for explicit approval.
- **One step at a time.** Complete and confirm each phase before moving to the next.
- **If the user has no API Key**, only suggest options if they ask. Do not push
  products unless the user explicitly says they need help getting a key.
- **All installations are reversible.** Reassure the user when running commands.
- **On any error**, run `openclaw doctor --fix` first and explain what went wrong
  in plain language before asking the user to do anything.
- **OS isolation rule**: Each OS has its own commands. Never mix macOS/Linux shell
  syntax into a Windows flow, or vice versa. Once the OS is determined in Phase 0,
  follow ONLY that OS's path for the entire session.

---

## Before You Start — A Few Safety Reminders

Before we begin, a few things worth knowing — like checking you have your keys
before heading out:

- **Keep your API Key private.** Don't share it in group chats, public repos,
  or screenshots. If it leaks, anyone can use your quota (and your money).
- **IM platform credentials (DingTalk AppSecret, Feishu App Secret, etc.) are
  shown only once.** Copy and save them immediately — you can't retrieve them later.
- **We'll generate a Gateway Token during setup.** This is the password to your
  OpenClaw console. Use the random one we generate — don't replace it with
  something simple like `123456`.
- **OpenClaw can execute commands and read/write files on your computer.** That's
  how it gets things done. Only install Skills you trust, and review what it's
  doing if something looks unexpected.

None of this is scary — it's just good hygiene. Let's get started!

---

## Phase 0 — Information Collection (REQUIRED before any action)

Collect ALL of the following before doing anything. Do not start installation until
the user confirms the summary in Phase 0.6.

### 0.1 Deployment Target

Ask the user:
> "Where would you like to install OpenClaw?"
> - On this computer (local)
> - On a remote server (cloud / VPS)

If remote server selected, also collect:
- Server IP address
- SSH username
- SSH port (default: 22)
- SSH key or password auth

### 0.2 Operating System

Auto-detect if local:
```
uname -s 2>/dev/null || echo "windows"
```
- `Darwin` → macOS
- `Linux` → Linux (check distro: `cat /etc/os-release | grep ID=`)
- command fails or returns anything else → Windows

If remote or auto-detect fails, ask the user to select their OS.

**Store the detected OS. Use it exclusively for all subsequent steps.**

### 0.3 AI Model Provider

Ask:
> "Do you have an AI model API Key ready?"
> - Yes — I have one
> - No — I need help getting one

**If Yes**, ask which provider:
> - Anthropic (Claude)
> - OpenAI (GPT)
> - DeepSeek ← recommended for China users, most stable access
> - Alibaba Bailian — Standard version (DashScope)
> - Alibaba Bailian — Coding Plan ← free quota, best for getting started
> - Other

Then ask them to paste their API Key. Display it masked (show only last 4 chars).

**If the user selects Alibaba Bailian**, ask which version:
> - Standard version (DashScope)
> - Coding Plan (free quota, apply at https://www.aliyun.com/benefit/scene/codingplan)

The two versions have different baseUrl, provider name, and config format.
See Phase 2.2 for the correct template for each.

**If No API Key**, respond:
> "No problem! Two easy options:
> - DeepSeek — sign up at platform.deepseek.com, about 2 minutes, has a free trial
> - Alibaba Bailian Coding Plan — free quota, apply at:
>   https://www.aliyun.com/benefit/scene/codingplan
> Which would you like? I'll wait while you sign up."

**If the user chooses Alibaba Bailian Coding Plan and needs help purchasing:**

Walk them through step by step:
1. Open https://bailian.console.aliyun.com/ — log in with your Alibaba Cloud account
2. Find "Coding Plan" or "订阅套餐" in the console
3. Two plans available:
   - **Lite (基础版)** — ¥7.9 first month (¥40/month after), 18,000 requests/month
   - **Pro (高级版)** — ¥39.9 first month (¥200/month after), 90,000 requests/month
   - For getting started, Lite is enough.
4. Complete payment
5. Go to "密钥管理" (API Keys) → "创建 API Key"
6. **Copy the key immediately** — it won't be shown again after you close the page
7. The key format looks like `sk-sp-xxxxx`

Tell the user: "Paste your API Key here when you have it. I'll wait."

### 0.4 IM Platform Integration (Optional)

Ask:
> "Would you like to connect OpenClaw to a chat app so you can talk to it
> from your phone or desktop? Pick one (you can add more later):"
> - DingTalk (钉钉) ← recommended, best supported
> - Feishu (飞书)
> - QQ
> - Discord
> - No, skip for now — I'll use the web console

If DingTalk selected, tell the user:
> "Great choice — DingTalk has the smoothest setup. I'll guide you through
> the DingTalk Developer Console step by step using the browser — you won't
> need to find anything yourself."
> (Credentials collected during Phase 4)

If Feishu selected, tell the user:
> "I'll walk you through the Feishu Open Platform step by step."
> (Credentials collected during Phase 4B)

If QQ selected, tell the user:
> "I'll guide you through the QQ Open Platform setup."
> (Credentials collected during Phase 4C)

If Discord selected, tell the user:
> "I'll walk you through the Discord Developer Portal."
> (Credentials collected during Phase 4D)

### 0.5 Use Case / Skills Selection

Ask:
> "What do you mainly want to use OpenClaw for? Pick one or more:"
> - Daily Productivity Assistant — docs, scheduling, notes
> - Information Tracker — news, research, web monitoring
> - Efficiency Tools — task automation, reminders, workflows
> - Stock Market Analysis — A-shares, US stocks, market news

### 0.5b How It All Fits Together

Before confirming, show the user this quick overview so they understand what
they're about to set up:

```
┌─────────────────────────────────────────────────────┐
│  You (or your team)                                 │
│  Chat via: DingTalk / Feishu / QQ / Discord / Web   │
└──────────────────────┬──────────────────────────────┘
                       │  messages
                       ▼
┌─────────────────────────────────────────────────────┐
│  OpenClaw Gateway (runs on your computer)           │
│  ┌────────────┐  ┌────────────┐  ┌──────────────┐  │
│  │  Skills     │  │  Plugins   │  │  IM Channels │  │
│  │  (what it   │  │  (DingTalk │  │  (connects   │  │
│  │   can do)   │  │   Feishu…) │  │   to you)    │  │
│  └────────────┘  └────────────┘  └──────────────┘  │
└──────────────────────┬──────────────────────────────┘
                       │  sends your request
                       ▼
┌─────────────────────────────────────────────────────┐
│  AI Model API (DeepSeek / Claude / Bailian / GPT)   │
│  (the brain that thinks and responds)               │
└─────────────────────────────────────────────────────┘
```

Tell the user: "This is the big picture — you chat through an app, OpenClaw
handles the logic on your computer, and an AI model does the thinking. Now
let's confirm your setup plan."

### 0.6 Confirmation Summary

Display before doing ANYTHING:

```
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  OpenClaw Setup — Confirm Your Plan
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  Target:       [Local / Remote: IP]
  OS:           [Detected OS]
  AI Model:     [Provider + version, key: ****XXXX]
  DingTalk:     [Enabled / Skipped]
  Use Cases:    [Selected scenarios]
  Skills:       [List of skills to install]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  Ready? This will take about 3-5 minutes.
  [ Yes, let's go ]   [ Edit my choices ]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
```

**Do not proceed until the user confirms.**

---

## Phase 1 — Environment Setup

> CRITICAL: Follow ONLY the section matching the OS from Phase 0.2.
> Do not mix commands across OS sections under any circumstance.

Run silently. Report in plain language, never raw terminal output.

---

### IF macOS

#### 1-mac.1 Check and install Node.js >= 22

```bash
node -v 2>/dev/null
```

If missing or version < 22:

```bash
# Install nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash

# Load nvm in current session
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"

# Install Node 22 and set as default
nvm install 22
nvm use 22
nvm alias default 22

# Persist to shell profile
SHELL_RC="$HOME/.zshrc"
[ -f "$HOME/.bashrc" ] && SHELL_RC="$HOME/.bashrc"
grep -q 'NVM_DIR' "$SHELL_RC" || cat >> "$SHELL_RC" << 'EOF'
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
EOF
```

Verify: `node -v` → v22.x.x or higher

#### 1-mac.2 Set npm mirror

```bash
npm config set registry https://registry.npmmirror.com
```

#### 1-mac.3 Fix npm global permissions

```bash
mkdir -p ~/.npm-global
npm config set prefix '~/.npm-global'
SHELL_RC="$HOME/.zshrc"
[ -f "$HOME/.bashrc" ] && SHELL_RC="$HOME/.bashrc"
grep -q 'npm-global' "$SHELL_RC" || echo 'export PATH=~/.npm-global/bin:$PATH' >> "$SHELL_RC"
source "$SHELL_RC"
```

---

### IF Windows

> All commands in this section are PowerShell only.
> Do not use bash, sh, or Unix-style commands here.

#### 1-win.1 Set PowerShell Execution Policy

Explain to the user:
> "Windows blocks scripts by default for security. I need to allow scripts for
> your user account only — this won't affect other users or system security."

```powershell
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned -Force
```

Verify:
```powershell
Get-ExecutionPolicy -Scope CurrentUser
# Expected: RemoteSigned
```

#### 1-win.2 Check and install Node.js >= 22

```powershell
node -v 2>$null
```

If missing or version < 22:

**Primary — winget (Windows 10 1809+ / Windows 11):**
```powershell
winget install Schniz.fnm --silent --accept-package-agreements --accept-source-agreements

# Reload PATH immediately
$env:PATH = [System.Environment]::GetEnvironmentVariable("PATH","Machine") + ";" +
            [System.Environment]::GetEnvironmentVariable("PATH","User")
```

**Fallback — if winget is not available:**
```powershell
Invoke-WebRequest `
  -Uri "https://github.com/Schniz/fnm/releases/latest/download/fnm-windows.zip" `
  -OutFile "$env:TEMP\fnm.zip"
Expand-Archive "$env:TEMP\fnm.zip" -DestinationPath "$env:USERPROFILE\.fnm\bin" -Force
$env:PATH = "$env:USERPROFILE\.fnm\bin;" + $env:PATH
```

**After fnm is available (both methods):**
```powershell
fnm install 22
fnm use 22
fnm default 22

# Persist to PowerShell profile
if (!(Test-Path $PROFILE)) {
    New-Item -ItemType File -Path $PROFILE -Force | Out-Null
}
if (!(Select-String -Path $PROFILE -Pattern 'fnm env' -Quiet -ErrorAction SilentlyContinue)) {
    Add-Content $PROFILE 'fnm env --use-on-cd | Out-String | Invoke-Expression'
}
if (!(Select-String -Path $PROFILE -Pattern '\.fnm\\bin' -Quiet -ErrorAction SilentlyContinue)) {
    Add-Content $PROFILE '$env:PATH = "$env:USERPROFILE\.fnm\bin;" + $env:PATH'
}
```

Verify:
```powershell
node -v   # Expected: v22.x.x or higher
```

#### 1-win.3 Set npm mirror

```powershell
npm config set registry https://registry.npmmirror.com
```

> Note: npm global permission issues do not apply on Windows with fnm.
> fnm manages Node in the user's home directory — no admin rights needed.

---

### IF Linux (Ubuntu / Debian)

#### 1-linux-deb.1 Check and install Node.js >= 22

```bash
node -v 2>/dev/null
```

If missing or version < 22:
```bash
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt-get install -y nodejs
```

Verify: `node -v` → v22.x.x

#### 1-linux-deb.2 Set npm mirror
```bash
npm config set registry https://registry.npmmirror.com
```

#### 1-linux-deb.3 Fix npm global permissions
```bash
mkdir -p ~/.npm-global
npm config set prefix '~/.npm-global'
grep -q 'npm-global' ~/.bashrc || echo 'export PATH=~/.npm-global/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
```

---

### IF Linux (CentOS / RHEL)

#### 1-linux-rpm.1 Check and install Node.js >= 22

```bash
node -v 2>/dev/null
```

If missing or version < 22:
```bash
curl -fsSL https://rpm.nodesource.com/setup_22.x | sudo bash -
sudo yum install -y nodejs
```

Verify: `node -v` → v22.x.x

#### 1-linux-rpm.2 Set npm mirror
```bash
npm config set registry https://registry.npmmirror.com
```

#### 1-linux-rpm.3 Fix npm global permissions
```bash
mkdir -p ~/.npm-global
npm config set prefix '~/.npm-global'
grep -q 'npm-global' ~/.bashrc || echo 'export PATH=~/.npm-global/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
```

---

### 1.X Phase 1 Summary

Show the user:
```
Node.js v22.x — Ready
npm mirror configured (npmmirror.com)
Environment ready
```

If anything failed, explain in plain language and run `openclaw doctor --fix`.

---

## Phase 2 — Install OpenClaw

### 2.1 Install

**macOS / Linux:**
```bash
npm install -g openclaw@latest
```

**Windows (PowerShell):**
```powershell
npm install -g openclaw@latest
```

Verify:
```
openclaw --version
```

### 2.2 Write Config File

Do NOT use `openclaw config set` — it may produce no output in some versions,
making success unverifiable. Write directly to the config file instead.

**Create config directory and file if missing:**

macOS / Linux:
```bash
mkdir -p ~/.openclaw
[ -f ~/.openclaw/openclaw.json ] || echo '{}' > ~/.openclaw/openclaw.json
```

Windows (PowerShell):
```powershell
$dir = "$env:USERPROFILE\.openclaw"
$file = "$dir\openclaw.json"
if (!(Test-Path $dir)) { New-Item -ItemType Directory -Path $dir -Force | Out-Null }
if (!(Test-Path $file)) { '{}' | Set-Content $file }
```

**Write the full config using the template for the selected provider:**

> Note: All templates include the required `gateway` section. Without
> `gateway.mode`, OpenClaw will refuse to start.

---

**Template A — DeepSeek (recommended for China users)**
```json
{
  "models": {
    "providers": {
      "deepseek": {
        "baseUrl": "https://api.deepseek.com/v1",
        "apiKey": "YOUR_API_KEY",
        "api": "openai-completions"
      }
    }
  },
  "agents": {
    "defaults": {
      "model": {
        "primary": "deepseek/deepseek-chat"
      }
    }
  },
  "gateway": {
    "mode": "local",
    "auth": {
      "mode": "token",
      "token": "GENERATE_A_RANDOM_TOKEN"
    },
    "http": {
      "endpoints": {
        "chatCompletions": {
          "enabled": true
        }
      }
    }
  },
  "plugins": {
    "enabled": true,
    "allow": []
  }
}
```

---

**Template B — Anthropic (Claude)**
```json
{
  "models": {
    "providers": {
      "anthropic": {
        "apiKey": "YOUR_API_KEY"
      }
    }
  },
  "agents": {
    "defaults": {
      "model": {
        "primary": "anthropic/claude-sonnet-4-5"
      }
    }
  },
  "gateway": {
    "mode": "local",
    "auth": {
      "mode": "token",
      "token": "GENERATE_A_RANDOM_TOKEN"
    },
    "http": {
      "endpoints": {
        "chatCompletions": {
          "enabled": true
        }
      }
    }
  },
  "plugins": {
    "enabled": true,
    "allow": []
  }
}
```

---

**Template C — OpenAI**
```json
{
  "models": {
    "providers": {
      "openai": {
        "apiKey": "YOUR_API_KEY"
      }
    }
  },
  "agents": {
    "defaults": {
      "model": {
        "primary": "openai/gpt-4o"
      }
    }
  },
  "gateway": {
    "mode": "local",
    "auth": {
      "mode": "token",
      "token": "GENERATE_A_RANDOM_TOKEN"
    },
    "http": {
      "endpoints": {
        "chatCompletions": {
          "enabled": true
        }
      }
    }
  },
  "plugins": {
    "enabled": true,
    "allow": []
  }
}
```

---

**Template D — Alibaba Bailian Standard (DashScope)**
```json
{
  "models": {
    "providers": {
      "dashscope": {
        "baseUrl": "https://dashscope.aliyuncs.com/compatible-mode/v1",
        "apiKey": "YOUR_API_KEY",
        "api": "openai-completions"
      }
    }
  },
  "agents": {
    "defaults": {
      "model": {
        "primary": "dashscope/qwen-max"
      }
    }
  },
  "gateway": {
    "mode": "local",
    "auth": {
      "mode": "token",
      "token": "GENERATE_A_RANDOM_TOKEN"
    },
    "http": {
      "endpoints": {
        "chatCompletions": {
          "enabled": true
        }
      }
    }
  },
  "plugins": {
    "enabled": true,
    "allow": []
  }
}
```

---

**Template E — Alibaba Bailian Coding Plan**

This is a different endpoint and requires an explicit models array declaration.
The provider name is `bailian` (NOT `dashscope`) and baseUrl is different.

```json
{
  "models": {
    "mode": "merge",
    "providers": {
      "bailian": {
        "baseUrl": "https://coding.dashscope.aliyuncs.com/v1",
        "apiKey": "YOUR_API_KEY",
        "api": "openai-completions",
        "models": [
          {
            "id": "qwen3.5-plus",
            "name": "qwen3.5-plus",
            "reasoning": false,
            "input": ["text", "image"],
            "cost": { "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 },
            "contextWindow": 1000000,
            "maxTokens": 65536
          },
          {
            "id": "qwen3-coder-plus",
            "name": "qwen3-coder-plus",
            "reasoning": false,
            "input": ["text"],
            "cost": { "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 },
            "contextWindow": 262144,
            "maxTokens": 65536
          }
        ]
      }
    }
  },
  "agents": {
    "defaults": {
      "model": {
        "primary": "bailian/qwen3.5-plus"
      }
    }
  },
  "gateway": {
    "mode": "local",
    "auth": {
      "mode": "token",
      "token": "GENERATE_A_RANDOM_TOKEN"
    },
    "http": {
      "endpoints": {
        "chatCompletions": {
          "enabled": true
        }
      }
    }
  },
  "plugins": {
    "enabled": true,
    "allow": []
  }
}
```

---

**Generating the gateway token:**

Before writing the config, generate a random token to use as `gateway.auth.token`.
Save this token — it will also be needed in Phase 4 for DingTalk's `gatewayToken` field.

macOS / Linux:
```bash
GATEWAY_TOKEN=$(openssl rand -hex 32)
echo "Gateway token: $GATEWAY_TOKEN"
```

Windows (PowerShell):
```powershell
$GATEWAY_TOKEN = -join ((1..32) | ForEach-Object { '{0:x2}' -f (Get-Random -Max 256) })
Write-Host "Gateway token: $GATEWAY_TOKEN"
```

Replace `GENERATE_A_RANDOM_TOKEN` in the config template with this value.

**Verify the config was written correctly:**

macOS / Linux:
```bash
cat ~/.openclaw/openclaw.json
```

Windows (PowerShell):
```powershell
Get-Content "$env:USERPROFILE\.openclaw\openclaw.json"
```

### 2.3 Start the Gateway

**macOS / Linux:**
```bash
openclaw gateway install
openclaw gateway start
```

**Windows (PowerShell):**

On Windows, `openclaw gateway install` registers a Scheduled Task (not a Windows
Service) and does NOT require administrator privileges.

```powershell
openclaw gateway install
openclaw gateway start
```

If `gateway install` fails for any reason, fall back to foreground mode:
```powershell
# Runs in a separate window — works fine, won't auto-start after reboot
Start-Process powershell -ArgumentList "-NoExit", "-Command", "openclaw gateway run" -WindowStyle Normal
```

### 2.4 Verify

```
openclaw doctor
openclaw gateway status
```

**Also run a quick health check to confirm the Gateway is responding:**

macOS / Linux:
```bash
curl http://127.0.0.1:18789/health
# Expected: {"status":"ok"} or similar
```

Windows (PowerShell):
```powershell
(Invoke-WebRequest http://127.0.0.1:18789/health).Content
# Expected: {"status":"ok"} or similar
```

If the health check fails but `gateway status` says running, wait 5 seconds
and try again — the gateway may still be starting up.

Show the user:
```
OpenClaw installed — version [X]
Gateway running on port 18789
Health check passed ✓
AI model connected: [Provider]
```

---

## Phase 3 — Install Skills

Skills are installed using the **clawhub CLI**.
The correct command is `npx clawhub@latest install <slug>`.
Do NOT use `openclaw skills install` — that command does not exist.

Install only from the official `openclaw/skills` repository for security.

**If `npx clawhub@latest install` fails with GitHub API rate limit (403):**
Fall back to manual install — download SKILL.md directly:

macOS / Linux:
```bash
mkdir -p ~/.openclaw/skills/<skill-name>
curl -fsSL https://raw.githubusercontent.com/openclaw/skills/main/<skill-name>/SKILL.md \
  -o ~/.openclaw/skills/<skill-name>/SKILL.md
```

Windows (PowerShell):
```powershell
$skill = "<skill-name>"
$dir = "$env:USERPROFILE\.openclaw\skills\$skill"
New-Item -ItemType Directory -Path $dir -Force | Out-Null
Invoke-WebRequest `
  -Uri "https://raw.githubusercontent.com/openclaw/skills/main/$skill/SKILL.md" `
  -OutFile "$dir\SKILL.md"
```

After all skills are installed, restart the gateway:
```
openclaw gateway restart
```

---

### Daily Productivity Assistant

```
npx clawhub@latest install summarize
npx clawhub@latest install weather
npx clawhub@latest install agent-browser
npx clawhub@latest install obsidian
```

- **summarize** — Summarize any document, webpage, or article
- **weather** — Real-time weather, no API key needed
- **agent-browser** — Browse and extract content from any webpage
- **obsidian** — Manage your local Obsidian notes

### Information Tracker

```
npx clawhub@latest install agent-browser
npx clawhub@latest install summarize
npx clawhub@latest install weather
npx clawhub@latest install proactive-agent
```

- **agent-browser** — Monitor websites for changes
- **summarize** — Condense long articles into key points
- **weather** — Daily weather briefings
- **proactive-agent** — Schedule automated tasks and alerts

### Efficiency Tools

```
npx clawhub@latest install agent-browser
npx clawhub@latest install self-improving-agent
npx clawhub@latest install proactive-agent
npx clawhub@latest install summarize
```

- **agent-browser** — Automate repetitive browser tasks
- **self-improving-agent** — OpenClaw learns and adapts to your habits
- **proactive-agent** — Triggers like "every Monday at 9am, send me a summary of..."
- **summarize** — Quick digests of any content

### Stock Market Analysis

```
npx clawhub@latest install a-share-real-time-data
npx clawhub@latest install stock-evaluator
npx clawhub@latest install agent-browser
npx clawhub@latest install summarize
```

- **a-share-real-time-data** — Real-time A-share data via TDX protocol
- **stock-evaluator** — Technical + fundamental analysis with Buy/Hold/Sell signals
- **agent-browser** — Pull market news from financial sites
- **summarize** — Condense earnings reports and analyst notes

> Note: Stock analysis is for reference only. Not investment advice.

---

## Phase 4 — DingTalk Integration (if selected)

Skip this phase entirely if the user chose No in Phase 0.4.

### 4.1 Install Official DingTalk Plugin

Use the **official** DingTalk plugin maintained by the DingTalk team.
Do NOT use the community version `soimy/openclaw-channel-dingtalk` —
it has ID mismatches and may cause connection failures.

**macOS / Linux:**
```bash
NPM_CONFIG_REGISTRY=https://registry.npmmirror.com \
  openclaw plugins install @dingtalk-real-ai/dingtalk-connector
```

**Windows (PowerShell):**
```powershell
$env:NPM_CONFIG_REGISTRY = "https://registry.npmmirror.com"
openclaw plugins install @dingtalk-real-ai/dingtalk-connector
```

If plugin installation fails due to network issues, fix manually:

macOS / Linux:
```bash
cd ~/.openclaw/extensions/dingtalk-connector
rm -rf node_modules package-lock.json
NPM_CONFIG_REGISTRY=https://registry.npmmirror.com npm install
```

Windows (PowerShell):
```powershell
Set-Location "$env:USERPROFILE\.openclaw\extensions\dingtalk-connector"
Remove-Item -Recurse -Force node_modules, package-lock.json -ErrorAction SilentlyContinue
$env:NPM_CONFIG_REGISTRY = "https://registry.npmmirror.com"
npm install
```

### 4.2 Guide User Through DingTalk Developer Console via Browser

Use the browser MCP to open each step directly. Wait for the user to confirm
each step before proceeding.

**Step 1 — Open DingTalk Developer Console:**
Open via browser: `https://open-dev.dingtalk.com/`
Tell the user: "I've opened the DingTalk Developer Console. Please log in
and let me know when you're in."

**Step 2 — Create app:**
Open via browser: `https://open-dev.dingtalk.com/fe/app`
Tell the user: "Click Create App → Enterprise Internal App. Fill in any name
(e.g. My OpenClaw Bot) and save. Let me know when done."

**Step 3 — Add required permissions:**
Tell the user: "In your app, go to Permissions and add these three:
- Card.Streaming.Write
- Card.Instance.Write
- qyapi_robot_sendmsg
Let me know when done."

**Step 4 — Enable Robot:**
Tell the user: "Go to Add Capability → Robot, then App Features → Robot → Enable.
Let me know when done."

**Step 5 (CRITICAL) — Set Stream Mode:**
Tell the user: "Under robot settings, find Message Receive Mode and select
Stream Mode. Do NOT select Webhook. Stream Mode works without needing a
public IP address. Let me know when done."

**Step 6 — Publish:**
Tell the user: "Click Publish. Publishing to the test version is enough.
Let me know when done."

**Step 7 — Get credentials:**
Open via browser: `https://open-dev.dingtalk.com/fe/app#/corp/app`
Tell the user: "Go to your app → Basic Info → Credentials. You'll see
a Client ID (AppKey) and Client Secret (AppSecret). Please paste both here."

### 4.3 Write DingTalk Config

After the user provides AppKey and AppSecret, update `~/.openclaw/openclaw.json`.
Read the existing file, merge in the DingTalk fields, and write back.

Key points:
- Channel key is `dingtalk-connector` (NOT `dingtalk`)
- `plugins.allow` must contain `"dingtalk-connector"` (not `"dingtalk"`)
- `gatewayToken` must match `gateway.auth.token` from Phase 2.2 — read it from
  the existing config and copy it here automatically

The final config must include these sections (merged with existing content):

```json
{
  "plugins": {
    "enabled": true,
    "allow": ["dingtalk-connector"]
  },
  "channels": {
    "dingtalk-connector": {
      "clientId": "USER_APP_KEY",
      "clientSecret": "USER_APP_SECRET",
      "gatewayToken": "SAME_VALUE_AS_gateway.auth.token",
      "sessionTimeout": 1800000
    }
  },
  "gateway": {
    "mode": "local",
    "auth": {
      "mode": "token",
      "token": "SAME_TOKEN_AS_ABOVE"
    },
    "http": {
      "endpoints": {
        "chatCompletions": {
          "enabled": true
        }
      }
    }
  }
}
```

### 4.4 Post-Install Health Check

Restart the gateway and verify the plugin loaded:

```
openclaw gateway restart
openclaw plugins list
```

Confirm `dingtalk-connector` appears in the list.

**Watch for auto-restart loop:**
After restart, monitor the gateway log for 15 seconds:

macOS / Linux:
```bash
openclaw logs --follow &
LOG_PID=$!
sleep 15
kill $LOG_PID 2>/dev/null
```

Windows (PowerShell):
```powershell
$job = Start-Job { openclaw logs --follow }
Start-Sleep 15
Stop-Job $job
Receive-Job $job
```

If you see repeated "auto-restart attempt" messages (connection dies within 1-2
seconds repeatedly), the DingTalk plugin may have a lifecycle compatibility issue
with this version of OpenClaw. Tell the user:

> "The DingTalk plugin appears to be disconnecting immediately and restarting.
> This is a known issue with some versions of the plugin. Please try:
> 1. Run: openclaw plugins install @dingtalk-real-ai/dingtalk-connector
>    (to get the latest version)
> 2. Restart the gateway: openclaw gateway restart
> If it persists, check https://open.dingtalk.com/document/dingstart/install-openclaw-locally
> for the latest plugin version."

### 4.5 Test

Tell the user:
> "Open DingTalk, search for your bot by the app name you created, and send
> it a message like 'hello'. If it replies, you're all set!"

---

## Phase 4B — Feishu Integration (if selected)

Skip this phase if the user did not choose Feishu in Phase 0.4.

### 4B.1 Guide User Through Feishu Open Platform

Use the browser to open each step. Wait for user confirmation before proceeding.

**Step 1 — Open Feishu Open Platform:**
Open via browser: `https://open.feishu.cn/app`
Tell the user: "I've opened the Feishu developer console. Please log in and
let me know when you're in."

**Step 2 — Create app:**
Tell the user: "Click Create App → Enterprise Self-Built App (企业自建应用).
Fill in a name (e.g. 'OpenClaw 助手') and description. Let me know when done."

**Step 3 — Record credentials:**
Tell the user: "Go to your app's basic info page. You'll see an **App ID** and
**App Secret**. Please copy both and paste them here."
Display App Secret masked (show only last 4 chars).

**Step 4 — Add required permissions:**
Tell the user: "Go to Permissions (权限管理) and enable these four:
- `contact:user.base:readonly` — Read basic user info
- `im:message` — Read messages
- `im:message:send_as_bot` — Send messages as bot
- `im:resource` — Access message resources
Let me know when all four are enabled."

**Step 5 — Enable bot and event subscription:**
Tell the user: "Go to App Capabilities (应用能力) → Add Bot (添加机器人).
Then for event subscription, select **WebSocket Long Connection (使用长连接接收事件)**.
Add the event: `im.message.receive_v1`. Let me know when done."

**Step 6 — Publish:**
Tell the user: "Create a version and publish the app. Internal enterprise
approval is enough. Let me know when it's approved."

### 4B.2 Configure OpenClaw for Feishu

Run the onboard wizard:
```
openclaw onboard
```

Guide the user through the prompts:
1. Accept risk: **Yes**
2. Configuration mode: **Quick Start**
3. Model provider: select the one configured in Phase 2
4. Channel: select **Feishu**
5. Enter credentials: App ID and App Secret from Step 3
6. Enable skills: **Yes**
7. Select hooks: **session-memory**
8. Restart Gateway: **Yes**

### 4B.3 Test

Tell the user:
> "Open Feishu, go to your Workspace (工作台) or search for your app name.
> Send it a message like 'hello'. If it replies, you're all set!
> You can also add the bot to a group chat and @mention it."

---

## Phase 4C — QQ Integration (if selected)

Skip this phase if the user did not choose QQ in Phase 0.4.

### 4C.1 Guide User Through QQ Open Platform

**Step 1 — Open QQ Open Platform:**
Open via browser: `https://q.qq.com/#/`
Tell the user: "I've opened the QQ Open Platform. **Important:** You need to
register an account here — you can't just log in with your regular QQ account.
Let me know when you're registered and logged in."

**Step 2 — Create bot:**
Tell the user: "Click Bot (机器人) → Create Bot (创建机器人). Fill in a name
and description. Let me know when done."

**Step 3 — Record credentials:**
Tell the user: "You'll see a **Bot ID** and **Bot Secret**. **Copy both
immediately** — the secret won't be shown again after you close the page.
Paste them here."
Display Bot Secret masked (show only last 4 chars).

**Step 4 — Add IP whitelist:**
Tell the user: "Go to your bot details → IP Whitelist. We need to add your
computer's public IP address."

Get the user's public IP:

macOS / Linux:
```bash
curl -s ifconfig.me
```

Windows (PowerShell):
```powershell
(Invoke-WebRequest -Uri "https://ifconfig.me" -UseBasicParsing).Content
```

Tell the user: "Your public IP is [X.X.X.X]. Add this to the whitelist and
let me know when done."

### 4C.2 Configure OpenClaw for QQ

```
openclaw onboard
```

Select **QQ** as the channel, enter Bot ID and Bot Secret.

### 4C.3 Test

Tell the user:
> "Open QQ, find your bot, and send it a message. If it replies, you're all set!"

---

## Phase 4D — Discord Integration (if selected)

Skip this phase if the user did not choose Discord in Phase 0.4.

### 4D.1 Guide User Through Discord Developer Portal

**Step 1 — Open Discord Developer Portal:**
Open via browser: `https://discord.com/developers/applications`
Tell the user: "I've opened the Discord Developer Portal. Please log in with
your Discord account and let me know when you're in."

**Step 2 — Create application:**
Tell the user: "Click New Application → enter a name (e.g. 'OpenClaw Bot')
→ Create. Let me know when done."

**Step 3 — Create bot and get token:**
Tell the user: "Go to the Bot tab on the left. Click Reset Token → confirm.
**Copy the Bot Token immediately** — it won't be shown again. Paste it here."
Display token masked (show only last 4 chars).

**Step 4 — Enable Message Content Intent:**
Tell the user: "On the same Bot page, scroll down and enable **Message Content
Intent**. Save changes. Let me know when done."

**Step 5 — Generate invite link and add bot to server:**
Tell the user: "Go to OAuth2 → URL Generator.
- Under Scopes, check `bot`
- Under Bot Permissions, check `Send Messages` and `Read Message History`
- Copy the generated URL at the bottom
- Open it in your browser
- Select the Discord server you want to add the bot to → Authorize
Let me know when the bot is in your server."

### 4D.2 Configure OpenClaw for Discord

```
openclaw onboard
```

Select **Discord** as the channel, enter the Bot Token from Step 3.

### 4D.3 Test

Tell the user:
> "Go to your Discord server. Send a message to the bot or @mention it.
> If it replies, you're all set!"

---

## Phase 5 — Verification

### 5.1 If an IM platform was set up

Guide user to send a test message in the platform they chose:
- **DingTalk**: Search for the bot by app name, send 'hello'
- **Feishu**: Find the app in Workspace or search, send 'hello'
- **QQ**: Find the bot, send a message
- **Discord**: Go to the server, @mention or DM the bot

Success = bot responds coherently.

### 5.2 If all IM platforms were skipped — use Browser MCP

Use the browser MCP to open the OpenClaw web console with the token pre-filled.
This avoids the auth lockout caused by manual token entry failures.

**Step 1 — Read the gateway token from config:**

macOS / Linux:
```bash
python3 -c "
import json
with open('$HOME/.openclaw/openclaw.json') as f:
    d = json.load(f)
print(d.get('gateway', {}).get('auth', {}).get('token', 'not found'))
"
```

Windows (PowerShell):
```powershell
$config = Get-Content "$env:USERPROFILE\.openclaw\openclaw.json" | ConvertFrom-Json
$config.gateway.auth.token
```

**Step 2 — Open console via browser with token:**
```
browser.navigate("http://127.0.0.1:18789?token=GATEWAY_TOKEN_HERE")
```
Tell the user: "I'm opening the OpenClaw console for you now..."

**Step 3 — Send a test message in the console**

Success = agent responds coherently.

If the console shows "unauthorized: too many failed authentication attempts":
```
openclaw gateway restart
```
Then retry Step 2.

### 5.3 Success Message

```
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  OpenClaw is ready!
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  AI Model:    [Provider + version]
  Skills:      [X] skills installed
  Chat via:    [DingTalk / Feishu / QQ / Discord / Web Console]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
```

---

## Phase 6 — Usage Tutorials (Optional)

After verification, ask:
> "Would you like a quick tutorial for any of the skills you just installed?"

Provide 3 example prompts per skill.

### summarize
- "Summarize this article: [paste URL]"
- "Give me the key points of this document" (attach a file)
- "What are the main takeaways?" (paste any text)

### weather
- "What's the weather in Beijing today?"
- "Will it rain in Shanghai this week?"
- "Give me a 3-day forecast for Hangzhou"

### agent-browser
- "Go to sspai.com and tell me the top 3 articles today"
- "Check if there are any new announcements on [website]"
- "Extract the product list from this page: [URL]"

### proactive-agent
- "Every morning at 8am, give me today's weather and top news"
- "Remind me every Monday to review my weekly tasks"
- "Check this website every day and alert me if the price drops below 500 yuan"

### a-share-real-time-data
- "What's the current price of 000001 (Ping An Bank)?"
- "Show me today's real-time data for 600036"
- "Get the last 5 trading days of bar data for 300750"

### stock-evaluator
- "Evaluate 600519 (Moutai) — is it a buy right now?"
- "Give me a technical and fundamental analysis of BYD stock"
- "Should I hold or sell 000858 based on current indicators?"

### self-improving-agent
- "Learn from our last 10 conversations and tell me how I can use you better"
- "What patterns have you noticed in the tasks I ask you?"
- "Optimize yourself based on what's been most useful to me"

### obsidian
- "Create a new note called 'Project Ideas' in my vault"
- "Search my notes for anything related to Q2 planning"
- "Add today's meeting summary to my Daily Notes"

---

## Error Handling Reference

| Error | Plain explanation | Fix |
|-------|------------------|-----|
| SyntaxError: Unexpected token | Node.js version too old | Upgrade to Node 22 via nvm/fnm |
| EACCES: permission denied | npm install folder issue (macOS/Linux) | Run npm-global fix in Phase 1 |
| gateway.mode required / allow-unconfigured | Config missing gateway section | Add `gateway.mode: "local"` to config |
| Timed out waiting for gateway | Gateway didn't start | Check config file, run `openclaw doctor` |
| device token mismatch | Config corrupted after update | Run `openclaw gateway reset` |
| pairing required | Need to re-pair after update | Run `openclaw pairing approve` |
| 401 Unauthorized from DingTalk bot | gatewayToken missing or wrong | Check channels.dingtalk-connector.gatewayToken matches gateway.auth.token |
| 405 Method Not Allowed | chatCompletions endpoint not enabled | Add `gateway.http.endpoints.chatCompletions.enabled: true` |
| dingtalk-connector not in plugins list | plugins.allow not set | Add "dingtalk-connector" to plugins.allow array |
| npm install stuck / slow | npm registry slow from China | Already set npmmirror — retry |
| running scripts is disabled (Windows) | ExecutionPolicy blocking scripts | Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned |
| not recognized as cmdlet | fnm or openclaw not in PATH | Reload PATH from Phase 1-win steps |
| GitHub 403 rate limit on clawhub install | GitHub API anonymous rate limit exceeded | Use manual SKILL.md download fallback in Phase 3 |
| auto-restart attempt loop (DingTalk) | Plugin lifecycle incompatibility | Update plugin, see Phase 4.4 |
| too many failed authentication attempts | Web console auth lockout | Run `openclaw gateway restart`, then open with token via browser |
| Feishu bot not responding | App not published or permissions missing | Check all 4 permissions are enabled, app is published and approved |
| Feishu `im.message.receive_v1` not firing | Event subscription not configured | Ensure WebSocket long connection mode selected, event added |
| QQ `insufficient scope` or bot silent | IP whitelist missing your IP | Add server/computer public IP to QQ bot whitelist |
| QQ bot credentials invalid | Secret copied wrong or expired | Re-create bot secret on QQ Open Platform |
| Discord bot not responding | Message Content Intent not enabled | Enable Message Content Intent in Bot settings |
| Discord `Missing Access` | Bot not invited or missing permissions | Re-generate invite URL with Send Messages + Read Message History |
| health check returns connection refused | Gateway not running or wrong port | Run `openclaw gateway status`, restart if needed |

For any error not listed:
1. Run `openclaw doctor --fix`
2. Run `openclaw logs --tail 50`
3. Explain the last error line in plain language
4. Suggest next step

---

## Post-Installation — Daily Maintenance Quick Reference

After OpenClaw is installed and running, users may come back to ask for help with
day-to-day maintenance. Use this section as a quick reference to handle common
post-installation requests.

### Health Check — "Is my OpenClaw still running?"

Run these in order and report res

…(truncated)
