wechat-claude-sessions 1.0.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/CONTRIBUTING.md +52 -0
- package/LICENSE +21 -0
- package/README.en.md +264 -0
- package/README.md +245 -0
- package/SECURITY.md +45 -0
- package/dist/bindings.d.ts +4 -0
- package/dist/bindings.js +50 -0
- package/dist/bindings.js.map +1 -0
- package/dist/claude-config.d.ts +4 -0
- package/dist/claude-config.js +49 -0
- package/dist/claude-config.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +345 -0
- package/dist/cli.js.map +1 -0
- package/dist/daemon.d.ts +2 -0
- package/dist/daemon.js +771 -0
- package/dist/daemon.js.map +1 -0
- package/dist/i18n.d.ts +67 -0
- package/dist/i18n.js +249 -0
- package/dist/i18n.js.map +1 -0
- package/dist/ilink.d.ts +49 -0
- package/dist/ilink.js +533 -0
- package/dist/ilink.js.map +1 -0
- package/dist/inbox.d.ts +4 -0
- package/dist/inbox.js +75 -0
- package/dist/inbox.js.map +1 -0
- package/dist/launchd.d.ts +7 -0
- package/dist/launchd.js +71 -0
- package/dist/launchd.js.map +1 -0
- package/dist/monitoring.d.ts +4 -0
- package/dist/monitoring.js +33 -0
- package/dist/monitoring.js.map +1 -0
- package/dist/paths.d.ts +11 -0
- package/dist/paths.js +35 -0
- package/dist/paths.js.map +1 -0
- package/dist/pkg-root.d.ts +2 -0
- package/dist/pkg-root.js +11 -0
- package/dist/pkg-root.js.map +1 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.js +364 -0
- package/dist/server.js.map +1 -0
- package/dist/session-numbers.d.ts +1 -0
- package/dist/session-numbers.js +44 -0
- package/dist/session-numbers.js.map +1 -0
- package/dist/sessions.d.ts +15 -0
- package/dist/sessions.js +135 -0
- package/dist/sessions.js.map +1 -0
- package/dist/tmux.d.ts +7 -0
- package/dist/tmux.js +47 -0
- package/dist/tmux.js.map +1 -0
- package/dist/types.d.ts +150 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +12 -0
- package/dist/utils.js +88 -0
- package/dist/utils.js.map +1 -0
- package/dist/watch-inbox.d.ts +2 -0
- package/dist/watch-inbox.js +102 -0
- package/dist/watch-inbox.js.map +1 -0
- package/package.json +50 -0
- package/templates/com.wechat-claude.daemon.plist.template +31 -0
- package/templates/wechat.md +20 -0
package/dist/bindings.js
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
const FILE = path.join(os.homedir(), ".claude", "wechat", "bindings.json");
|
|
5
|
+
function readBindings() {
|
|
6
|
+
try {
|
|
7
|
+
const parsed = JSON.parse(fs.readFileSync(FILE, "utf-8"));
|
|
8
|
+
if (typeof parsed === "object" && parsed !== null) {
|
|
9
|
+
return parsed;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
catch { }
|
|
13
|
+
return {};
|
|
14
|
+
}
|
|
15
|
+
function writeBindings(bindings) {
|
|
16
|
+
try {
|
|
17
|
+
fs.mkdirSync(path.dirname(FILE), { recursive: true });
|
|
18
|
+
fs.writeFileSync(FILE, JSON.stringify(bindings));
|
|
19
|
+
}
|
|
20
|
+
catch { }
|
|
21
|
+
}
|
|
22
|
+
export function getBinding(userId) {
|
|
23
|
+
return readBindings()[userId];
|
|
24
|
+
}
|
|
25
|
+
export function setBinding(userId, sessionId) {
|
|
26
|
+
const bindings = readBindings();
|
|
27
|
+
bindings[userId] = sessionId;
|
|
28
|
+
writeBindings(bindings);
|
|
29
|
+
}
|
|
30
|
+
export function clearBinding(userId) {
|
|
31
|
+
const bindings = readBindings();
|
|
32
|
+
if (!(userId in bindings))
|
|
33
|
+
return;
|
|
34
|
+
delete bindings[userId];
|
|
35
|
+
writeBindings(bindings);
|
|
36
|
+
}
|
|
37
|
+
// Remove every binding that points at a (closed) session.
|
|
38
|
+
export function clearBindingsToSession(sessionId) {
|
|
39
|
+
const bindings = readBindings();
|
|
40
|
+
let changed = false;
|
|
41
|
+
for (const [userId, boundId] of Object.entries(bindings)) {
|
|
42
|
+
if (boundId === sessionId) {
|
|
43
|
+
delete bindings[userId];
|
|
44
|
+
changed = true;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
if (changed)
|
|
48
|
+
writeBindings(bindings);
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=bindings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bindings.js","sourceRoot":"","sources":["../src/bindings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC;AAM3E,SAAS,YAAY;IACnB,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;QACnE,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YAClD,OAAO,MAAkB,CAAC;QAC5B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IACV,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,aAAa,CAAC,QAAkB;IACvC,IAAI,CAAC;QACH,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,OAAO,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAc,EAAE,SAAiB;IAC1D,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,QAAQ,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;IAC7B,aAAa,CAAC,QAAQ,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,IAAI,CAAC,CAAC,MAAM,IAAI,QAAQ,CAAC;QAAE,OAAO;IAClC,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC;IACxB,aAAa,CAAC,QAAQ,CAAC,CAAC;AAC1B,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,sBAAsB,CAAC,SAAiB;IACtD,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC;YACxB,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;IACH,CAAC;IACD,IAAI,OAAO;QAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// Claude Code's own config (~/.claude.json), which wechat-claude only touches
|
|
2
|
+
// to keep unattended /run tasks from stalling.
|
|
3
|
+
import fs from "node:fs";
|
|
4
|
+
import os from "node:os";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
export const CLAUDE_CONFIG_FILE = path.join(os.homedir(), ".claude.json");
|
|
7
|
+
const BYPASS_KEY = "bypassPermissionsModeAccepted";
|
|
8
|
+
function readConfig(file) {
|
|
9
|
+
try {
|
|
10
|
+
const parsed = JSON.parse(fs.readFileSync(file, "utf-8"));
|
|
11
|
+
if (typeof parsed === "object" && parsed !== null && !Array.isArray(parsed))
|
|
12
|
+
return parsed;
|
|
13
|
+
}
|
|
14
|
+
catch { }
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
export function isBypassAccepted(file = CLAUDE_CONFIG_FILE) {
|
|
18
|
+
return readConfig(file)?.[BYPASS_KEY] === true;
|
|
19
|
+
}
|
|
20
|
+
// `claude --dangerously-skip-permissions` shows a one-time interactive consent
|
|
21
|
+
// dialog until this flag is set. A /run task starts detached in tmux with
|
|
22
|
+
// nobody to answer it, so the session would sit on that prompt forever.
|
|
23
|
+
export function ensureBypassAccepted(file = CLAUDE_CONFIG_FILE) {
|
|
24
|
+
const config = readConfig(file);
|
|
25
|
+
if (config === null)
|
|
26
|
+
return "failed";
|
|
27
|
+
if (config[BYPASS_KEY] === true)
|
|
28
|
+
return "already";
|
|
29
|
+
config[BYPASS_KEY] = true;
|
|
30
|
+
// Write via a temp file in the same directory and rename: Claude Code writes
|
|
31
|
+
// this file too, and a partial write would cost the user their whole config.
|
|
32
|
+
const tmp = `${file}.wechat-claude.${process.pid}.tmp`;
|
|
33
|
+
try {
|
|
34
|
+
const mode = fs.statSync(file).mode & 0o777;
|
|
35
|
+
fs.writeFileSync(tmp, JSON.stringify(config, null, 2), { mode });
|
|
36
|
+
fs.renameSync(tmp, file);
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
try {
|
|
40
|
+
fs.unlinkSync(tmp);
|
|
41
|
+
}
|
|
42
|
+
catch { }
|
|
43
|
+
return "failed";
|
|
44
|
+
}
|
|
45
|
+
// Confirm from disk rather than trusting the write: a concurrent writer may
|
|
46
|
+
// have replaced the file between our read and our rename.
|
|
47
|
+
return isBypassAccepted(file) ? "accepted" : "failed";
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=claude-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-config.js","sourceRoot":"","sources":["../src/claude-config.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,+CAA+C;AAC/C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,cAAc,CAAC,CAAC;AAE1E,MAAM,UAAU,GAAG,+BAA+B,CAAC;AAEnD,SAAS,UAAU,CAAC,IAAY;IAC9B,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;QACnE,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YACzE,OAAO,MAAiC,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IACV,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAI,GAAG,kBAAkB;IACxD,OAAO,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC;AACjD,CAAC;AAQD,+EAA+E;AAC/E,0EAA0E;AAC1E,wEAAwE;AACxE,MAAM,UAAU,oBAAoB,CAAC,IAAI,GAAG,kBAAkB;IAC5D,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,QAAQ,CAAC;IACrC,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAElD,MAAM,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;IAE1B,6EAA6E;IAC7E,6EAA6E;IAC7E,MAAM,GAAG,GAAG,GAAG,IAAI,kBAAkB,OAAO,CAAC,GAAG,MAAM,CAAC;IACvD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC;QAC5C,EAAE,CAAC,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACjE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,CAAC;YACH,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACV,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,4EAA4E;IAC5E,0DAA0D;IAC1D,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC;AACxD,CAAC"}
|
package/dist/cli.d.ts
ADDED
package/dist/cli.js
ADDED
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// wechat-claude CLI: one-command setup, login, status, and daemon control.
|
|
3
|
+
//
|
|
4
|
+
// wechat-claude setup register MCP server + slash command, then login
|
|
5
|
+
// wechat-claude login (re)authenticate by scanning a QR code
|
|
6
|
+
// wechat-claude status show daemon / login state
|
|
7
|
+
// wechat-claude daemon [cmd] run or manage the background daemon
|
|
8
|
+
import { spawn, spawnSync } from "node:child_process";
|
|
9
|
+
import fs from "node:fs";
|
|
10
|
+
import os from "node:os";
|
|
11
|
+
import path from "node:path";
|
|
12
|
+
import { fileURLToPath } from "node:url";
|
|
13
|
+
import { ILinkClient } from "./ilink.js";
|
|
14
|
+
import { pkgFile } from "./pkg-root.js";
|
|
15
|
+
import { DAEMON_PID_FILE, ensureDirs, WECHAT_DIR } from "./paths.js";
|
|
16
|
+
import * as launchd from "./launchd.js";
|
|
17
|
+
const DAEMON_JS = fileURLToPath(new URL("./daemon.js", import.meta.url));
|
|
18
|
+
const SERVER_JS = fileURLToPath(new URL("./server.js", import.meta.url));
|
|
19
|
+
const DAEMON_LOG = path.join(WECHAT_DIR, "daemon.log");
|
|
20
|
+
function out(s) {
|
|
21
|
+
process.stdout.write(s + "\n");
|
|
22
|
+
}
|
|
23
|
+
function run(cmd, args) {
|
|
24
|
+
const r = spawnSync(cmd, args, { stdio: "inherit" });
|
|
25
|
+
return r.status === 0;
|
|
26
|
+
}
|
|
27
|
+
function registerMcpServer() {
|
|
28
|
+
out(`→ Registering MCP server (claude mcp add wechat)…`);
|
|
29
|
+
const ok = run("claude", [
|
|
30
|
+
"mcp",
|
|
31
|
+
"add",
|
|
32
|
+
"--scope",
|
|
33
|
+
"user",
|
|
34
|
+
"wechat",
|
|
35
|
+
"node",
|
|
36
|
+
SERVER_JS,
|
|
37
|
+
]);
|
|
38
|
+
out(ok ? " ✓ registered" : " ! failed (is the `claude` CLI on your PATH?)");
|
|
39
|
+
}
|
|
40
|
+
function installSlashCommand() {
|
|
41
|
+
const src = pkgFile("wechat.md");
|
|
42
|
+
const destDir = path.join(os.homedir(), ".claude", "commands");
|
|
43
|
+
const dest = path.join(destDir, "wechat.md");
|
|
44
|
+
try {
|
|
45
|
+
fs.mkdirSync(destDir, { recursive: true });
|
|
46
|
+
fs.copyFileSync(src, dest);
|
|
47
|
+
out(` ✓ /wechat command installed to ${dest}`);
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
out(` ! could not install /wechat command: ${err instanceof Error ? err.message : String(err)}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function tryOpen(url) {
|
|
54
|
+
const opener = process.platform === "darwin"
|
|
55
|
+
? "open"
|
|
56
|
+
: process.platform === "win32"
|
|
57
|
+
? "cmd"
|
|
58
|
+
: "xdg-open";
|
|
59
|
+
const args = process.platform === "win32" ? ["/c", "start", "", url] : [url];
|
|
60
|
+
spawnSync(opener, args, { stdio: "ignore" });
|
|
61
|
+
}
|
|
62
|
+
async function login() {
|
|
63
|
+
const client = new ILinkClient();
|
|
64
|
+
out("→ Requesting a login QR code…");
|
|
65
|
+
try {
|
|
66
|
+
await client.login((url) => {
|
|
67
|
+
out("");
|
|
68
|
+
out("Scan this QR code with WeChat to log in.");
|
|
69
|
+
out("Open this URL in a browser to display the QR image, then scan it:");
|
|
70
|
+
out("");
|
|
71
|
+
out(" " + url);
|
|
72
|
+
out("");
|
|
73
|
+
tryOpen(url);
|
|
74
|
+
out("(waiting for scan — this window will update)…");
|
|
75
|
+
}, (status) => {
|
|
76
|
+
if (status === "scaned")
|
|
77
|
+
out(" • scanned, waiting for confirmation…");
|
|
78
|
+
});
|
|
79
|
+
out(" ✓ logged in — session saved to ~/.claude/wechat/session.json");
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
out(` ! login failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
function identifyProcess(pid) {
|
|
88
|
+
if (process.platform === "win32")
|
|
89
|
+
return "unknown"; // no ps
|
|
90
|
+
const r = spawnSync("ps", ["-o", "command=", "-p", String(pid)], {
|
|
91
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
92
|
+
});
|
|
93
|
+
// A missing/broken ps is "unknown"; ps running and finding nothing is a real
|
|
94
|
+
// answer, but the caller only asks about pids it has already seen alive.
|
|
95
|
+
if (r.error)
|
|
96
|
+
return "unknown";
|
|
97
|
+
if (r.status !== 0)
|
|
98
|
+
return "other";
|
|
99
|
+
const cmd = (r.stdout ?? "").toString().trim();
|
|
100
|
+
if (cmd === "")
|
|
101
|
+
return "unknown";
|
|
102
|
+
// Match any install's daemon.js, not just this one: after an upgrade the
|
|
103
|
+
// running daemon legitimately comes from the previous install path.
|
|
104
|
+
return /\bnode\b/.test(cmd) && /daemon\.js(\s|$)/.test(cmd) ? "daemon" : "other";
|
|
105
|
+
}
|
|
106
|
+
// The daemon's pid, or undefined when the pid file is absent or stale. Removes
|
|
107
|
+
// a stale file so the next reader is not misled by it.
|
|
108
|
+
function readDaemonPid() {
|
|
109
|
+
let pid;
|
|
110
|
+
try {
|
|
111
|
+
pid = parseInt(fs.readFileSync(DAEMON_PID_FILE, "utf-8").trim(), 10);
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
return undefined;
|
|
115
|
+
}
|
|
116
|
+
if (!Number.isFinite(pid) || pid <= 0)
|
|
117
|
+
return undefined;
|
|
118
|
+
try {
|
|
119
|
+
process.kill(pid, 0);
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
try {
|
|
123
|
+
fs.unlinkSync(DAEMON_PID_FILE);
|
|
124
|
+
}
|
|
125
|
+
catch { }
|
|
126
|
+
return undefined;
|
|
127
|
+
}
|
|
128
|
+
if (identifyProcess(pid) === "other") {
|
|
129
|
+
out(` ! pid file points at pid ${pid}, which is not a wechat-claude daemon — ignoring it`);
|
|
130
|
+
try {
|
|
131
|
+
fs.unlinkSync(DAEMON_PID_FILE);
|
|
132
|
+
}
|
|
133
|
+
catch { }
|
|
134
|
+
return undefined;
|
|
135
|
+
}
|
|
136
|
+
// "unknown" (Windows, or no usable ps) falls through: an unverifiable pid is
|
|
137
|
+
// still the best information we have, and treating it as stale would delete
|
|
138
|
+
// a live daemon's pid file and let a second poller start.
|
|
139
|
+
return pid;
|
|
140
|
+
}
|
|
141
|
+
function daemonRunning() {
|
|
142
|
+
return readDaemonPid() !== undefined;
|
|
143
|
+
}
|
|
144
|
+
function status() {
|
|
145
|
+
const client = new ILinkClient();
|
|
146
|
+
const loggedIn = client.tryRestoreSession();
|
|
147
|
+
out(`Logged in: ${loggedIn ? "yes" : "no"}`);
|
|
148
|
+
out(`Daemon running: ${daemonRunning() ? "yes" : "no"}`);
|
|
149
|
+
if (launchd.isMac())
|
|
150
|
+
out(`launchd service: ${launchd.isLoaded() ? "installed" : "not installed"}`);
|
|
151
|
+
out(`Data dir: ${WECHAT_DIR}`);
|
|
152
|
+
if (!loggedIn)
|
|
153
|
+
out("\nRun `wechat-claude login` to authenticate.");
|
|
154
|
+
else if (!daemonRunning())
|
|
155
|
+
out("\nStart the daemon with `wechat-claude daemon` (or it auto-starts via /wechat).");
|
|
156
|
+
}
|
|
157
|
+
// Stop the running daemon and wait for the pid to actually go away, so the
|
|
158
|
+
// replacement does not lose its own singleton race against the old process.
|
|
159
|
+
function stopDaemon() {
|
|
160
|
+
const pid = readDaemonPid();
|
|
161
|
+
if (pid === undefined)
|
|
162
|
+
return false;
|
|
163
|
+
try {
|
|
164
|
+
process.kill(pid, "SIGTERM");
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
return false;
|
|
168
|
+
}
|
|
169
|
+
for (let i = 0; i < 50; i++) {
|
|
170
|
+
try {
|
|
171
|
+
process.kill(pid, 0);
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
return true;
|
|
175
|
+
}
|
|
176
|
+
spawnSync("sleep", ["0.1"]);
|
|
177
|
+
}
|
|
178
|
+
// Re-check identity before escalating: over five seconds the daemon could
|
|
179
|
+
// have exited and its pid been handed to something else. Only a confirmed
|
|
180
|
+
// daemon gets SIGKILL — "unknown" is not good enough to kill on.
|
|
181
|
+
if (identifyProcess(pid) === "daemon") {
|
|
182
|
+
try {
|
|
183
|
+
process.kill(pid, "SIGKILL");
|
|
184
|
+
}
|
|
185
|
+
catch { }
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
out(` ! pid ${pid} did not exit and can no longer be confirmed as the daemon — not forcing it`);
|
|
189
|
+
}
|
|
190
|
+
return true;
|
|
191
|
+
}
|
|
192
|
+
// Spawning only proves node launched. The daemon exits non-zero when there is
|
|
193
|
+
// no saved session, so wait for it to claim the pid file before reporting it up.
|
|
194
|
+
function startDaemonDetached() {
|
|
195
|
+
let child;
|
|
196
|
+
try {
|
|
197
|
+
ensureDirs();
|
|
198
|
+
const logFd = fs.openSync(DAEMON_LOG, "a");
|
|
199
|
+
child = spawn(process.execPath, [DAEMON_JS], {
|
|
200
|
+
detached: true,
|
|
201
|
+
stdio: ["ignore", logFd, logFd],
|
|
202
|
+
});
|
|
203
|
+
child.unref();
|
|
204
|
+
fs.closeSync(logFd);
|
|
205
|
+
}
|
|
206
|
+
catch (err) {
|
|
207
|
+
out(` ! could not start the daemon: ${err instanceof Error ? err.message : String(err)}`);
|
|
208
|
+
return false;
|
|
209
|
+
}
|
|
210
|
+
for (let i = 0; i < 50; i++) {
|
|
211
|
+
if (readDaemonPid() === child.pid) {
|
|
212
|
+
out(` ✓ daemon started (pid ${child.pid}), logging to ${DAEMON_LOG}`);
|
|
213
|
+
return true;
|
|
214
|
+
}
|
|
215
|
+
spawnSync("sleep", ["0.1"]);
|
|
216
|
+
}
|
|
217
|
+
out(` ! the daemon exited during startup — check ${DAEMON_LOG}`);
|
|
218
|
+
out(" (a missing WeChat login is the usual cause: run `wechat-claude login`)");
|
|
219
|
+
return false;
|
|
220
|
+
}
|
|
221
|
+
function daemon(sub) {
|
|
222
|
+
switch (sub) {
|
|
223
|
+
case undefined:
|
|
224
|
+
case "run": {
|
|
225
|
+
// Foreground: replace this process's stdio with the daemon's.
|
|
226
|
+
const r = spawnSync(process.execPath, [DAEMON_JS], { stdio: "inherit" });
|
|
227
|
+
return r.status ?? 1;
|
|
228
|
+
}
|
|
229
|
+
case "install": {
|
|
230
|
+
if (!launchd.isMac()) {
|
|
231
|
+
out("launchd is macOS-only. On Linux/Windows, supervise the daemon");
|
|
232
|
+
out("yourself: `wechat-claude daemon` under systemd, pm2, or similar.");
|
|
233
|
+
return 1;
|
|
234
|
+
}
|
|
235
|
+
const plist = launchd.writePlist();
|
|
236
|
+
out(`→ Wrote ${plist}`);
|
|
237
|
+
// Hand the singleton over to launchd first. Otherwise its child hits the
|
|
238
|
+
// daemon's pid-file guard and exits 0 — and KeepAlive.SuccessfulExit
|
|
239
|
+
// false means launchd never retries, so the job supervises nothing while
|
|
240
|
+
// still reporting success.
|
|
241
|
+
if (stopDaemon())
|
|
242
|
+
out(" ✓ stopped the existing daemon so launchd can own it");
|
|
243
|
+
const ok = launchd.load();
|
|
244
|
+
out(ok ? " ✓ service loaded (starts at login, restarts on crash)" : " ! launchctl load failed");
|
|
245
|
+
return ok ? 0 : 1;
|
|
246
|
+
}
|
|
247
|
+
case "restart": {
|
|
248
|
+
// A running daemon holds the old code in memory, so an upgrade only
|
|
249
|
+
// takes effect once it is replaced. Under launchd, let it do the
|
|
250
|
+
// restarting; otherwise stop the process and spawn a fresh detached one.
|
|
251
|
+
if (launchd.isMac() && launchd.isLoaded()) {
|
|
252
|
+
const ok = launchd.load();
|
|
253
|
+
out(ok ? " ✓ launchd service restarted" : " ! launchctl reload failed");
|
|
254
|
+
return ok ? 0 : 1;
|
|
255
|
+
}
|
|
256
|
+
if (stopDaemon())
|
|
257
|
+
out(" ✓ stopped the running daemon");
|
|
258
|
+
else
|
|
259
|
+
out(" • no daemon was running");
|
|
260
|
+
return startDaemonDetached() ? 0 : 1;
|
|
261
|
+
}
|
|
262
|
+
case "uninstall": {
|
|
263
|
+
if (!launchd.isMac()) {
|
|
264
|
+
out("launchd is macOS-only — nothing to uninstall.");
|
|
265
|
+
return 1;
|
|
266
|
+
}
|
|
267
|
+
launchd.unload();
|
|
268
|
+
try {
|
|
269
|
+
fs.rmSync(launchd.PLIST_PATH);
|
|
270
|
+
out(` ✓ removed ${launchd.PLIST_PATH}`);
|
|
271
|
+
}
|
|
272
|
+
catch {
|
|
273
|
+
out(" • no launchd service was installed");
|
|
274
|
+
}
|
|
275
|
+
return 0;
|
|
276
|
+
}
|
|
277
|
+
case "status": {
|
|
278
|
+
out(`Daemon running: ${daemonRunning() ? "yes" : "no"}`);
|
|
279
|
+
if (launchd.isMac())
|
|
280
|
+
out(`launchd service: ${launchd.isLoaded() ? "loaded" : "not loaded"}`);
|
|
281
|
+
return 0;
|
|
282
|
+
}
|
|
283
|
+
case "log": {
|
|
284
|
+
const r = spawnSync("tail", ["-f", DAEMON_LOG], { stdio: "inherit" });
|
|
285
|
+
return r.status ?? 1;
|
|
286
|
+
}
|
|
287
|
+
default:
|
|
288
|
+
out(`Unknown daemon command: ${sub}`);
|
|
289
|
+
out("Usage: wechat-claude daemon [run|restart|install|uninstall|status|log]");
|
|
290
|
+
return 1;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
function usage() {
|
|
294
|
+
out("wechat-claude — control Claude Code from WeChat\n");
|
|
295
|
+
out("Usage:");
|
|
296
|
+
out(" wechat-claude setup register MCP server + /wechat command, then log in");
|
|
297
|
+
out(" wechat-claude login (re)authenticate by scanning a QR code");
|
|
298
|
+
out(" wechat-claude status show daemon / login state");
|
|
299
|
+
out(" wechat-claude daemon run the daemon in the foreground");
|
|
300
|
+
out(" wechat-claude daemon restart restart it (use after an upgrade)");
|
|
301
|
+
out(" wechat-claude daemon install install it as a launchd service (macOS)");
|
|
302
|
+
out(" wechat-claude daemon uninstall remove the launchd service");
|
|
303
|
+
out(" wechat-claude daemon status check daemon / service state");
|
|
304
|
+
out(" wechat-claude daemon log tail the daemon log\n");
|
|
305
|
+
out("After setup: start the daemon, then type /wechat in a Claude Code session.");
|
|
306
|
+
}
|
|
307
|
+
async function main() {
|
|
308
|
+
const cmd = process.argv[2];
|
|
309
|
+
switch (cmd) {
|
|
310
|
+
case "setup": {
|
|
311
|
+
out("Setting up wechat-claude…\n");
|
|
312
|
+
registerMcpServer();
|
|
313
|
+
installSlashCommand();
|
|
314
|
+
out("");
|
|
315
|
+
const ok = await login();
|
|
316
|
+
out("");
|
|
317
|
+
if (ok) {
|
|
318
|
+
out("Setup complete. Next steps:");
|
|
319
|
+
out(" 1. Start the daemon: wechat-claude daemon install (auto-start, macOS)");
|
|
320
|
+
out(" wechat-claude daemon (foreground)");
|
|
321
|
+
out(" 2. In a Claude Code session, type: /wechat");
|
|
322
|
+
}
|
|
323
|
+
else {
|
|
324
|
+
out("Setup finished with login pending — run `wechat-claude login` to retry.");
|
|
325
|
+
}
|
|
326
|
+
break;
|
|
327
|
+
}
|
|
328
|
+
case "login":
|
|
329
|
+
await login();
|
|
330
|
+
break;
|
|
331
|
+
case "status":
|
|
332
|
+
status();
|
|
333
|
+
break;
|
|
334
|
+
case "daemon":
|
|
335
|
+
process.exitCode = daemon(process.argv[3]);
|
|
336
|
+
break;
|
|
337
|
+
default:
|
|
338
|
+
usage();
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
main().catch((err) => {
|
|
342
|
+
process.stderr.write(`Fatal: ${err}\n`);
|
|
343
|
+
process.exit(1);
|
|
344
|
+
});
|
|
345
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/daemon.d.ts
ADDED