weclaude 0.1.2 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +79 -0
- package/README.md +59 -10
- package/config.example.jsonc +0 -1
- package/dist/cli/init.js +1 -1
- package/dist/cli/init.js.map +1 -1
- package/package.json +2 -3
- package/docs/DESIGN-INIT.md +0 -125
- package/docs/ONBOARDING.md +0 -118
package/CLAUDE.md
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# CLAUDE.md
|
|
2
|
+
|
|
3
|
+
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
|
4
|
+
|
|
5
|
+
## What this project is
|
|
6
|
+
|
|
7
|
+
`weclaude` (CLI `weclaude`) bridges Claude Code and WeCom (企业微信) smart bots:
|
|
8
|
+
- **PreToolUse approval forwarding**: every tool call is gated by a button card pushed to WeCom; clicking ✅/❌/⏱ resolves the long-poll the hook is parked on.
|
|
9
|
+
- **Remote `/wrc`**: messages sent to the bot drive a local Claude (headless `claude -p` or mirroring an interactive session).
|
|
10
|
+
- **MCP server** (`wecom`): exposes `send_markdown` / `send_card` / `ask_user` / `daemon_status` tools that talk to the resident daemon over loopback HTTP.
|
|
11
|
+
|
|
12
|
+
## Build / run
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
npm run build # tsc → dist/, then chmod +x on the three bin entry scripts
|
|
16
|
+
npm run typecheck # tsc --noEmit
|
|
17
|
+
npm run dev:daemon # tsx daemon/index.ts (no install / hot iteration)
|
|
18
|
+
npm run dev:cli # tsx cli/weclaude.ts
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
There are **no tests**. Don't fabricate test commands.
|
|
22
|
+
|
|
23
|
+
Local dev loop:
|
|
24
|
+
```bash
|
|
25
|
+
npm run build && weclaude reload # rebuild, then bounce the resident daemon
|
|
26
|
+
weclaude logs -f # tail ~/.weclaude/daemon.log
|
|
27
|
+
weclaude status # HTTP /status — wsConnected, pending count, sourcePath
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## High-level architecture
|
|
31
|
+
|
|
32
|
+
Three processes, all coordinating via 127.0.0.1:17890 and `~/.weclaude/`:
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
WeCom ── WS ──► daemon (resident, launchd/systemd --user)
|
|
36
|
+
│
|
|
37
|
+
├── HTTP :17890 ───────► hook (pre-tool-use.sh, blocking long-poll)
|
|
38
|
+
├── HTTP :17890 ───────► MCP server (stdio child of claude)
|
|
39
|
+
└── spawn `claude -p` ── headless bridge (or tail jsonl + tmux paste = mirror)
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
**daemon** (`daemon/`) is the only process that holds the WeCom WSClient. Everything else is a thin HTTP client of it.
|
|
43
|
+
- `index.ts` wires modules; route handlers are registered onto the http server returned by `startHttp`.
|
|
44
|
+
- `ws.ts` owns the `@wecom/aibot-node-sdk` `WSClient`. Fatal auth/reconnect → `process.exit(1)` (launchd respawns).
|
|
45
|
+
- `approval.ts` builds the button card, parks an HTTP request via `pending.ts`, and resolves it on `event.template_card_event`. Three click outcomes: `allow` / `allow_window` (auto-allow N min for that session) / `deny`. `session-cache.ts` short-circuits repeats.
|
|
46
|
+
- `inbound.ts` routes `message.text` / `message.image` / `message.mixed` → either headless `cc-bridge.ts` or `mirror-bridge.ts`. Gates on `allowFrom`; one-shot exception is the bootstrap claim (see below).
|
|
47
|
+
- `cc-bridge.ts` (mode=headless) spawns `claude -p --output-format stream-json --verbose`, parses `assistant`/`stream_event` lines, and pumps text via `client.replyStream`. Per-principal queue serializes turns; session id is captured from the `system/init` line and persisted to `~/.weclaude/sessions.json` for `--resume`.
|
|
48
|
+
- `mirror-bridge.ts` (mode=mirror) tails `<projectsDir>/<encoded(cwd)>/<sid>.jsonl` and pushes new `assistant` content to a chat. Inbound injection is either `claude --resume <sid> -p` (writes a turn into the same jsonl) or `tmux paste-buffer` against a live TTY (only path that makes WeCom messages visible in the user's CLI window). `recentInjects` ring buffer suppresses the WeCom→CLI echo when tailing.
|
|
49
|
+
- `claim.ts` is a single-shot bootstrap: an exact-match magic phrase from any sender bypasses `allowFrom`, writes that principal as `defaultChat`, and appends to `allowFrom`. This is the **only** legitimate ingress for first-time setup.
|
|
50
|
+
|
|
51
|
+
**Configuration** (`shared/config.ts`):
|
|
52
|
+
- Loaded by every binary via `loadConfig()`. Resolution order: explicit arg → `$WECLAUDE_CONFIG` → `~/.weclaude/config.jsonc` → `~/.weclaude/config.json`.
|
|
53
|
+
- Secrets (`bot.botId`, `bot.secret`) live in `~/.weclaude/secrets.json` and are deep-merged on top of the main config — keeps secrets out of dotfile repos.
|
|
54
|
+
- Schema is zod (`ConfigSchema`); shape mismatches throw with a path-pointed error.
|
|
55
|
+
- `shared/config-writer.ts` is the only sanctioned way to mutate the on-disk jsonc — it preserves comments via `jsonc-parser` edits. `cli/init.ts` and `daemon/claim.ts` use it.
|
|
56
|
+
|
|
57
|
+
**Hook + sync**:
|
|
58
|
+
- `hooks/hooks.json` is registered automatically by Claude Code when the plugin is installed (uses `${CLAUDE_PLUGIN_ROOT}`).
|
|
59
|
+
- For non-plugin installs (`claude-internal` wrapper), `cli/sync.ts` writes the MCP server entry + `WECLAUDE_DAEMON_BASE` env into target `settings.json`s listed in `config.sync.targets`. **It deliberately strips legacy hook entries** — registering both the plugin's `hooks.json` AND a settings.json hook fires the hook twice per tool call (= duplicate cards). `~/.weclaude/sync.lock.json` tracks what was written so `--remove` is reversible.
|
|
60
|
+
|
|
61
|
+
**MCP server** (`mcp/server.ts`): stdio transport, completely stateless w.r.t. WeCom. Every tool just `POST`s to the daemon. Add a tool here AND a route handler in `daemon/`.
|
|
62
|
+
|
|
63
|
+
## Important patterns / pitfalls
|
|
64
|
+
|
|
65
|
+
- **PATH for spawn**: `cc-bridge.ts` and `mirror-bridge.ts` both `augmentedPath()` because launchd/systemd start the daemon with a stripped PATH that often lacks nvm/homebrew. If you spawn anything new from the daemon, do the same or it will ENOENT in production but work fine under `npm run dev:daemon`.
|
|
66
|
+
- **launchd respawn**: `KeepAlive.SuccessfulExit=false`. `weclaude reload` does `POST /shutdown` AND `launchctl kickstart`; just hitting `/shutdown` won't bounce the binary.
|
|
67
|
+
- **Uninstall order**: `weclaude uninstall` *before* `npm uninstall -g weclaude`. Otherwise launchd repeatedly tries to relaunch a deleted binary. State at `~/.weclaude/` is intentionally preserved.
|
|
68
|
+
- **Card update has a 5s window**: `client.updateTemplateCard` only works within 5s of the click event — `installApprovalEventListener` does the rewrite synchronously inside the event handler.
|
|
69
|
+
- **Mirror mode is `claude-internal`-gated** in `cli/weclaude.sh` (`require_claude_internal` walks the parent process chain) — be aware if you add subcommands that touch live sessions.
|
|
70
|
+
- **Long-poll timeouts**: hook curl `--max-time` (`approval.hookTimeoutSec`, default 1810) must be **strictly larger** than `approval.longPollSec` (default 1800), or the hook returns `ask` while the daemon is still waiting on a click.
|
|
71
|
+
- **Sensitive arg redaction** (`daemon/redact.ts`) runs before card render when `approval.sensitiveArgRedact=true`. Only the redacted form is shown in WeCom and stored in pending meta.
|
|
72
|
+
|
|
73
|
+
## Project conventions
|
|
74
|
+
|
|
75
|
+
`rules/chat.md` and `rules/code.md` (loaded from `~/develop/Guxi11/aiconfig/rules/`) take precedence over generic style. Highlights enforced in this codebase:
|
|
76
|
+
- Functional first: `map`/`filter`/`reduce`, deep-merge by recursion, immutable transforms; side effects pushed to module boundaries (file IO in `shared/`, child_process in bridges, network in `ws.ts` / `http.ts`).
|
|
77
|
+
- One function = one sentence. Helpers like `extractText`, `renderInput`, `decodeKey` are pure and testable in isolation; the IO-bearing functions wire them together.
|
|
78
|
+
- Comments in source files lean toward "why" (subtle invariants like the dual `event_key` path in `approval.ts`, the 5s update window, the dedup ring buffer). Preserve them on edits.
|
|
79
|
+
- Errors should never break the workflow: `approval.fallbackOnError` defaults to `ask`, every hook failure path emits `ask`, every WeCom send is wrapped in try/catch that logs and continues.
|
package/README.md
CHANGED
|
@@ -78,6 +78,65 @@ weclaude init
|
|
|
78
78
|
|
|
79
79
|
---
|
|
80
80
|
|
|
81
|
+
## 消息是怎么同步的
|
|
82
|
+
|
|
83
|
+
**审批流**(`headless` / `mirror` 都走这条):
|
|
84
|
+
|
|
85
|
+
```mermaid
|
|
86
|
+
sequenceDiagram
|
|
87
|
+
autonumber
|
|
88
|
+
participant CC as Claude Code
|
|
89
|
+
participant Hook as PreToolUse hook
|
|
90
|
+
participant D as weclaude daemon
|
|
91
|
+
participant WS as WeCom WS
|
|
92
|
+
participant U as 你 (IM)
|
|
93
|
+
|
|
94
|
+
CC->>Hook: 触发 Bash "rm -rf foo"
|
|
95
|
+
Hook->>D: POST /approval (长轮询 ≤30min)
|
|
96
|
+
D->>WS: sendCard(按钮卡片)
|
|
97
|
+
WS->>U: 推送审批卡片
|
|
98
|
+
Note over D,U: daemon 在内存里 park 这个 HTTP 请求<br/>等 click 事件 / 自动窗口 / 超时三选一
|
|
99
|
+
U->>WS: 点 ✅
|
|
100
|
+
WS->>D: template_card_event
|
|
101
|
+
D->>WS: updateTemplateCard("已允许")
|
|
102
|
+
D-->>Hook: 200 {decision: allow}
|
|
103
|
+
Hook-->>CC: stdout 决策 JSON
|
|
104
|
+
CC->>CC: 放行 Bash
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
**镜像流**(`mirror` 模式,IM ↔ tmux 双向):
|
|
108
|
+
|
|
109
|
+
```mermaid
|
|
110
|
+
sequenceDiagram
|
|
111
|
+
autonumber
|
|
112
|
+
participant U as 你 (IM)
|
|
113
|
+
participant WS as WeCom WS
|
|
114
|
+
participant D as weclaude daemon
|
|
115
|
+
participant T as tmux + claude
|
|
116
|
+
participant J as session.jsonl
|
|
117
|
+
|
|
118
|
+
U->>WS: "改成异步的"
|
|
119
|
+
WS->>D: message.text
|
|
120
|
+
D->>D: allowFrom 鉴权
|
|
121
|
+
D->>T: load-buffer + paste-buffer + Enter
|
|
122
|
+
T->>J: assistant 流式追加
|
|
123
|
+
par tail
|
|
124
|
+
D->>J: fs.watch 增量读
|
|
125
|
+
J-->>D: 新 assistant / tool_use 块
|
|
126
|
+
D->>WS: replyStream(流式片段)
|
|
127
|
+
WS->>U: 推送流式回复
|
|
128
|
+
and 工具拦截
|
|
129
|
+
T->>D: PreToolUse hook (走上面的审批流)
|
|
130
|
+
end
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
要点:
|
|
134
|
+
- daemon 是**唯一**和 WeCom 说话的进程,hook 和 MCP 都只是它的 HTTP 客户端
|
|
135
|
+
- 审批是**长轮询 + 内存 park**,没有 webhook、不依赖外网回调
|
|
136
|
+
- 镜像是**单向 paste + 单向 tail**:IM→tmux 走粘贴键,tmux→IM 走读 jsonl,两条管道独立、互不阻塞
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
81
140
|
## 常用命令
|
|
82
141
|
|
|
83
142
|
```bash
|
|
@@ -107,8 +166,6 @@ weclaude uninstall # 完整卸载(先于 npm uninstall)
|
|
|
107
166
|
**Q: 多机部署?**
|
|
108
167
|
`config.jsonc` 可以纳入 dotfiles;`secrets.json` 每台机器独立填。第二台机器跑 `weclaude init` 会跳过覆盖提示,但仍要重新走 claim 步骤拿本机 IM principal。
|
|
109
168
|
|
|
110
|
-
更多排错见 [docs/ONBOARDING.md](docs/ONBOARDING.md)。
|
|
111
|
-
|
|
112
169
|
---
|
|
113
170
|
|
|
114
171
|
## 架构一瞥
|
|
@@ -127,14 +184,6 @@ daemon 是**唯一**持有 WeCom WS 连接的进程,hook 和 MCP 都是它的
|
|
|
127
184
|
|
|
128
185
|
详情看 [CLAUDE.md](CLAUDE.md)。
|
|
129
186
|
|
|
130
|
-
---
|
|
131
|
-
|
|
132
|
-
## 文档
|
|
133
|
-
|
|
134
|
-
- [docs/ONBOARDING.md](docs/ONBOARDING.md) — 上手细节、排错、多机部署
|
|
135
|
-
- [docs/DESIGN-INIT.md](docs/DESIGN-INIT.md) — `init` 流程的设计取舍
|
|
136
|
-
- [CLAUDE.md](CLAUDE.md) — 给 Claude Code 看的项目地图
|
|
137
|
-
|
|
138
187
|
## License
|
|
139
188
|
|
|
140
189
|
MIT
|
package/config.example.jsonc
CHANGED
|
@@ -56,7 +56,6 @@
|
|
|
56
56
|
"longPollSec": 1800, // daemon long-poll
|
|
57
57
|
"sessionCacheMinutes": 30, // (session_id, tool, cmd_prefix_hash) → decision
|
|
58
58
|
"windowMinutes": 5, // 「⏱ N 分钟」按钮:开窗口期间所有请求自动 allow
|
|
59
|
-
"windowMinutes": 5, // 「⏱ N 分钟」按钮:开窗口期间所有请求自动 allow
|
|
60
59
|
"sensitiveArgRedact": true, // mask password/token-like values before sending to IM
|
|
61
60
|
"fallbackOnError": "ask" // never "deny" — never break workflow
|
|
62
61
|
},
|
package/dist/cli/init.js
CHANGED
|
@@ -193,7 +193,7 @@ const DEMO_PROMPT = (chat) => [
|
|
|
193
193
|
"请按顺序执行,不要输出多余解释:",
|
|
194
194
|
"1. 用 Bash 运行 `echo hello world from weclaude`。",
|
|
195
195
|
"2. 用 Bash 运行 `sleep 3`。",
|
|
196
|
-
`3. 用 mcp 工具 \`
|
|
196
|
+
`3. 用 mcp 工具 \`weclaude__send_markdown\` 向 chat="${chat}" 发送 content="✅ weclaude 演示完成:hello world"。`,
|
|
197
197
|
].join("\n");
|
|
198
198
|
const runDemo = (chat, claudeBin) => new Promise((resolve) => {
|
|
199
199
|
const proc = spawn(claudeBin, ["-p", DEMO_PROMPT(chat)], {
|
package/dist/cli/init.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../cli/init.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../cli/init.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "weclaude",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
4
4
|
"description": "Bridge Claude Code and WeCom: PreToolUse approval cards + bidirectional tmux session mirror with image paste",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -40,8 +40,7 @@
|
|
|
40
40
|
"config.example.jsonc",
|
|
41
41
|
"commands/wrc.md",
|
|
42
42
|
"README.md",
|
|
43
|
-
"
|
|
44
|
-
"docs/DESIGN-INIT.md",
|
|
43
|
+
"CLAUDE.md",
|
|
45
44
|
"LICENSE"
|
|
46
45
|
],
|
|
47
46
|
"scripts": {
|
package/docs/DESIGN-INIT.md
DELETED
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
# Init flow 设计
|
|
2
|
-
|
|
3
|
-
## 目标
|
|
4
|
-
|
|
5
|
-
让没改过任何 dotfile 的新用户,从 `git clone` 到「在企业微信点按钮放行 Claude 写文件」少于 5 分钟,零手工编辑配置。
|
|
6
|
-
|
|
7
|
-
## 三个被忽略的难点
|
|
8
|
-
|
|
9
|
-
### 1. allowFrom 的鸡生蛋
|
|
10
|
-
|
|
11
|
-
正常运行时 daemon 严格按 `wrc.allowFrom` 白名单转发;用户不在白名单里就被丢弃。但**第一次**用户的 IM userid 还没被任何人知道(你不能预填,你不知道自己企业微信 userid 是多少)。
|
|
12
|
-
|
|
13
|
-
**方案**:daemon 加 `claim` 模式。短窗口内(10 min),匹配指定暗号的第一条消息绕过 allowFrom,把发送方的 principal 同时写进 `defaultChat` 和 `allowFrom`。一次性消费。
|
|
14
|
-
|
|
15
|
-
为什么不让用户先去后台查 userid 填进 config:
|
|
16
|
-
|
|
17
|
-
- 用户体验断点。打开管理后台找 userid 是个高摩擦动作。
|
|
18
|
-
- 群聊 chatid 在后台根本看不到,必须从消息流里捞。
|
|
19
|
-
- 反正消息进来时 daemon 已经知道 principal;让它自己写比让人抄稳。
|
|
20
|
-
|
|
21
|
-
**为什么不直接关掉 allowFrom 让任何人都能用**:会被任意外部联系人触发 `claude -p` 跑代码。安全模型必须保留白名单,bootstrap 是唯一豁免点,且单次。
|
|
22
|
-
|
|
23
|
-
### 2. 密钥不能进 dotfile repo
|
|
24
|
-
|
|
25
|
-
如果 `config.jsonc` 整个塞进 dotfile,`secret` 就会进 git。
|
|
26
|
-
|
|
27
|
-
**方案**:复用 `loadConfig()` 里早就有的 `secrets.json` deep-merge 钩子。init 时把 `botId/secret` 写到 `~/.weclaude/secrets.json`,其他写 `config.jsonc`。两份文件运行时合并。`config.jsonc` 可入 dotfiles,`secrets.json` 留本机。
|
|
28
|
-
|
|
29
|
-
### 3. 配置写入要保留注释
|
|
30
|
-
|
|
31
|
-
`config.example.jsonc` 是带注释的 JSONC,新手要靠注释理解每个字段。如果 init 用 `JSON.parse` + `JSON.stringify` 重写,注释全没。
|
|
32
|
-
|
|
33
|
-
**方案**:用 `jsonc-parser.modify` 做外科级 patch(已经是 `cli/sync.ts` 的依赖)。只动指定 path 的值,其他字节保留。
|
|
34
|
-
|
|
35
|
-
```ts
|
|
36
|
-
patchJsonc(CONFIG, [
|
|
37
|
-
{ path: ["bot", "websocketUrl"], value: "wss://..." },
|
|
38
|
-
{ path: ["wrc", "claudeBin"], value: claudeBin },
|
|
39
|
-
])
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
## 三步划分的依据
|
|
43
|
-
|
|
44
|
-
不是三步随便选的,是**必须**三步:
|
|
45
|
-
|
|
46
|
-
| 步 | 干什么 | 必须独立的原因 |
|
|
47
|
-
| --- | --- | --- |
|
|
48
|
-
| 1 | 写 config + 装 daemon | daemon 起不来后面都不用谈 |
|
|
49
|
-
| 2 | 跨进程 IM 握手 | 必须等真人在另一个客户端发消息,是异步的等待点 |
|
|
50
|
-
| 3 | 端到端 smoke | 验证授权链路和 outbound 链路双向通 |
|
|
51
|
-
|
|
52
|
-
把第 2 步合并进第 1 步是不行的——daemon 必须先完整启动并连上 WS,才有人接得到那条暗号。
|
|
53
|
-
|
|
54
|
-
把第 3 步省掉是不行的——hook + MCP + WS + 进程产物链路只有一种验证方式:让 Claude 真的跑一次。装好不演示,第一次真用还是会踩坑。
|
|
55
|
-
|
|
56
|
-
## 为什么没用 ink
|
|
57
|
-
|
|
58
|
-
考虑过 ink,否决理由:
|
|
59
|
-
|
|
60
|
-
- 当前仓库纯 TS,无 React,无 JSX,tsconfig 没开 `jsx`。引入 ink → 加 `react`、`@types/react`、改 tsconfig、新建 `.tsx` 文件,体积和复杂度都涨。
|
|
61
|
-
- 这个流程是**严格顺序**的 4 个 prompt + 几段 status 输出,没有并发可视化、没有持久面板、没有键盘焦点。这是 inquirer 的舒适区,不是 ink 的。
|
|
62
|
-
- `@inquirer/prompts` 函数式 API(`await input(...)`、`await select(...)`)和仓库里其他模块的风格一致:纯函数 + 副作用推到边界。
|
|
63
|
-
|
|
64
|
-
如果以后要做 daemon dashboard / 任务队列实时面板,再上 ink。现在先不上。
|
|
65
|
-
|
|
66
|
-
## claim 模式的状态机
|
|
67
|
-
|
|
68
|
-
```
|
|
69
|
-
POST /claim/start
|
|
70
|
-
│
|
|
71
|
-
┌──────▼──────┐
|
|
72
|
-
│ ARMED │ phrase, expiresAt
|
|
73
|
-
└──────┬──────┘
|
|
74
|
-
│
|
|
75
|
-
┌──────┴──────┬─────────────┐
|
|
76
|
-
│ │ │
|
|
77
|
-
inbound TTL POST /claim/reset
|
|
78
|
-
matches expires │
|
|
79
|
-
│ │ │
|
|
80
|
-
▼ ▼ ▼
|
|
81
|
-
CLAIMED (cleared) (cleared)
|
|
82
|
-
│
|
|
83
|
-
└─→ persistClaim(cfg, sourcePath, principal)
|
|
84
|
-
└─→ defaultChat = principal
|
|
85
|
-
allowFrom += principal ← 同时改磁盘 + 改内存
|
|
86
|
-
└─→ ackClaim(client, principal)
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
`state` 是模块级单例,单实例 daemon 不需要锁。如果以后要多 worker,state 要挪进 daemon 共享存储——但 WS 客户端本身就是单连接的,不会有这个问题。
|
|
90
|
-
|
|
91
|
-
## 演示选什么 prompt
|
|
92
|
-
|
|
93
|
-
```
|
|
94
|
-
1. Bash: echo hello world from weclaude
|
|
95
|
-
2. Bash: sleep 3
|
|
96
|
-
3. wecom__send_markdown chat="<defaultChat>" content="✅ ..."
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
设计取舍:
|
|
100
|
-
|
|
101
|
-
- **必须用 Bash 工具**,因为 `approval.matcher = ".*"` 默认全拦,但 `pre-tool-use.sh` 里对 `Bash` 的只读命令(grep/ls/cat...)有 fast-path 直接 allow。`echo` 不在 fast-path 里,会真触发卡片。
|
|
102
|
-
- **第二次 sleep** 是为了让用户看到「点了一次 ✅,下一次还会问」是默认行为;如果他想免打扰可以点 `✅ N 分钟` 开窗口。
|
|
103
|
-
- **MCP send_markdown** 而不是 `claude` 自己 print:验证的是「主动推送回 IM」这条链路,普通 print 只回流到终端。
|
|
104
|
-
|
|
105
|
-
prompt 里**显式拼出 chat id**而不是依赖 LLM 推断「default chat」,因为:MCP 工具签名要求 `chat` 是显式 string,没有「default」概念。让 LLM 猜是不必要的脆弱性。
|
|
106
|
-
|
|
107
|
-
## 失败模式
|
|
108
|
-
|
|
109
|
-
| 场景 | init 行为 | 状态可恢复性 |
|
|
110
|
-
| --- | --- | --- |
|
|
111
|
-
| 用户 Ctrl-C 在 prompt 中 | 进程退出,未写任何文件 | ✅ 完全干净 |
|
|
112
|
-
| 写完 config 但 daemon 起不来 | 抛 `daemon did not become ready` | ✅ config 保留,下次 `weclaude reload` 即可 |
|
|
113
|
-
| Claim 超时 | 报「超时未收到消息」并退出 | ✅ daemon 还在跑,可手填 config 或重跑 init |
|
|
114
|
-
| 演示 spawn `claude` 失败 | 红字打印 spawn 错误,正常退出 | ✅ 前两步成果都保留 |
|
|
115
|
-
|
|
116
|
-
没有「半完成」的中间状态需要回滚。
|
|
117
|
-
|
|
118
|
-
## 后续可能的改进
|
|
119
|
-
|
|
120
|
-
不在本次范围,但留给未来:
|
|
121
|
-
|
|
122
|
-
- `weclaude init --reset` 一键清空(unsync + uninstall daemon + 删 ~/.weclaude)
|
|
123
|
-
- claim 暗号支持自定义(防多人共用同一台 daemon 的暗号冲突)
|
|
124
|
-
- 演示步骤后做一次 `weclaude status` 的彩色断言,给用户一个「绿色对勾合集」
|
|
125
|
-
- ink 化的 daemon dashboard(独立工具,`weclaude tui`)
|
package/docs/ONBOARDING.md
DELETED
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
# weclaude 上手指南
|
|
2
|
-
|
|
3
|
-
3 步在一台新机器上把「IM 授权转发 + 远程 CC 控制」跑通。
|
|
4
|
-
|
|
5
|
-
## 前置
|
|
6
|
-
|
|
7
|
-
- Node ≥ 20
|
|
8
|
-
- 已安装 `claude` 或 `claude-internal`
|
|
9
|
-
- 一个企业微信「智能机器人」:拿到 `botId` 和 `secret`
|
|
10
|
-
- 创建入口:企业微信管理后台 → 应用管理 → 智能机器人
|
|
11
|
-
|
|
12
|
-
## 步骤
|
|
13
|
-
|
|
14
|
-
```bash
|
|
15
|
-
# 方式 A:npm 全局安装(推荐)
|
|
16
|
-
npm install -g weclaude
|
|
17
|
-
weclaude init
|
|
18
|
-
|
|
19
|
-
# 方式 B:免安装一次性试用
|
|
20
|
-
npx weclaude init
|
|
21
|
-
|
|
22
|
-
# 方式 C:本地开发
|
|
23
|
-
git clone <repo> && cd weclaude
|
|
24
|
-
npm install && npm run build
|
|
25
|
-
./cli/weclaude.sh init
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
> ⚠️ 卸载时**先**跑 `weclaude uninstall`(unsync settings.json + 卸载 daemon),**再** `npm uninstall -g weclaude`。否则 launchd/systemd 会反复尝试启动已删除的二进制。
|
|
29
|
-
> `~/.weclaude/` 下的 config/secrets/state 不会被清掉,二次安装可无缝复用。
|
|
30
|
-
|
|
31
|
-
### [1/3] 采集配置
|
|
32
|
-
|
|
33
|
-
交互式问 4 个值:
|
|
34
|
-
|
|
35
|
-
| 字段 | 写到 |
|
|
36
|
-
| --- | --- |
|
|
37
|
-
| botId | `~/.weclaude/secrets.json` |
|
|
38
|
-
| secret | `~/.weclaude/secrets.json` |
|
|
39
|
-
| Claude agent | `~/.weclaude/config.jsonc` (`wrc.claudeBin` + `sync.targets[0].settingsPath`) |
|
|
40
|
-
| 是否启用 PreToolUse hook | `~/.weclaude/config.jsonc` (`approval.enabled`) |
|
|
41
|
-
|
|
42
|
-
Agent 选项:
|
|
43
|
-
|
|
44
|
-
- `claude` → 写到 `~/.claude/settings.json`
|
|
45
|
-
- `claude-internal` → 写到 `~/.claude-internal/settings.json`
|
|
46
|
-
- `custom` → 你给的绝对路径
|
|
47
|
-
|
|
48
|
-
`secrets.json` 和 `config.jsonc` 在 `loadConfig` 里 deep-merge,方便把 `config.jsonc` dotfile 化但 secrets 留在本机。
|
|
49
|
-
|
|
50
|
-
完成后自动:
|
|
51
|
-
1. `npx tsc` 编译 dist
|
|
52
|
-
2. `weclaude sync` 把 hook / MCP / env 写进选定的 settings.json
|
|
53
|
-
3. 安装常驻 daemon(macOS launchd / Linux systemd --user)
|
|
54
|
-
4. 等 WebSocket 鉴权通过
|
|
55
|
-
|
|
56
|
-
### [2/3] 绑定默认会话
|
|
57
|
-
|
|
58
|
-
CLI 提示你**在企业微信里**给机器人发:
|
|
59
|
-
|
|
60
|
-
```
|
|
61
|
-
将本对话设置为默认会话
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
Daemon 在内存里临时打开 claim 窗口(10 分钟)。这条消息精确匹配后:
|
|
65
|
-
|
|
66
|
-
- 把发送方 principal(`user:<id>` 或 `chat:<id>`)写到 `defaultChat`
|
|
67
|
-
- 把同一个 principal 加进 `wrc.allowFrom`(去重)
|
|
68
|
-
- 落盘 + 同步内存里的 cfg 对象
|
|
69
|
-
- 给你回一条 markdown ack
|
|
70
|
-
|
|
71
|
-
这一步是**唯一一次**绕过 `allowFrom` 检查的入口;消费完立刻关闭。后续所有消息严格按 `allowFrom` 鉴权。
|
|
72
|
-
|
|
73
|
-
### [3/3] 授权转发演示
|
|
74
|
-
|
|
75
|
-
CLI 自动 `spawn claude -p` 跑一条三步指令:
|
|
76
|
-
|
|
77
|
-
```
|
|
78
|
-
1. Bash: echo hello world from weclaude ← 触发 PreToolUse hook
|
|
79
|
-
2. Bash: sleep 3 ← 再触发一次
|
|
80
|
-
3. wecom__send_markdown ← 通过 MCP 主动推送结果
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
期望体验:
|
|
84
|
-
|
|
85
|
-
- IM 收到按钮卡片:`授权请求: Bash`
|
|
86
|
-
- 点 ✅ → 卡片就地刷新成 `✅ Bash · 已允许`
|
|
87
|
-
- 3 秒后再来一张卡片(或被 5 分钟自动窗口短路)
|
|
88
|
-
- 最终收到 `✅ weclaude 演示完成:hello world`
|
|
89
|
-
|
|
90
|
-
如果第 1 步选「不开 hook」,会跳过演示。
|
|
91
|
-
|
|
92
|
-
## 完成后
|
|
93
|
-
|
|
94
|
-
```bash
|
|
95
|
-
weclaude status # daemon + WS 健康
|
|
96
|
-
weclaude logs -f # 实时日志
|
|
97
|
-
weclaude send <chat> <text> # 主动推消息
|
|
98
|
-
weclaude unsync # 卸载 hook/MCP(保留 daemon)
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
## 排错
|
|
102
|
-
|
|
103
|
-
| 现象 | 处理 |
|
|
104
|
-
| --- | --- |
|
|
105
|
-
| `daemon: down` | `weclaude reload`;看 `~/.weclaude/daemon.stderr.log` |
|
|
106
|
-
| 发完暗号 daemon 没反应 | 检查 `weclaude status` 的 `wsConnected` 是不是 true;机器人 `secret` 错会卡在 auth |
|
|
107
|
-
| Hook 不触发 | `cat ~/.claude/settings.json | jq .hooks.PreToolUse`;`weclaude sync` 重写 |
|
|
108
|
-
| 卡片点了没反应 | 5 秒内才能就地更新;超时是正常情况,决策仍然生效 |
|
|
109
|
-
| MCP 调用 404 | `mcpServers.wecom._managedBy=="weclaude"` 应在 settings.json;`weclaude sync` 修复 |
|
|
110
|
-
|
|
111
|
-
## 多机部署
|
|
112
|
-
|
|
113
|
-
`config.jsonc` 可以纳入 dotfiles;`secrets.json` 每台机器独立填。`init` 跑过一次后,第二台机器:
|
|
114
|
-
|
|
115
|
-
```bash
|
|
116
|
-
cp ~/dotfiles/weclaude-config.jsonc ~/.weclaude/config.jsonc
|
|
117
|
-
./cli/weclaude.sh init # 跳过覆盖提示,但仍走 claim 步骤拿到本机的 IM principal
|
|
118
|
-
```
|