Agent skill

Channel Manager

by open-octo in open-octo/octo-agent

Configure IM platform channels (Feishu, Weixin/WeChat, WeCom, DingTalk, Discord, Telegram) for octo.

MITAuto-check passedProductivity & Automation

Install Channel Manager

skills CLI
$ npx skills add open-octo/octo-agent --skill channel-manager -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install open-octo/octo-agent channel-manager --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/open-octo/octo-agent.git skills-src && mkdir -p .claude/skills && cp -r skills-src/internal/skills/defaults/channel-manager .claude/skills/channel-manager && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
channel-manager
GitHub stars
125
Token cost
~6.2k tokens
SKILL.md length
2,870 words
Files
1
Skills in repo
40
Repo updated
First seen
Licence
MIT

At a glance

Configure IM platform channels (Feishu, Weixin/WeChat, WeCom, DingTalk, Discord, Telegram) for octo.

  • Works in 7 steps: Create the app → Enable Bot capability → Get credentials → …
  • : channel setup
  • SKILL.md covers Terminology, How channels work in octo, Hot-reload after config change and Command Parsing, plus 5 more sections
  • Calls curl; reaches discord.com and open.feishu.cn; needs APP_SECRET and CLIENT_SECRET

What it does

Channel Manager is an agent skill from open-octo/octo-agent. Configure IM platform channels (Feishu, Weixin/WeChat, WeCom, DingTalk, Discord, Telegram) for octo. Guides the user through platform consoles, collects credentials, writes ~/.octo/channels.yml, and diagnoses connection problems. Trigger on: "channel setup", "setup feishu", "setup weixin", "setup wechat", "setup wecom", "setup dingtalk", "setup discord", "setup telegram", "channel config", "channel status", "channel enable", "channel disable", "channel doctor", "connect feishu", "connect wechat", "connect wecom"…

Its SKILL.md is about 6.2k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Productivity & Automation, covering Messaging and chat bots. It works with WeChat, Feishu (Lark), Discord and Telegram. The repository describes itself as: Open-source, single-binary, self-hosted AI agent — your models and data stay on your machine. A coding agent on par with Claude Code and a personal assistant lighter than… The licence is MIT.

When your agent uses it

  • : channel setup
  • Channel disable
  • Connect dingtalk
  • Connect discord

Example prompts

  • “channel setup”
  • “setup feishu”
  • “setup weixin”
  • “/channel-manager”

Requirements

  • A credential in APP_SECRET

Workflow steps

7 steps, taken from the step headings in SKILL.md.

  1. Create the app
  2. Enable Bot capability
  3. Get credentials
  4. Add message permissions
  5. Validate and save
  6. Configure event subscription (Long Connection)
  7. Publish

What it can do on your machine

Read from SKILL.md and the folder at commit 81448b2. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • curl

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • discord.com
    • open.feishu.cn
    • ilinkai.weixin.qq.com
    • api.telegram.org
    • api.dingtalk.com
    • github.com

    Also links to:

    • open-dev.dingtalk.com
    • work.weixin.qq.com
    • t.me

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names these keys or tokens, usually read from environment variables:

    • APP_SECRET
    • CLIENT_SECRET
    • BOT_TOKEN

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Channel Manager loads about 6.2k tokens when it runs. Until then it costs about 193 tokens; SKILL.md has 2,870 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~193
When it runs · the whole SKILL.md, loaded when a task matches
~6.2k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from open-octo/octo-agent at commit 81448b2, republished under its MIT licence (© open-octo). 2,870 words, ~6,244 tokens.

