From double-wechat
Manage multiple WeChat instances on macOS via natural language — list / create / start / delete / update copies of WeChat.app. All operations run as the current user (no sudo required when the user is in the admin group). Backed by a local `double-wechat` shell binary.
How this skill is triggered — by the user, by Claude, or both
Slash command
/double-wechat:double-wechatThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
让 AI Agent 通过自然语言在 macOS 上管理多个微信实例——列出、创建、启动、删除、版本同步。底层是本地的 `double-wechat` shell 脚本,全程以当前用户身份运行,**不需要 sudo**。
让 AI Agent 通过自然语言在 macOS 上管理多个微信实例——列出、创建、启动、删除、版本同步。底层是本地的 double-wechat shell 脚本,全程以当前用户身份运行,不需要 sudo。
适用场景:
不适用:
/Applications/WeChat.app(永远只动副本)/Applications/WeChat.app 已正确安装admin 组、且 /Applications 可写(绝大多数 macOS 用户默认满足;不满足时 doctor 会明确报告)double-wechat 可执行文件 ≥ 2.0.0 且在 PATH 中
double-wechat.sh 可直接软链:ln -s "$PWD/double-wechat.sh" /usr/local/bin/double-wechatSkill 发行物按 host 注册(Claude Code skill / Codex CLI plugin);具体注册路径与命令见仓库 README。本文件保持 host-agnostic。
Skill 通过 shell 子命令 暴露能力。Agent 通过 host 提供的 shell 执行工具(如 Claude Code 的 Bash 工具)调用以下命令;所有数据输出走 stdout,所有日志走 stderr,因此可以直接用 --json 形式管道给 JSON 解析器。
double-wechat doctor [--json]用途:自检环境是否能让 Agent 无 sudo 跑写操作。Agent 应在每段会话起始调用一次(带 --json),缓存结果用于本会话——没必要重复调。
参数:
| 参数 | 说明 |
|---|---|
--json | 机器可读输出(推荐 Agent 使用) |
返回 JSON:
{
"version": "2.0.0",
"in_admin_group": true,
"applications_writable": true,
"original_wechat_present": true,
"original_wechat_owner": "herbertgao:staff",
"original_short_version": "4.1.9",
"original_build_version": "268575",
"sudo_required": false, // /Applications 不可写时为 true
"can_run_unprivileged": true, // false 时 Agent 不应继续调用写操作
"target_dir": "/Applications",
"legacy_owned_instances": [ // 旧版 sudo 创建的 root-owned 副本路径
"/Applications/WeChat0.app"
],
"legacy_migration_required": false, // legacy_owned_instances 非空时为 true
"migration_hint": "" // 非空时是一次性 chown 命令
}
Agent 行为约定:
can_run_unprivileged: false → 停止调用任何写操作(create/delete/update),向用户报告环境问题,提示用户参考 doctor 文本输出original_wechat_present: false → 提示用户先安装 WeChatsudo_required: true → 不要尝试 sudo,建议用户从 macOS"系统设置 → 用户与群组"把当前用户加入 admin 组legacy_migration_required: true → 不要替用户执行 sudo。把 migration_hint 字段中的命令原样展示给用户,告诉用户这是从旧版升级时的一次性迁移,让用户在他自己的终端里手动跑。跑完之后再调任何写操作double-wechat list [--json]用途:列出所有微信实例(原始 + 已创建的副本)及版本信息。只读、随时可调。
参数:
| 参数 | 说明 |
|---|---|
--json | 机器可读输出 |
返回 JSON:
{
"original": {
"path": "/Applications/WeChat.app",
"short_version": "4.1.9",
"build_version": "268575"
},
"instances": [
{
"number": "0",
"path": "/Applications/WeChat0.app",
"bundle_id": "com.tencent.xinWeChat0",
"short_version": "4.1.9",
"build_version": "268575",
"needs_update": false // true 表示版本与 original 不一致
}
]
}
典型使用:
instances.length 回答instances[].number),再选一个未用的(0–9 范围内)double-wechat create <0-9> [--no-launch] [--yes]用途:创建编号为 <n> 的微信副本(cp + 改 Bundle ID + adhoc 签名),默认创建后立即启动。
参数:
| 位置参 | 类型 | 说明 |
|---|---|---|
<n> | 0-9 单个数字 | 实例编号 |
| 选项 | 说明 |
|---|---|
--no-launch | 仅创建,不启动 |
--yes / -y | Agent 必加:覆盖已有同号实例时跳过交互确认;非交互环境下未传此参数会失败 |
Agent 行为约定:
list --json 确认编号未被占用;如果用户没指定编号,Agent 应自动从 0 开始挑第一个未用编号--yescan_run_unprivileged: false 时调用退出码:0 成功;1 操作失败;2 参数错误
double-wechat start <0-9>用途:启动已创建的副本。
参数:编号 0-9。
Agent 行为约定:
nohup 后台 fork,立即返回。Agent 不应等待界面就绪list 确认实例存在;不存在时本命令会报错并退出 1double-wechat delete <0-9> [--yes]用途:删除指定副本(先尝试 osascript 优雅退出运行中的实例,再 rm -rf)。
参数:
| 选项 | 说明 |
|---|---|
--yes / -y | Agent 必加:跳过交互确认;非交互环境下未传此参数会失败 |
Agent 行为约定(重要):
--yes 调用delete 删除原始 WeChat.app——本工具的 <0-9> 入参语义就是"副本编号",无法误删原始(参数校验拒绝非数字)double-wechat update [--all | <n>...] [--yes]用途:把版本与原始 WeChat 不一致的副本重建为最新版本(保留账号编号,不保留旧 app 内文件)。
参数:
| 形式 | 说明 |
|---|---|
--all | 更新所有 needs_update: true 的实例 |
<n>... | 显式指定编号列表,如 update 0 2 3 |
--yes / -y | Agent 必加:跳过交互确认 |
Agent 行为约定:
list --json,把 instances[].needs_update == true 的列表回报给用户,确认后再 update --all --yesosascript ... to quit 优雅退出,然后 rm -rf + 重新 cp/sign。用户登录态会丢失——Agent 应当在确认时提醒这一点sudo chown -R ... 行原样展示给用户,让用户先做一次性迁移以下用法不在 Agent 工具表内,请勿调用:
double-wechat(交互菜单,仅给人类用户)interactive_start / interactive_delete(菜单内部分支,期望从 stdin 读编号)如果不小心调用了无参形式,命令会进入交互菜单等待 stdin 输入并卡住。Agent 应总是带子命令调用。
| 项 | 约定 |
|---|---|
| 协议 | 纯 shell 子命令(无 MCP / 无 socket) |
| 数据输出 | stdout,--json 模式下为单行 JSON |
| 日志输出 | stderr,可被 Agent 安全忽略 |
| 退出码 | 0 成功 / 1 业务失败 / 2 参数错误 |
| 交互确认 | 写操作(create/delete/update)默认要 stdin 确认;Agent 必加 --yes |
| sudo | 不需要;如果 doctor 报告 sudo_required: true,不要绕过 |
| root 调用 | 写子命令(create/delete/update/start)会主动拒绝 EUID == 0。不要用 sudo 跑这些命令——root 创建的副本归 root 所有,会破坏后续无 sudo 操作 |
| 并发 | 不要并行调用写操作(同时改 /Applications 不安全);只读命令(list/doctor)可并行 |
/Applications/WeChat<0-9>.app,编号校验严格匹配 ^[0-9]$,无法逃逸目录~/Library/Containers/com.tencent.xinWeChat<n>/(macOS 沙箱按 Bundle ID 隔离),Agent 工具不读写这些路径codesign --sign -),仅本机有效,无法分发无参 double-wechat 仍是人类用户的交互菜单入口;启动时会自动检测版本差异并提示一键更新。子命令模式与菜单模式共享同一份核心实现(do_create_instance / do_start_instance / do_delete_instance),任何修复同时受益。
Agent 调用形态仅限子命令;遇到只用菜单完成的旧文档示例时,请翻译为对应子命令再执行。
例 1:用户问"我现在有几个微信"
1. Agent: double-wechat list --json
2. Agent → user: "你目前有 2 个微信副本(编号 0、1),都和原始 WeChat 4.1.9 (Build 268575) 同版本。"
例 2:用户说"再开一个"
1. Agent: double-wechat list --json
→ 发现已用编号 [0, 1]
2. Agent → user: "我准备创建 WeChat2 并启动,OK 吗?"
3. user: ok
4. Agent: double-wechat create 2 --yes
5. Agent → user: "WeChat2 已创建并启动 (PID: 12345)。"
例 3:用户说"原始微信升级了,副本都同步一下"
1. Agent: double-wechat list --json
→ 找到 needs_update=true 的实例 [0, 1]
2. Agent → user: "WeChat0 / WeChat1 都需要更新。重建会丢失这些副本里的登录态,需要重新扫码。继续吗?"
3. user: 继续
4. Agent: double-wechat update --all --yes
5. Agent → user: "已更新 2 个实例,全部成功。"
例 4:用户说"删掉 WeChat3"
1. Agent: double-wechat list --json
→ 确认 WeChat3 存在
2. Agent → user: "确认删除 WeChat3.app?这会丢失该实例里的登录态和聊天记录。"
3. user: 是
4. Agent: double-wechat delete 3 --yes
5. Agent → user: "WeChat3.app 已删除。"
Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub herbertgao/double-wechat --plugin double-wechat