weclaude 0.0.4 → 0.1.0
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/LICENSE +1 -1
- package/README.md +34 -22
- package/cli/{wrc.sh → weclaude.sh} +34 -18
- package/commands/wrc.md +4 -4
- package/config.example.jsonc +6 -6
- package/dist/cli/init.js +10 -10
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/sync.js +35 -18
- package/dist/cli/sync.js.map +1 -1
- package/dist/daemon/approval.js +480 -36
- package/dist/daemon/approval.js.map +1 -1
- package/dist/daemon/cc-bridge.js +37 -20
- package/dist/daemon/cc-bridge.js.map +1 -1
- package/dist/daemon/claim.js +1 -1
- package/dist/daemon/claim.js.map +1 -1
- package/dist/daemon/detail.js +500 -0
- package/dist/daemon/detail.js.map +1 -0
- package/dist/daemon/http.js +2 -1
- package/dist/daemon/http.js.map +1 -1
- package/dist/daemon/inbound.js +115 -21
- package/dist/daemon/inbound.js.map +1 -1
- package/dist/daemon/index.js +24 -7
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/mirror-bridge.js +972 -151
- package/dist/daemon/mirror-bridge.js.map +1 -1
- package/dist/daemon/mirror-store.js +39 -0
- package/dist/daemon/mirror-store.js.map +1 -0
- package/dist/daemon/pending.js +46 -0
- package/dist/daemon/pending.js.map +1 -1
- package/dist/daemon/session-cache.js +71 -3
- package/dist/daemon/session-cache.js.map +1 -1
- package/dist/daemon/spawn-tmux.js +132 -0
- package/dist/daemon/spawn-tmux.js.map +1 -0
- package/dist/mcp/server.js +104 -65
- package/dist/mcp/server.js.map +1 -1
- package/dist/shared/config-writer.js +1 -1
- package/dist/shared/config.js +34 -20
- package/dist/shared/config.js.map +1 -1
- package/dist/shared/paths.js +6 -0
- package/dist/shared/paths.js.map +1 -1
- package/docs/DESIGN-INIT.md +6 -6
- package/docs/ONBOARDING.md +25 -25
- package/hooks/pre-tool-use.sh +32 -7
- package/launchd/{com.cc-wecom.daemon.plist.template → com.weclaude.daemon.plist.template} +3 -3
- package/package.json +10 -11
- package/scripts/install.sh +6 -6
- package/scripts/uninstall.sh +3 -3
- package/systemd/{cc-wecom.service.template → weclaude.service.template} +3 -3
package/LICENSE
CHANGED
package/README.md
CHANGED
|
@@ -1,32 +1,35 @@
|
|
|
1
|
-
#
|
|
1
|
+
# weclaude
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
让企业微信和 Claude Code 双向打通:一边把 PreToolUse 授权卡片推到 IM 点按钮放行,一边把整个 CLI 会话镜像到聊天里——在车上、被窝里都能跟你本机的 Claude 继续干活。
|
|
4
4
|
|
|
5
5
|
## 能做什么
|
|
6
6
|
|
|
7
|
-
- **IM
|
|
8
|
-
-
|
|
9
|
-
-
|
|
10
|
-
-
|
|
7
|
+
- **IM 侧授权** — Claude 触发的 Bash / Edit 等敏感工具,按钮卡片直推 IM;点 ✅/❌/⏱ (放行 N 分钟) 直接落地。卡片就地刷新成决策结果,10 分钟自动窗口免去刷屏点击。
|
|
8
|
+
- **镜像模式 (`mirror`)** — 一条 `/wrc` 把当前 tmux 里的 Claude 会话和 IM 聊天双向绑定:CLI 里出现的 assistant 流式打字机、tool_use、tool_result 实时推到 IM;IM 里发的消息原样粘进 CLI 输入框,CLI 那头看着像是你自己在敲。重启 daemon、关掉 tmux 窗口都能自愈复原。
|
|
9
|
+
- **图片直传** — 企业微信发的图片走 macOS pasteboard + tmux `C-v`,Claude Code 当成贴图处理(image content block),不走 Read 工具,不耗 token,不弹审批。
|
|
10
|
+
- **细节页** — tool_use / 授权请求都生成本地 HTML 详情页,点 IM 里的链接打开看完整 input / result / git-style diff。
|
|
11
|
+
- **远程 `/new` `/clear` `/askq`** — 在 IM 直接开新会话、清上下文、向 IM 用户发投票卡片收集决策。
|
|
12
|
+
- **MCP 主动推送** — Claude 通过 `wecom__send_markdown` / `wecom__send_card` / `wecom__ask_user` 主动汇报或问询。
|
|
11
13
|
|
|
12
14
|
## 上手 (3 步)
|
|
13
15
|
|
|
14
|
-
前置:Node ≥ 20
|
|
16
|
+
前置:macOS / Linux、Node ≥ 20、`claude` 或 `claude-internal` 在 PATH 里、企业微信「智能机器人」的 `botId` + `secret`。镜像模式额外需要 `tmux`。
|
|
15
17
|
|
|
16
18
|
```bash
|
|
17
|
-
npm install -g
|
|
18
|
-
|
|
19
|
+
npm install -g weclaude
|
|
20
|
+
weclaude init
|
|
19
21
|
```
|
|
20
22
|
|
|
21
|
-
`
|
|
23
|
+
`weclaude init` 交互式把 4 个值落到 `~/.weclaude/`:
|
|
22
24
|
|
|
23
25
|
| 字段 | 落点 |
|
|
24
26
|
| --- | --- |
|
|
25
|
-
| botId / secret | `~/.
|
|
26
|
-
| Claude agent (`claude` / `claude-internal` / 自定义路径) | `~/.
|
|
27
|
-
|
|
|
27
|
+
| botId / secret | `~/.weclaude/secrets.json` |
|
|
28
|
+
| Claude agent (`claude` / `claude-internal` / 自定义路径) | `~/.weclaude/config.jsonc` |
|
|
29
|
+
| 模式 (`headless` / `mirror`) | `~/.weclaude/config.jsonc` |
|
|
30
|
+
| 启用 PreToolUse hook | `~/.weclaude/config.jsonc` |
|
|
28
31
|
|
|
29
|
-
随后自动:编译 dist → `
|
|
32
|
+
随后自动:编译 dist → `weclaude sync` 注入 hook/MCP → 装 daemon (launchd / systemd --user) → 等 WS 鉴权。
|
|
30
33
|
|
|
31
34
|
**绑定默认会话**:CLI 提示后,在企业微信里给机器人发:
|
|
32
35
|
|
|
@@ -36,20 +39,29 @@ wrc init
|
|
|
36
39
|
|
|
37
40
|
10 分钟 claim 窗口内的这条精确匹配消息会被吃掉,把发送方 principal 写进 `defaultChat` + `allowFrom`。这是**唯一**绕过 `allowFrom` 的入口,消费完立刻关闭。
|
|
38
41
|
|
|
39
|
-
|
|
42
|
+
## 两种模式
|
|
43
|
+
|
|
44
|
+
| | `headless` | `mirror` |
|
|
45
|
+
| --- | --- | --- |
|
|
46
|
+
| 触发方式 | IM 消息 → 后台 spawn `claude -p` | IM 消息 → tmux paste 进活的 TUI |
|
|
47
|
+
| 状态 | 每条消息独立 turn,靠 `--resume` 续 session | 一对一绑定 IM 聊天 ↔ tmux 窗口,原地累计 |
|
|
48
|
+
| CLI 可见 | 不可见(headless 子进程) | 可见(IM 消息像你自己敲的一样落进输入框) |
|
|
49
|
+
| 适用 | 简单单轮问答 / CI 类自动化 | 真·远程结对,能看到工具调用、思考、流式输出 |
|
|
50
|
+
|
|
51
|
+
镜像模式下,IM 里发 `/new` 直接 spawn 一个新 tmux 窗口 + claude 会话并绑定本聊天;`/clear` 清当前会话上下文;任意一条带图消息都会被 pasteboard 注入。所有 chat 共享同一个 tmux session(默认名 `weclaude`),每个聊天一个独立 window。
|
|
40
52
|
|
|
41
53
|
## 常用命令
|
|
42
54
|
|
|
43
55
|
```bash
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
56
|
+
weclaude status # daemon + WS 健康
|
|
57
|
+
weclaude logs -f # 实时日志
|
|
58
|
+
weclaude send <chat> <text> # 主动推消息
|
|
59
|
+
weclaude reload # 重启 daemon
|
|
60
|
+
weclaude unsync # 卸载 hook/MCP (保留 daemon)
|
|
61
|
+
weclaude uninstall # 完整卸载 (先于 npm uninstall -g)
|
|
50
62
|
```
|
|
51
63
|
|
|
52
|
-
> ⚠️ 卸载顺序:**先** `
|
|
64
|
+
> ⚠️ 卸载顺序:**先** `weclaude uninstall` **再** `npm uninstall -g weclaude`,否则 launchd/systemd 会反复拉起已删除的二进制。`~/.weclaude/` 下的配置/secrets 不会被清,二次安装可复用。
|
|
53
65
|
|
|
54
66
|
## 详细文档
|
|
55
67
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
#
|
|
2
|
+
# weclaude CLI — talks to local weclaude daemon over HTTP and toggles launchd/systemd.
|
|
3
3
|
set -uo pipefail
|
|
4
4
|
|
|
5
|
-
DAEMON_BASE="${
|
|
6
|
-
LABEL="com.
|
|
5
|
+
DAEMON_BASE="${WECLAUDE_DAEMON_BASE:-http://127.0.0.1:17890}"
|
|
6
|
+
LABEL="com.weclaude.daemon"
|
|
7
7
|
HOME_DIR="$HOME"
|
|
8
8
|
OS="$(uname -s)"
|
|
9
9
|
|
|
@@ -12,7 +12,7 @@ shift || true
|
|
|
12
12
|
|
|
13
13
|
usage() {
|
|
14
14
|
cat <<'EOF'
|
|
15
|
-
|
|
15
|
+
weclaude <subcommand>
|
|
16
16
|
init interactive onboarding (write config, install daemon, claim default chat, run demo)
|
|
17
17
|
status daemon health + connection state
|
|
18
18
|
start load resident daemon (launchd/systemd)
|
|
@@ -38,13 +38,13 @@ http_post() { curl -sS --max-time 5 -X POST -H 'content-type: application/json'
|
|
|
38
38
|
svc_load() {
|
|
39
39
|
case "$OS" in
|
|
40
40
|
Darwin) launchctl load -w "$HOME_DIR/Library/LaunchAgents/${LABEL}.plist" ;;
|
|
41
|
-
Linux) systemctl --user start
|
|
41
|
+
Linux) systemctl --user start weclaude.service ;;
|
|
42
42
|
esac
|
|
43
43
|
}
|
|
44
44
|
svc_unload() {
|
|
45
45
|
case "$OS" in
|
|
46
46
|
Darwin) launchctl unload "$HOME_DIR/Library/LaunchAgents/${LABEL}.plist" ;;
|
|
47
|
-
Linux) systemctl --user stop
|
|
47
|
+
Linux) systemctl --user stop weclaude.service ;;
|
|
48
48
|
esac
|
|
49
49
|
}
|
|
50
50
|
|
|
@@ -62,7 +62,7 @@ require_claude_internal() {
|
|
|
62
62
|
[[ -z "$pid" ]] && break
|
|
63
63
|
(( i++ ))
|
|
64
64
|
done
|
|
65
|
-
echo "
|
|
65
|
+
echo "weclaude $cmd: only available inside claude-internal" >&2
|
|
66
66
|
exit 1
|
|
67
67
|
}
|
|
68
68
|
|
|
@@ -72,7 +72,7 @@ case "$cmd" in
|
|
|
72
72
|
REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
|
73
73
|
SCRIPT="$REPO_ROOT/dist/cli/init.js"
|
|
74
74
|
if [[ ! -f "$SCRIPT" ]]; then
|
|
75
|
-
echo "[
|
|
75
|
+
echo "[weclaude init] building..."
|
|
76
76
|
(cd "$REPO_ROOT" && npm install --silent && npx tsc -p tsconfig.json) || { echo "build failed"; exit 1; }
|
|
77
77
|
fi
|
|
78
78
|
exec "$NODE_BIN" "$SCRIPT" "$@"
|
|
@@ -92,14 +92,14 @@ case "$cmd" in
|
|
|
92
92
|
http_post /shutdown >/dev/null 2>&1 || true
|
|
93
93
|
case "$OS" in
|
|
94
94
|
Darwin) launchctl kickstart -k "gui/$(id -u)/${LABEL}" >/dev/null && echo "daemon: reloaded" ;;
|
|
95
|
-
Linux) systemctl --user restart
|
|
95
|
+
Linux) systemctl --user restart weclaude.service && echo "daemon: reloaded" ;;
|
|
96
96
|
esac
|
|
97
97
|
;;
|
|
98
98
|
send)
|
|
99
99
|
chat="${1:-}"; shift || true
|
|
100
100
|
text="${*:-}"
|
|
101
101
|
if [[ -z "$chat" || -z "$text" ]]; then
|
|
102
|
-
echo "usage:
|
|
102
|
+
echo "usage: weclaude send <chat> <text>"; exit 1
|
|
103
103
|
fi
|
|
104
104
|
body=$(jq -nc --arg c "$chat" --arg t "$text" '{chat:$c,text:$t}')
|
|
105
105
|
http_post /message "$body"
|
|
@@ -107,7 +107,7 @@ case "$cmd" in
|
|
|
107
107
|
pending) http_get /pending | jq . 2>/dev/null || http_get /pending ;;
|
|
108
108
|
logs)
|
|
109
109
|
log_path=$(http_get /status 2>/dev/null | jq -r '.logFile // empty' 2>/dev/null || true)
|
|
110
|
-
log_path="${log_path:-$HOME_DIR/.
|
|
110
|
+
log_path="${log_path:-$HOME_DIR/.weclaude/daemon.log}"
|
|
111
111
|
if [[ "${1:-}" == "-f" ]]; then tail -f "$log_path"; else tail -n 100 "$log_path"; fi
|
|
112
112
|
;;
|
|
113
113
|
config-path) http_get /status | jq -r '.sourcePath // empty' ;;
|
|
@@ -117,12 +117,10 @@ case "$cmd" in
|
|
|
117
117
|
SYNC_SCRIPT="$REPO_ROOT/dist/cli/sync.js"
|
|
118
118
|
[[ -f "$SYNC_SCRIPT" ]] && "$NODE_BIN" "$SYNC_SCRIPT" --remove || true
|
|
119
119
|
bash "$REPO_ROOT/scripts/uninstall.sh"
|
|
120
|
-
echo "[
|
|
120
|
+
echo "[weclaude] cleaned. safe to 'npm uninstall -g weclaude' (state at ~/.weclaude kept)"
|
|
121
121
|
;;
|
|
122
122
|
mirror)
|
|
123
123
|
require_claude_internal
|
|
124
|
-
# Pick the most-recently-written jsonl in this cwd's claude project dir.
|
|
125
|
-
# That's the live session writing this very turn.
|
|
126
124
|
cwd="${CLAUDE_PROJECT_DIR:-$(pwd)}"
|
|
127
125
|
enc="$(printf %s "$cwd" | sed 's|/|-|g')"
|
|
128
126
|
# claude-internal stores under ~/.claude-internal/projects/, official claude
|
|
@@ -137,14 +135,32 @@ case "$cmd" in
|
|
|
137
135
|
echo "looked in: $HOME/.claude-internal/projects/$enc and $HOME/.claude/projects/$enc"
|
|
138
136
|
exit 1
|
|
139
137
|
fi
|
|
140
|
-
|
|
138
|
+
# Resolve the *calling* session via env var Claude Code injects into every
|
|
139
|
+
# child process. lsof can't help — claude doesn't keep the jsonl fd open
|
|
140
|
+
# across writes, so the file appears unbound between turns.
|
|
141
|
+
sid="${CLAUDE_CODE_SESSION_ID:-${CLAUDE_SESSION_ID:-}}"
|
|
142
|
+
latest=""
|
|
143
|
+
if [[ -n "$sid" && -f "$proj/$sid.jsonl" ]]; then
|
|
144
|
+
latest="$proj/$sid.jsonl"
|
|
145
|
+
fi
|
|
146
|
+
# Fallback for setups that don't propagate the env var: most-recent mtime.
|
|
147
|
+
[[ -z "$latest" ]] && latest=$(ls -t "$proj"/*.jsonl 2>/dev/null | head -1)
|
|
141
148
|
if [[ -z "$latest" ]]; then
|
|
142
149
|
echo "no .jsonl under $proj"; exit 1
|
|
143
150
|
fi
|
|
144
151
|
sid="$(basename "$latest" .jsonl)"
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
152
|
+
# Accept user-friendly prefixes: vid:<id> → user:<id>, chatid:<id> → chat:<id>.
|
|
153
|
+
# Pass anything else through (already in user:/chat:/group: form, or empty).
|
|
154
|
+
raw="${1:-}"
|
|
155
|
+
case "$raw" in
|
|
156
|
+
vid:*) target="user:${raw#vid:}" ;;
|
|
157
|
+
chatid:*) target="chat:${raw#chatid:}" ;;
|
|
158
|
+
*) target="$raw" ;;
|
|
159
|
+
esac
|
|
160
|
+
body=$(jq -nc --arg s "$sid" --arg p "$latest" --arg t "$target" --arg tp "${TMUX_PANE:-}" \
|
|
161
|
+
'{sessionId:$s, jsonlPath:$p}
|
|
162
|
+
+ (if $t == "" then {} else {target:$t} end)
|
|
163
|
+
+ (if $tp == "" then {} else {tmuxPane:$tp} end)')
|
|
148
164
|
http_post /mirror/attach "$body" | jq . 2>/dev/null || true
|
|
149
165
|
;;
|
|
150
166
|
mirror-status)
|
package/commands/wrc.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: WeCom remote control —
|
|
3
|
-
allowed-tools: Bash(${CLAUDE_PLUGIN_ROOT}/cli/
|
|
4
|
-
argument-hint:
|
|
2
|
+
description: WeCom remote control — mirror current Claude session to WeCom
|
|
3
|
+
allowed-tools: Bash(${CLAUDE_PLUGIN_ROOT}/cli/weclaude.sh:*)
|
|
4
|
+
argument-hint: [user:<userid>|chat:<chatid>]
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
!`${CLAUDE_PLUGIN_ROOT}/cli/
|
|
7
|
+
!`${CLAUDE_PLUGIN_ROOT}/cli/weclaude.sh mirror $ARGUMENTS`
|
package/config.example.jsonc
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
// Declarative config for
|
|
2
|
-
// All paths support `~`. Secrets (botId/secret) can also live in ~/.
|
|
1
|
+
// Declarative config for weclaude. Copy to ~/.weclaude/config.jsonc and edit.
|
|
2
|
+
// All paths support `~`. Secrets (botId/secret) can also live in ~/.weclaude/secrets.json
|
|
3
3
|
// (same shape, deep-merged on top — keep secrets out of dotfile repos).
|
|
4
4
|
{
|
|
5
5
|
"$schema": "./schema.json",
|
|
@@ -19,8 +19,8 @@
|
|
|
19
19
|
"daemon": {
|
|
20
20
|
"host": "127.0.0.1",
|
|
21
21
|
"port": 17890,
|
|
22
|
-
"stateDir": "~/.
|
|
23
|
-
"logFile": "~/.
|
|
22
|
+
"stateDir": "~/.weclaude/state",
|
|
23
|
+
"logFile": "~/.weclaude/daemon.log",
|
|
24
24
|
"logLevel": "info" // trace|debug|info|warn|error
|
|
25
25
|
},
|
|
26
26
|
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
"mode": "headless",
|
|
36
36
|
"claudeBin": "claude",
|
|
37
37
|
"cwd": "~", // workdir (mirror: must match the running claude's cwd)
|
|
38
|
-
"sessionMapFile": "~/.
|
|
38
|
+
"sessionMapFile": "~/.weclaude/sessions.json",
|
|
39
39
|
"extraArgs": [], // appended to `claude -p`
|
|
40
40
|
"mirror": {
|
|
41
41
|
// Pin a session id; empty → auto-pick latest .jsonl mtime under
|
|
@@ -62,7 +62,7 @@
|
|
|
62
62
|
},
|
|
63
63
|
|
|
64
64
|
// ── claude-internal wrapper sync ──────────────────────────────────
|
|
65
|
-
// `
|
|
65
|
+
// `weclaude sync` writes hooks/MCP/permissions into target settings.json.
|
|
66
66
|
"sync": {
|
|
67
67
|
"targets": [
|
|
68
68
|
{
|
package/dist/cli/init.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
// `
|
|
2
|
+
// `weclaude init` — interactive onboarding for new users.
|
|
3
3
|
// Flow:
|
|
4
4
|
// 1. Prompt creds + agent kind + hook toggle.
|
|
5
|
-
// 2. Write ~/.
|
|
6
|
-
// 3. Build (if needed), run `
|
|
5
|
+
// 2. Write ~/.weclaude/config.jsonc + secrets.json (split secrets).
|
|
6
|
+
// 3. Build (if needed), run `weclaude sync` against chosen agent settings.json,
|
|
7
7
|
// install resident daemon.
|
|
8
8
|
// 4. Arm bootstrap claim. Wait for the user to send a magic phrase in IM.
|
|
9
9
|
// That message bypasses allowFrom, sets defaultChat, and adds the sender.
|
|
@@ -19,8 +19,8 @@ import { patchJsonc } from "../shared/config-writer.js";
|
|
|
19
19
|
import { expandHome } from "../shared/paths.js";
|
|
20
20
|
const here = dirname(fileURLToPath(import.meta.url));
|
|
21
21
|
const REPO = pathResolve(here, "..", "..");
|
|
22
|
-
const CONFIG = "~/.
|
|
23
|
-
const SECRETS = "~/.
|
|
22
|
+
const CONFIG = "~/.weclaude/config.jsonc";
|
|
23
|
+
const SECRETS = "~/.weclaude/secrets.json";
|
|
24
24
|
const CLAIM_PHRASE = "将本对话设置为默认会话";
|
|
25
25
|
// ── Pretty output (no ink — keep deps light) ─────────────────────────
|
|
26
26
|
const c = {
|
|
@@ -94,7 +94,7 @@ const waitDaemonReady = async (timeoutMs) => {
|
|
|
94
94
|
};
|
|
95
95
|
// ── Main flow ────────────────────────────────────────────────────────
|
|
96
96
|
const main = async () => {
|
|
97
|
-
log(c.bold("\
|
|
97
|
+
log(c.bold("\nweclaude · 新用户引导\n"));
|
|
98
98
|
log(c.dim(" 目标:3 步内完成 → IM 授权转发 + 远程 CC 控制可用。\n"));
|
|
99
99
|
if (existsSync(expandHome(CONFIG))) {
|
|
100
100
|
const ok = await confirm({
|
|
@@ -175,7 +175,7 @@ const main = async () => {
|
|
|
175
175
|
log(c.dim(" 即将启动 claude,触发一次 Bash 授权 → 你会在 WeCom 收到按钮卡片。"));
|
|
176
176
|
log(c.dim(" 点击「✅」放行即可观察后续 markdown 推送。\n"));
|
|
177
177
|
await runDemo(claimed, claudeBin);
|
|
178
|
-
log(c.green("\n✅ 引导完成。后续可用 `
|
|
178
|
+
log(c.green("\n✅ 引导完成。后续可用 `weclaude status` / `weclaude logs -f` 观察。"));
|
|
179
179
|
};
|
|
180
180
|
const pollClaim = async (timeoutMs) => {
|
|
181
181
|
const deadline = Date.now() + timeoutMs;
|
|
@@ -191,9 +191,9 @@ const pollClaim = async (timeoutMs) => {
|
|
|
191
191
|
};
|
|
192
192
|
const DEMO_PROMPT = (chat) => [
|
|
193
193
|
"请按顺序执行,不要输出多余解释:",
|
|
194
|
-
"1. 用 Bash 运行 `echo hello world from
|
|
194
|
+
"1. 用 Bash 运行 `echo hello world from weclaude`。",
|
|
195
195
|
"2. 用 Bash 运行 `sleep 3`。",
|
|
196
|
-
`3. 用 mcp 工具 \`wecom__send_markdown\` 向 chat="${chat}" 发送 content="✅
|
|
196
|
+
`3. 用 mcp 工具 \`wecom__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)], {
|
|
@@ -208,7 +208,7 @@ const runDemo = (chat, claudeBin) => new Promise((resolve) => {
|
|
|
208
208
|
});
|
|
209
209
|
main().catch((e) => {
|
|
210
210
|
// eslint-disable-next-line no-console
|
|
211
|
-
console.error(c.red(`\n[
|
|
211
|
+
console.error(c.red(`\n[weclaude-init] ${e.message}`));
|
|
212
212
|
process.exit(1);
|
|
213
213
|
});
|
|
214
214
|
// keep loadConfig reference reachable for tree-shaking sanity (used by sub-binaries)
|
package/dist/cli/init.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../cli/init.ts"],"names":[],"mappings":";AACA,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../cli/init.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/sync.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
// `
|
|
1
|
+
// `weclaude sync` — write weclaude's hooks / MCP / env into target settings.json files
|
|
2
2
|
// (e.g. ~/.claude/settings.json so claude-internal wrappers pick them up).
|
|
3
|
-
// Idempotent + reversible via per-target lock manifest in ~/.
|
|
3
|
+
// Idempotent + reversible via per-target lock manifest in ~/.weclaude/sync.lock.json.
|
|
4
4
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
5
5
|
import { dirname, resolve as pathResolve } from "node:path";
|
|
6
6
|
import { fileURLToPath } from "node:url";
|
|
@@ -12,8 +12,8 @@ import { expandHome } from "../shared/paths.js";
|
|
|
12
12
|
const here = dirname(fileURLToPath(import.meta.url));
|
|
13
13
|
const PLUGIN_ROOT = pathResolve(here, "..", "..");
|
|
14
14
|
const MCP_ENTRY = `${PLUGIN_ROOT}/dist/mcp/server.js`;
|
|
15
|
-
const LOCK_FILE = expandHome("~/.
|
|
16
|
-
const MARKER = "
|
|
15
|
+
const LOCK_FILE = expandHome("~/.weclaude/sync.lock.json");
|
|
16
|
+
const MARKER = "weclaude";
|
|
17
17
|
const readLock = () => {
|
|
18
18
|
if (!existsSync(LOCK_FILE))
|
|
19
19
|
return { targets: {} };
|
|
@@ -50,7 +50,11 @@ const stripHooks = (settings) => {
|
|
|
50
50
|
// ── MCP upsert ────────────────────────────────────────────────────────
|
|
51
51
|
const upsertMcp = (settings) => {
|
|
52
52
|
const m = (settings.mcpServers ??= {});
|
|
53
|
-
|
|
53
|
+
// strip legacy `wecom` entry from earlier installs (renamed to weclaude).
|
|
54
|
+
const legacy = m.wecom;
|
|
55
|
+
if (legacy?._managedBy === MARKER)
|
|
56
|
+
delete m.wecom;
|
|
57
|
+
m.weclaude = {
|
|
54
58
|
command: "node",
|
|
55
59
|
args: [MCP_ENTRY],
|
|
56
60
|
_managedBy: MARKER,
|
|
@@ -60,16 +64,25 @@ const stripMcp = (settings) => {
|
|
|
60
64
|
const m = settings.mcpServers;
|
|
61
65
|
if (!m)
|
|
62
66
|
return;
|
|
63
|
-
const
|
|
64
|
-
|
|
65
|
-
|
|
67
|
+
for (const k of ["weclaude", "wecom"]) {
|
|
68
|
+
const cur = m[k];
|
|
69
|
+
if (cur?._managedBy === MARKER)
|
|
70
|
+
delete m[k];
|
|
71
|
+
}
|
|
66
72
|
};
|
|
67
73
|
// ── Env upsert ────────────────────────────────────────────────────────
|
|
68
|
-
const ENV_KEYS = [
|
|
69
|
-
|
|
74
|
+
const ENV_KEYS = [
|
|
75
|
+
"WECLAUDE_DAEMON_BASE",
|
|
76
|
+
"WECLAUDE_DAEMON_URL",
|
|
77
|
+
"WECLAUDE_STATE_DIR",
|
|
78
|
+
"WECLAUDE_HOOK_FALLBACK",
|
|
79
|
+
];
|
|
80
|
+
const upsertEnv = (settings, v) => {
|
|
70
81
|
const env = (settings.env ??= {});
|
|
71
|
-
env.
|
|
72
|
-
env.
|
|
82
|
+
env.WECLAUDE_DAEMON_BASE = v.base;
|
|
83
|
+
env.WECLAUDE_DAEMON_URL = `${v.base}/approve`;
|
|
84
|
+
env.WECLAUDE_STATE_DIR = expandHome(v.stateDir);
|
|
85
|
+
env.WECLAUDE_HOOK_FALLBACK = v.hookFallback;
|
|
73
86
|
return ENV_KEYS;
|
|
74
87
|
};
|
|
75
88
|
const stripEnv = (settings) => {
|
|
@@ -81,7 +94,7 @@ const stripEnv = (settings) => {
|
|
|
81
94
|
};
|
|
82
95
|
// ── Drivers ───────────────────────────────────────────────────────────
|
|
83
96
|
const targetKey = (path) => expandHome(path);
|
|
84
|
-
const syncOne = (settingsPath, opts, lock,
|
|
97
|
+
const syncOne = (settingsPath, opts, lock, env) => {
|
|
85
98
|
const abs = expandHome(settingsPath);
|
|
86
99
|
const settings = readJson(abs);
|
|
87
100
|
// Always strip legacy hook entries — the plugin's hooks/hooks.json owns
|
|
@@ -95,7 +108,7 @@ const syncOne = (settingsPath, opts, lock, daemonBase) => {
|
|
|
95
108
|
}
|
|
96
109
|
else {
|
|
97
110
|
upsertMcp(settings);
|
|
98
|
-
const wroteEnv = upsertEnv(settings,
|
|
111
|
+
const wroteEnv = upsertEnv(settings, env);
|
|
99
112
|
lock.targets[targetKey(settingsPath)] = { wroteHooks: false, wroteMcp: true, wroteEnv };
|
|
100
113
|
}
|
|
101
114
|
writeJson(abs, settings);
|
|
@@ -111,20 +124,24 @@ const main = () => {
|
|
|
111
124
|
console.error("no sync.targets in config — nothing to do.");
|
|
112
125
|
process.exit(0);
|
|
113
126
|
}
|
|
114
|
-
const
|
|
127
|
+
const envVals = {
|
|
128
|
+
base: `http://${cfg.daemon.host}:${cfg.daemon.port}`,
|
|
129
|
+
stateDir: cfg.daemon.stateDir,
|
|
130
|
+
hookFallback: cfg.approval.fallbackOnError,
|
|
131
|
+
};
|
|
115
132
|
const lock = readLock();
|
|
116
133
|
for (const t of targets) {
|
|
117
134
|
const action = remove ? "remove" : "upsert";
|
|
118
135
|
// eslint-disable-next-line no-console
|
|
119
|
-
console.log(`[
|
|
136
|
+
console.log(`[weclaude-sync] ${action} ${t.kind} → ${t.settingsPath}`);
|
|
120
137
|
if (dryRun)
|
|
121
138
|
continue;
|
|
122
|
-
syncOne(t.settingsPath, { remove }, lock,
|
|
139
|
+
syncOne(t.settingsPath, { remove }, lock, envVals);
|
|
123
140
|
}
|
|
124
141
|
if (!dryRun)
|
|
125
142
|
writeLock(lock);
|
|
126
143
|
// eslint-disable-next-line no-console
|
|
127
|
-
console.log(remove ? "[
|
|
144
|
+
console.log(remove ? "[weclaude-sync] removed." : "[weclaude-sync] synced.");
|
|
128
145
|
};
|
|
129
146
|
main();
|
|
130
147
|
//# sourceMappingURL=sync.js.map
|
package/dist/cli/sync.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../cli/sync.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../cli/sync.ts"],"names":[],"mappings":"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"}
|