Download SKILL.mdSave it as .claude/skills/channel-manager/SKILL.md (or your agent's skills folder).
name
channel-manager
description
Configure IM platform channels (Feishu, Weixin/WeChat, WeCom, DingTalk, Discord, Telegram) for octo. Guides the user through platform consoles, collects credentials, writes ~/.octo/channels.yml, and diagnoses connection problems. Trigger on: "channel setup", "setup feishu", "setup weixin", "setup wechat", "setup wecom", "setup dingtalk", "setup discord", "setup telegram", "channel config", "channel status", "channel enable", "channel disable", "channel doctor", "connect feishu", "connect wechat", "connect wecom", "connect dingtalk", "connect discord", "connect telegram", "配置飞书", "设置微信", "接入企业微信", "配置钉钉", "连接飞书", "渠道设置", "渠道状态", "启用渠道", "禁用渠道", "渠道诊断", "绑定飞书机器人", "配置 IM 渠道". Subcommands: setup, status, enable <platform>, disable <platform>, doctor.
system
true

Channel Manager Skill

Terminology

When conversing in Chinese, refer to a user-created agent profile as 专家 (not 智能体) when asking whether to bind a channel instance to one — matches the desktop/web UI's Chinese labels. English conversations keep "agent".

Configure IM platform channels for octo. Supported platforms: feishu, weixin, wecom, dingtalk, discord, telegram.

How channels work in octo

  • Config lives in ~/.octo/channels.yml (YAML, mode 600). Edit it directly with read_file / write_file.
  • The server API is written 127.0.0.1:8088 throughout this skill, the default address. If the Environment section has an Octo server: line, use that address in every command instead.
  • Each platform can have multiple bot instances — e.g. 3 Feishu bots in one group, each bound to a different expert agent. Instances are named; the name becomes the adapter_id used in profile channel_bindings.
  • Adapters run inside octo serve, started alongside the HTTP server (skip with --no-channel). Config changes are applied on save via POST /api/channels/<platform> — no full restart needed.
  • Weixin login state lives separately in ~/.octo/weixin-credentials.json, written by the QR-login flow this skill drives (POST /api/channels/weixin/login on the running serve).

channels.yml schema (multi-instance):

yaml
channels:
  feishu:
    - name: code-review-bot       # instance name (adapter_id); omit for single-instance
      enabled: true | false
      app_id: string              # required
      app_secret: string          # required
      domain: string              # optional, default https://open.feishu.cn
      allowed_users: string       # optional, comma-separated user IDs; empty = allow all
    - name: ops-bot               # second instance, same platform
      enabled: true
      app_id: ...
      app_secret: ...
  weixin:
    - enabled: true | false
      token: string               # bot token; optional if cred_path exists
      cred_path: string           # optional, default ~/.octo/weixin-credentials.json
      base_url: string            # optional, default https://ilinkai.weixin.qq.com
      allowed_users: string
  dingtalk:
    - name: ...                   # optional
      enabled: true | false
      client_id: string           # required (AppKey)
      client_secret: string       # required (AppSecret)
      allowed_users: string
  wecom:
    - name: ...
      enabled: true | false
      bot_id: string              # required, intelligent robot Bot ID (starts with "aib")
      secret: string              # required, robot secret
      allowed_users: string
  discord:
    - name: ...
      enabled: true | false
      bot_token: string           # required, from the Discord Developer Portal
      allowed_users: string
  telegram:
    - name: ...
      enabled: true | false
      bot_token: string           # required, from @BotFather
      base_url: string            # optional, default https://api.telegram.org
      parse_mode: string          # optional, default "Markdown"; empty string disables
      allowed_users: string

New instance on an existing platform: append another - entry under the platform key with a unique name. The name field is the adapter_id; single-instance setups can omit it (the platform name is used as the default).

Hot-reload after config change

After writing channels.yml, apply the change without a full restart:

bash
curl -s -X POST "http://127.0.0.1:8088/api/channels/<platform>/reload"
  • HTTP 200 → the adapter started immediately. Done.
  • Connection refused → the server isn't running. Ask to start it with octo serve.

Use this in place of restart_server throughout this skill. The tool is no longer available in the desktop build (the server runs in-process with no supervisor), so hot-reload via the API is the only zero-downtime path.


Command Parsing

User saysSubcommand
channel setup, setup feishu, setup weixin, setup wechat, setup wecom, setup dingtalk, setup discord, setup telegramsetup
channel statusstatus
channel enable <platform>enable
channel disable <platform>disable
channel doctordoctor

status

  1. Read ~/.octo/channels.yml. If missing or empty: "No channels configured yet. Run /channel-manager setup to get started." and stop.
  2. Check whether the server (which hosts the adapters) is responding:
    bash
    curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:8088/api/health
    200 → RUNNING. Non-200 / connection refused → STOPPED.

    Do NOT use pgrep -f "octo.*serve": the server process is named octo-desktop in the desktop build and won't match. The health check works uniformly across octo serve, desktop, and TUI-hosted serves.

  3. Display:
Channel Status                       (adapter process: RUNNING/STOPPED)
─────────────────────────────────────────────────────
Platform   Enabled   Details
feishu     ✅ yes    app_id: cli_xxx…
weixin     ✅ yes    credentials: present
dingtalk   ❌ no     (not configured)
─────────────────────────────────────────────────────
  • Feishu: show app_id truncated to 12 chars.
  • Weixin: show whether token is set or a credential file exists (cred_path, else ~/.octo/weixin-credentials.json). Never print the token value.
  • DingTalk: show client_id truncated to 12 chars. Never print client_secret.
  • WeCom: show bot_id truncated to 12 chars. Never print secret.
  • Discord: show whether bot_token is set (token: present). Never print the token value.
  • Telegram: show whether bot_token is set (token: present). Never print the token value.

If the process is STOPPED but at least one platform is enabled, ask: "octo serve 未运行,是否现在启动?" If the user agrees and you can start it safely, run octo serve in the background. If it is RUNNING but started before a recent config change, trigger a hot reload (see "Hot-reload after config change") so the new config takes effect without a restart.


setup

Ask which platform to connect. ask_user_question takes at most 4 options, so ask it in two steps rather than cramming all six in: first the family, then the platform within it.

Which platform would you like to connect?

  1. Feishu (飞书)
  2. Telegram (Bot API)
  3. Discord
  4. Something else (WeChat, WeCom, DingTalk)

If they pick "Something else", ask again with those three:

Which one?

  1. Weixin (Personal WeChat via iLink QR login)
  2. WeCom (企业微信 intelligent robot)
  3. DingTalk (钉钉)

After a platform is chosen, ask whether this is a new configuration or an additional instance on an existing platform:

Is this a new platform setup, or adding another bot instance to an existing one?

(If the platform isn't configured yet, skip this question.)

Adding an instance to an existing platform: append a new - entry under the platform key with a name. Ask the user for a name (e.g. "code-review-bot", "ops-bot"), then proceed to the platform-specific credentials steps below. The name is the adapter_id — it appears in InboundEvent and is used for profile channel_bindings.

After credentials are validated and saved, ask:

Do you want to bind this bot instance to an expert agent? If yes, which agent?

List the available agents via GET /api/agents. When the user picks one, call POST /api/agents/:id/bind with {"platform": "<platform>", "adapter_id": "<name>", "chat_id": "<group or DM id>"}. The adapter_id must match the instance name in channels.yml.

Unbinding — when the user asks to unbind (解绑 / 改回默认 agent / 换回默认):

Call DELETE /api/agents/:id/bind with the same body {"platform": "<platform>", "adapter_id": "<name>", "chat_id": "<group or DM id>"}. The match is exact on all three fields (platform, adapter_id, chat_id) — the chat_id for a DM is the user's IM id (e.g. the weixin user_id from the login response). After the call the agent's channel_bindings no longer contains that entry and the chat falls back to the default agent. Confirm success by checking the response — the returned agent JSON must not list the removed binding.

The chat_id to use for unbind is the same one used at bind time. If you don't have it handy, list the agent via GET /api/agents/:id and read channel_bindings for the exact platform / adapter_id / chat_id triple.

Feishu setup
Phase 1 — Create the app
  1. Tell the user to open https://open.feishu.cn/app (log in if needed), then: "Click 'Create Enterprise Self-Built App' (创建企业自建应用), fill in a name (e.g. octo) and description, and submit. Reply done." Wait for "done". Always create a new app — do NOT reuse existing apps.
Phase 2 — Enable Bot capability
  1. "On the Add App Capabilities page, find the Bot (机器人) card and click Add. Reply done." Wait for "done".
Phase 3 — Get credentials
  1. "Open 'Credentials & Basic Info' (凭证与基础信息) in the left menu, copy App ID and App Secret, and paste them here as: App ID: xxx, App Secret: xxx". Parse app_id and app_secret from the reply.
Phase 4 — Add message permissions
  1. "Open 'Permission Management' (权限管理) → bulk import (批量导入), clear the example content, paste the JSON below, and confirm. Reply done." Wait for "done".
json
{
  "scopes": {
    "tenant": [
      "im:message",
      "im:message.p2p_msg:readonly",
      "im:message:send_as_bot"
    ],
    "user": []
  }
}
Phase 5 — Validate and save
  1. Validate the credentials:
    bash
    curl -s -X POST "https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal" \
      -H "Content-Type: application/json" \
      -d '{"app_id":"<APP_ID>","app_secret":"<APP_SECRET>"}'
    Check for "code":0. On failure show the error and re-ask for credentials (up to 3 tries).
  2. Merge into ~/.octo/channels.yml (preserve other platforms), then chmod 600 ~/.octo/channels.yml:
    yaml
    channels:
      feishu:
        - name: <NAME>             # user-chosen instance name
          enabled: true
          app_id: <APP_ID>
          app_secret: <APP_SECRET>
Phase 6 — Configure event subscription (Long Connection)

CRITICAL: octo's Feishu adapter uses a WebSocket long connection, and Feishu refuses to save the long-connection event config until a client is connected. So the adapter must be running first.

  1. Tell the user to (re)start octo serve and wait until the log prints [feishu] connected to WebSocket.
  2. "In 'Events & Callbacks' (事件与回调), select 'Long Connection' (长连接) mode and save. Then click Add Event, search im.message.receive_v1, and add it. Reply done." Wait for "done".
Phase 7 — Publish
  1. "Open 'Version Management & Release' (版本管理与发布), create a version (e.g. 1.0.0) and publish it. Reply done." Wait for "done".
  2. "✅ Feishu channel configured." Trigger a hot reload (see "Hot-reload after config change") so the new adapter starts immediately. If the server isn't running, ask the user to start octo serve first. Then say: "Find the bot in Feishu and send it a message."

Weixin uses a QR-code login — no app credentials needed.

Do NOT pgrep for octo serve before this flow — on desktop the server runs as octo-desktop and won't match. Just call the API; if it fails with connection refused, then offer to start the server.

  1. Start the QR login flow via the serve API (the response carries the QR link):
    bash
    curl -s -X POST http://127.0.0.1:8088/api/channels/weixin/login
    # → {"status":"pending","qr_url":"https://…"}      (or "already_logged_in")
    Pass -d '{"force":true}' to re-login over existing credentials.
  2. If the response is already_logged_in:
    • Do not tell the user the credentials are definitely valid. The cached token may have expired.
    • Say: "检测到本地已保存微信登录态,但无法确认是否仍有效。是否重新扫码登录?(回复 重新登录 强制重新扫码,回复 继续 直接复用当前登录态)"
    • If the user replies 重新登录, call POST /api/channels/weixin/login with -d '{"force":true}' and continue from step 3.
    • If the user replies 继续 (or any other confirmation), proceed to step 4.
  3. Relay the QR link to the user:

    Open this link and scan the QR code with WeChat, then confirm login in the app: <qr_url from the response>

  4. Poll until the flow finishes (every ~3s, up to 5 minutes):
    bash
    curl -s http://127.0.0.1:8088/api/channels/weixin/login
    • "status":"done" — credentials are saved to ~/.octo/weixin-credentials.json. Continue.
    • "status":"pending" with a new qr_url — the QR expired and was refreshed; relay the new link.
    • "status":"failed" — show the error and offer to retry from step 1. This agent-driven flow is the only way to log in; the web Channels panel intentionally has no inline QR button.
  5. Enable the platform in ~/.octo/channels.yml (preserve other platforms), then chmod 600:
    yaml
    channels:
      weixin:
        - enabled: true
    The adapter reads ~/.octo/weixin-credentials.json automatically; only set cred_path if the user keeps credentials elsewhere.
  6. After writing channels.yml, trigger a hot reload (see "Hot-reload after config change") so the new adapter starts immediately. If the server isn't running, tell the user to start octo serve.
  7. "✅ Weixin channel configured. Once octo serve is running, message the bot on WeChat."
DingTalk setup
  1. Tell the user to open https://open-dev.dingtalk.com/ (log in if needed), then: "Create an internal app (企业内部应用): Application Development → Create Application. Reply done." Wait for "done".
  2. "In the app, open 'Add Application Capabilities' (添加应用能力) and add the Bot (机器人) capability. In the bot's message receiving mode, select Stream mode (Stream 模式) — octo connects over a WebSocket stream, no callback URL needed. Save/publish the capability. Reply done." Wait for "done".
  3. "Open 'Credentials & Basic Info' (凭证与基础信息), copy Client ID (AppKey) and Client Secret (AppSecret), and paste them here as: Client ID: xxx, Client Secret: xxx". Parse the reply.
  4. Validate:
    bash
    curl -s -X POST "https://api.dingtalk.com/v1.0/oauth2/accessToken" \
      -H "Content-Type: application/json" \
      -d '{"appKey":"<CLIENT_ID>","appSecret":"<CLIENT_SECRET>"}'
    Success returns an accessToken field. On failure show the error and re-ask (up to 3 tries).
  5. Merge into ~/.octo/channels.yml (preserve other platforms), then chmod 600:
    yaml
    channels:
      dingtalk:
        - name: <NAME>
          enabled: true
          client_id: <CLIENT_ID>
          client_secret: <CLIENT_SECRET>
  6. Trigger a hot reload (see "Hot-reload after config change"). If the server isn't running, remind the user to start octo serve. Then say: "✅ DingTalk channel configured. Publish the app version if you haven't, then message the robot in DingTalk."
Show full SKILL.md (1,240 more words)Show less
WeCom setup (企业微信 intelligent robot)

WeCom "API mode" intelligent robots connect over a WebSocket long connection — no public callback URL needed.

  1. Tell the user to open https://work.weixin.qq.com/wework_admin/frame#/aiHelper/create (scan to log in if needed), then: "Scroll to the bottom of the right panel and click 'API mode creation' (API 模式创建). Reply done." Wait for "done".
  2. "Click 'Add' next to 'Visible Range' (可见范围), select the top-level company node, and confirm. Reply done." Wait for "done".
  3. "If the Secret is not visible, click 'Get Secret' (获取 Secret). Copy the Bot ID and Secret before clicking Save, and paste them here as: Bot ID: xxx, Secret: xxx". Parse the reply. Trim whitespace; the bot_id starts with aib — if the two values look swapped, swap them back.
  4. "Click Save, enter a name (e.g. octo) and description, confirm, and click Save again. Reply done." Wait for "done".
  5. Merge into ~/.octo/channels.yml (preserve other platforms), then chmod 600:
    yaml
    channels:
      wecom:
        - name: <NAME>
          enabled: true
          bot_id: <BOT_ID>
          secret: <SECRET>
    There is no public REST endpoint to pre-validate these credentials — they are checked when the WebSocket subscribes. After octo serve starts, an invalid pair logs [wecom] authentication failed.
  6. Trigger a hot reload (see "Hot-reload after config change"). If the server isn't running, remind the user to start octo serve. Then say: "✅ WeCom channel configured. Find the bot in the WeCom client under Contacts → Smart Bot (智能机器人) and message it."
Discord setup

Discord requires manual portal interaction (hCaptcha gates application creation). Guide the user through the portal in one round-trip.

  1. Tell the user to open https://discord.com/developers/applications, then give all of the following in a single message and collect the values from their plain reply. Don't reach for ask_user_question here — it needs 2-4 discrete choices, and a token has none:

    1. Click New Application (top-right), name it (e.g. "octo"), accept the ToS, click Create.
    2. In the left nav click Bot.
    3. Scroll to Privileged Gateway Intents and turn on MESSAGE CONTENT INTENT, then Save Changes.
    4. Scroll up, click Reset Token → Yes, do it! → Copy. (The token is shown only once — copy before navigating away.)
    5. In the left nav click General Information and copy the Application ID.

    Paste both back as one line: token=YOUR_BOT_TOKEN app_id=YOUR_APPLICATION_ID

    If the user chats in a non-English language, append the localized label in parens after each bolded English button name (the English label is what they physically click). Parse with tolerant matching (token=\S+, app_id=\d+); if either field is missing, re-ask with the same format reminder (up to 3 tries).

  2. Validate the token:

    bash
    curl -s -H "Authorization: Bot <BOT_TOKEN>" \
      -H "User-Agent: DiscordBot (https://github.com/open-octo/octo-agent, 1.0)" \
      https://discord.com/api/v10/users/@me

    Success returns the bot user JSON with an id. A 401 means a bad token — re-ask.

  3. Merge into ~/.octo/channels.yml (preserve other platforms), then chmod 600:

    yaml
    channels:
      discord:
        - name: <NAME>
          enabled: true
          bot_token: <BOT_TOKEN>
  4. Build the invite URL with the Application ID and tell the user to open it: https://discord.com/oauth2/authorize?client_id=<APP_ID>&scope=bot&permissions=274878220912

    Pick your server from the dropdown → Continue → Authorize. If the dropdown is empty you don't have a server yet — open https://discord.com/channels/@me, click the + button → Create My Own, then re-open the invite link.

  5. Trigger a hot reload (see "Hot-reload after config change"). If the server isn't running, remind the user to start octo serve. Then say: "✅ Discord channel configured. @-mention the bot in a channel or DM it."

Telegram setup (Bot API)

Telegram is the simplest — no browser automation, no QR. The user creates a bot via @BotFather and pastes the token.

  1. Tell the user:

    Open Telegram and chat with @BotFather (https://t.me/BotFather). Send /newbot, pick a display name and a username ending in bot. BotFather replies with an HTTP API token like 123456789:ABCdefGhIJKlmNoPQRsTUVwxyZ. Paste the token here.

    Optional: if your network blocks api.telegram.org, also give me the base URL of your self-hosted Bot API server.

    Parse the token (matches ^\d+:[\w-]{30,}$).

  2. Validate with getMe:

    bash
    curl -s "<BASE_URL_OR_https://api.telegram.org>/bot<TOKEN>/getMe"

    Success returns "ok":true. 401 Unauthorized means a wrong token — re-ask.

  3. Merge into ~/.octo/channels.yml (preserve other platforms; omit base_url unless the user gave one), then chmod 600:

    yaml
    channels:
      telegram:
        - name: <NAME>
          enabled: true
          bot_token: <TOKEN>
  4. Trigger a hot reload (see "Hot-reload after config change"). If the server isn't running, remind the user to start octo serve. Then say: "✅ Telegram channel configured. Open your bot in Telegram and send it a message."

    For group chats: disable Privacy Mode first (@BotFather → /mybots → Bot Settings → Group Privacy → Turn off), then remove and re-add the bot to the group — otherwise it cannot receive any group messages, including @-mentions.


enable / disable

  1. Read ~/.octo/channels.yml. If the platform has no entry (or required fields are missing), redirect to setup.
  2. Toggle enabled: true|false for that platform only; preserve every other field and platform.
  3. Write back, chmod 600 ~/.octo/channels.yml.
  4. Say "✅ <platform> channel enabled." / "❌ <platform> channel disabled.", then trigger a hot reload (see "Hot-reload after config change"). If the server isn't running, remind the user to start octo serve.

doctor

Check each item, report ✅ / ❌ with remediation:

  1. Config file — ~/.octo/channels.yml exists, is valid YAML, and has mode 600 (stat -f %Lp on macOS, stat -c %a on Linux).
  2. Required fields — for each enabled instance (list under each platform):
    • Feishu: app_id, app_secret non-empty.
    • Weixin: token non-empty, or a readable credential file (cred_path, else ~/.octo/weixin-credentials.json).
    • DingTalk: client_id, client_secret non-empty.
    • WeCom: bot_id (starts with aib), secret non-empty.
    • Discord: bot_token non-empty.
    • Telegram: bot_token non-empty. Also check that no two instances share the same name (adapter_id) across or within platforms.
  3. Feishu credentials (if enabled) — run the tenant_access_token curl from setup Phase 5; "code":0 → ✅, else ❌ "Feishu credentials rejected — re-run setup".
  4. DingTalk credentials (if enabled) — run the accessToken curl from setup step 4; accessToken present → ✅, else ❌ "DingTalk credentials invalid — re-run setup".
  5. Weixin credentials (if enabled) — credential file exists and contains a non-empty token → ✅, else ❌ "Re-run the weixin QR login (web Channels panel, or POST /api/channels/weixin/login)".
  6. Discord credentials (if enabled) — run the /users/@me curl from Discord setup step 2; an id in the response → ✅, else ❌ "Discord token invalid or revoked — re-run setup".
  7. Telegram credentials (if enabled) — run the getMe curl from Telegram setup step 2; "ok":true → ✅, else ❌ "Telegram token rejected by getMe — re-run setup".
  8. WeCom credentials (if enabled) — no public REST validation endpoint; check the octo serve output for [wecom] authentication failed → ❌ "WeCom credentials incorrect — re-run setup", or [wecom] connected, authenticating with no auth error → ✅.
  9. Serve process — use the health check from status (curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:8088/api/health); if no enabled platform, skip; if enabled but not running, ❌ "Run octo serve" (and ask to start it if the user agrees).
  10. Recorded issue (if serve is running) — query the live status instead of only grepping logs:
    bash
    curl -s http://127.0.0.1:8088/api/channels
    Each entry's issue field (omitted when healthy) carries the exact reason the adapter isn't running: an unregistered/misconfigured/invalid-config skip at startup, or a crash-and-restart status such as restarting (2/10) after crash: ... or gave up after 11 crashes: .... A non-empty issue → ❌, quote it verbatim, and point at the matching setup step; a "gave up" issue means retries are exhausted and the platform needs enable/disable + hot reload (or a config fix + full server restart) to try again — it will not recover on its own.

Security

  • Always mask secrets in output — show at most the first 4 and last 4 characters.
  • ~/.octo/channels.yml must be mode 600; fix with chmod 600 after every write.
  • Never echo app_secret, client_secret, secret, bot_token, or token values back to the user.

© open-octo, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in internal/skills/defaults/channel-manager of open-octo/octo-agent.

Open the folder on GitHubat commit 81448b2

Compare with similar skills

Channel Manager next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Channel Manager compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Channel Manager this skillopen-octo/octo-agent125—~6.2kAutomated safety check: PassMIT
Claude To Imop7418/Claude-to-IM-skill2.9k—~3.4kAutomated safety check: NotesMIT
Channel Managerclacky-ai/openclacky1.2k—~6.1kAutomated safety check: NotesMIT
Use Avibeavibe-bot/avibe622—~2.5kAutomated safety check: PassMIT
Easy Openclawdaheiai/easy-openclaw112—~1.7kAutomated safety check: NotesNone
Message Push0xranx/golembot323—~984Automated safety check: PassMIT

Similar skills

  • Claude To Im

    op7418/Claude-to-IM-skill

    Bridge THIS Claude Code or Codex session to Telegram, Discord, Feishu/Lark, QQ, or WeChat so the user can chat with Claude from their phone.

    2.9k GitHub stars~3.4k tokensUpdated 6 mo ago
    Productivity & AutomationAuto-check: notes
  • Channel Manager

    clacky-ai/openclacky

    Configure IM platform channels (Feishu, WeCom, Weixin, Discord, Telegram, DingTalk) for openclacky.

    1.2k GitHub stars~6.1k tokensUpdated today
    Productivity & AutomationAuto-check: notes
  • Use Avibe

    avibe-bot/avibe

    Safely inspect and modify local Avibe configuration, routing, runtime settings, watches, scheduled tasks, Avibe Cloud remote access, and operational state.

    622 GitHub stars~2.5k tokensUpdated today
    Productivity & AutomationAuto-check passed
  • Easy Openclaw

    daheiai/easy-openclaw

    OpenClaw 配置优化向导。采用“第 0 层测试观测(可选)+ 前 3 轮优化 + 第 4 轮接入扩展”流程:基础推荐层(含联网搜索与权限模式)、渠道增强层(Discord/Feishu/Telegram 分支优化)、Skills 推荐层(可执行可跳过)、新增渠道接入引导(可跳过)。用于帮助用户快速完成 OpenClaw 初始化或优化配置。用户说到“优化…

    112 GitHub stars~1.7k tokensUpdated 6 mo ago
    Productivity & AutomationAuto-check: notes
  • Message Push

    0xranx/golembot

    Send proactive messages to IM groups or individual users via the gateway Send API.

    323 GitHub stars~984 tokensUpdated 10 days ago
    Productivity & AutomationAuto-check passed
  • Feedback

    nexu-io/nexu

    Send feedback to the Nexu team. An agent skill from nexu-io/nexu.

    3.3k GitHub stars~660 tokensUpdated 5 mo ago
    Productivity & AutomationAuto-check: warnings

More from open-octo/octo-agent

All 40 skills in this repo
  • Image Gen

    open-octo/octo-agent

    Acquire images as files — generate them with an AI image model (14 providers: OpenAI/gpt-image, Gemini, Qwen, Zhipu, Volcengine, Stability, FLUX, Ideogram, MiniMax, and more), search openly-licensed…

    125 GitHub stars~3.1k tokensUpdated today
    Auto-check: notes
  • Office XLSX

    open-octo/octo-agent

    Create, read, and edit Excel (.xlsx) spreadsheets programmatically with openpyxl — cell values, formulas, styling (fonts/fills/borders/alignment/number formats), merged cells, multiple sheets…

    125 GitHub stars~1.8k tokensUpdated today
    Auto-check: notes
  • Artifact Design

    open-octo/octo-agent

    Design guidance for any HTML/Markdown file shown in octo's Artifacts panel — reports, dashboards, architecture/system diagrams, generated UIs, slide-style pages, 3D scenes.

    125 GitHub stars~2.7k tokensUpdated today
    Auto-check passed
  • Code Review

    open-octo/octo-agent

    Review local code changes. An agent skill from open-octo/octo-agent.

    125 GitHub stars~942 tokensUpdated today
    Auto-check passed
  • Ppt Master

    open-octo/octo-agent

    AI-driven multi-format SVG content generation system. An agent skill from open-octo/octo-agent.

    125 GitHub stars~23k tokensUpdated today
    Auto-check: warnings
  • Config Setup

    open-octo/octo-agent

    Configure octo's global settings through guided conversation — set up AI model endpoints (providers, API keys, models), adjust agent defaults (reasoning effort, permission mode, coauthor, workspace…

    125 GitHub stars~3.3k tokensUpdated today
    Auto-check passed

Questions about Channel Manager

What does Channel Manager do?

Configure IM platform channels (Feishu, Weixin/WeChat, WeCom, DingTalk, Discord, Telegram) for octo. Channel Manager is an agent skill from open-octo/octo-agent. Configure IM platform channels (Feishu, Weixin/WeChat, WeCom, DingTalk, Discord, Telegram) for octo.

When should I use Channel Manager?

Channel Manager fits situations like: : channel setup; channel disable; connect dingtalk; connect discord.

How do I install Channel Manager in Claude Code?

Run `npx skills add open-octo/octo-agent --skill channel-manager -a claude-code`. Or copy the skill folder (internal/skills/defaults/channel-manager in open-octo/octo-agent) into .claude/skills/channel-manager in your project. Claude Code loads it when a task matches its description.

How do I install Channel Manager in Codex?

Run `npx skills add open-octo/octo-agent --skill channel-manager -a codex`. Or copy the skill folder (internal/skills/defaults/channel-manager in open-octo/octo-agent) into .agents/skills/channel-manager in your project. Codex loads it when a task matches its description.

Can I use Channel Manager in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add open-octo/octo-agent --skill channel-manager -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/channel-manager, .gemini/skills/channel-manager, .github/skills/channel-manager and .opencode/skills/channel-manager in your project.

What does Channel Manager need to run?

Going by SKILL.md and its folder, Channel Manager needs the command-line tools its instructions call (curl) and credentials named APP_SECRET, CLIENT_SECRET and BOT_TOKEN. Our summary lists: A credential in APP_SECRET.

Does Channel Manager access the network?

SKILL.md names 9 domains. In commands or code: discord.com, open.feishu.cn, ilinkai.weixin.qq.com, api.telegram.org, api.dingtalk.com and github.com; the agent is likely to contact these when it follows the instructions. As links in the text: open-dev.dingtalk.com, work.weixin.qq.com and t.me. This is read from the text; nothing was executed.

Is Channel Manager safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Channel Manager use?

Channel Manager is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Channel Manager use?

About 6.2k tokens (SKILL.md is roughly 25k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Channel Manager?

Skills that share tags, products or a category with Channel Manager: Claude To Im (op7418/Claude-to-IM-skill, 2.9k stars), Channel Manager (clacky-ai/openclacky, 1.2k stars), Use Avibe (avibe-bot/avibe, 622 stars) and Easy Openclaw (daheiai/easy-openclaw, 112 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Channel Manager?

open-octo (a GitHub organization) maintains it in open-octo/octo-agent, which has 125 GitHub stars. The repository holds 40 skills in this directory. The repository was last updated on October 9, 2026.

Source: open-octo/octo-agent on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.