wezard 1.2.23 → 1.2.25

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/cli/wezard.sh CHANGED
@@ -89,6 +89,31 @@ probe() { curl -sS --noproxy '*' --connect-timeout 1 --max-time 1 "$DAEMON_B
89
89
  wait_up() { for _ in $(seq 1 30); do probe && return 0; sleep 0.3; done; return 1; }
90
90
  wait_down() { for _ in $(seq 1 30); do probe || return 0; sleep 0.3; done; return 1; }
91
91
 
92
+ # Nohup fallback for Linux boxes with no systemd user session (containers, CI,
93
+ # minimal images where D-Bus is unreachable). Detached background node process,
94
+ # pidfile-tracked so svc_unregister can find it again. augmentedPath isn't
95
+ # needed here — the CLI itself already runs with the user's interactive PATH.
96
+ PIDFILE="$HOME_DIR/.wezard/daemon.pid"
97
+ DAEMON_ENTRY="$REPO_ROOT/dist/daemon/index.js"
98
+ nohup_start() {
99
+ [[ -f "$DAEMON_ENTRY" ]] || { echo "[wezard] missing $DAEMON_ENTRY — run 'npm run build'" >&2; return 1; }
100
+ mkdir -p "$HOME_DIR/.wezard"
101
+ nohup "$(command -v node)" "$DAEMON_ENTRY" \
102
+ >> "$HOME_DIR/.wezard/daemon.stdout.log" \
103
+ 2>> "$HOME_DIR/.wezard/daemon.stderr.log" &
104
+ echo $! > "$PIDFILE"
105
+ }
106
+ nohup_stop() {
107
+ [[ -f "$PIDFILE" ]] || return 0
108
+ local pid; pid="$(cat "$PIDFILE" 2>/dev/null)"
109
+ [[ -n "$pid" ]] && kill "$pid" 2>/dev/null || true
110
+ rm -f "$PIDFILE"
111
+ }
112
+ # True when a usable systemd --user session is reachable. `systemctl --user`
113
+ # returns "Failed to get D-Bus connection" (exit≠0) in containers; probing it
114
+ # once lets every lifecycle command pick systemd-vs-nohup consistently.
115
+ have_systemd_user() { command -v systemctl >/dev/null 2>&1 && systemctl --user show-environment >/dev/null 2>&1; }
116
+
92
117
  # idempotent converge-to-running: kick if already bootstrapped, else bootstrap,
93
118
  # else legacy load — then assert it actually bound.
94
119
  ensure_up() {
@@ -97,7 +122,17 @@ ensure_up() {
97
122
  launchctl kickstart -k "gui/$(id -u)/${LABEL}" 2>/dev/null \
98
123
  || launchctl bootstrap "gui/$(id -u)" "$PLIST" 2>/dev/null \
99
124
  || launchctl load -w "$PLIST" 2>/dev/null || true ;;
100
- Linux) systemctl --user restart wezard.service ;;
125
+ Linux)
126
+ # Prefer systemd when it's actually there; otherwise fall back to a
127
+ # detached node process. reload/restart already ran graceful_stop, but a
128
+ # stale nohup pid may still be around — clear it before relaunching.
129
+ if have_systemd_user; then
130
+ systemctl --user restart wezard.service 2>/dev/null || { echo "[wezard] systemctl --user restart failed" >&2; return 1; }
131
+ else
132
+ echo "[wezard] no systemd user session (container?) — starting daemon via nohup" >&2
133
+ nohup_stop
134
+ nohup_start || return 1
135
+ fi ;;
101
136
  esac
102
137
  wait_up
103
138
  }
@@ -112,7 +147,9 @@ svc_unregister() {
112
147
  case "$OS" in
113
148
  Darwin) launchctl bootout "gui/$(id -u)/${LABEL}" 2>/dev/null \
114
149
  || launchctl unload "$PLIST" 2>/dev/null || true ;;
115
- Linux) systemctl --user stop wezard.service ;;
150
+ Linux)
151
+ if have_systemd_user; then systemctl --user stop wezard.service 2>/dev/null || true
152
+ else nohup_stop; fi ;;
116
153
  esac
117
154
  }
118
155
 
@@ -163,6 +200,16 @@ case "$cmd" in
163
200
  logs)
164
201
  log_path=$(http_get /status 2>/dev/null | jq -r '.logFile // empty' 2>/dev/null || true)
165
202
  log_path="${log_path:-$HOME_DIR/.wezard/daemon.log}"
203
+ # On the nohup fallback path there's no daemon.log — stdout/stderr go to
204
+ # separate files. Prefer whichever actually exists so `logs` isn't empty.
205
+ if [[ ! -f "$log_path" && -f "$HOME_DIR/.wezard/daemon.stderr.log" ]]; then
206
+ log_path="$HOME_DIR/.wezard/daemon.stderr.log"
207
+ fi
208
+ if [[ ! -f "$log_path" ]]; then
209
+ echo "[wezard] daemon has never started — no log file at $log_path" >&2
210
+ echo "[wezard] start it with 'wezard start' (or 'wezard reload')" >&2
211
+ exit 1
212
+ fi
166
213
  if [[ "${1:-}" == "-f" ]]; then tail -f "$log_path"; else tail -n 100 "$log_path"; fi
167
214
  ;;
168
215
  config-path) http_get /status | jq -r '.sourcePath // empty' ;;
package/dist/cli/sync.js CHANGED
@@ -2,6 +2,7 @@
2
2
  // (e.g. ~/.claude/settings.json so claude-internal wrappers pick them up).
3
3
  // Idempotent + reversible via per-target lock manifest in ~/.wezard/sync.lock.json.
4
4
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
5
+ import { spawnSync } from "node:child_process";
5
6
  import { dirname, resolve as pathResolve } from "node:path";
6
7
  import { fileURLToPath } from "node:url";
7
8
  import { parse as parseJsonc } from "jsonc-parser";
@@ -122,6 +123,27 @@ const stripEnv = (settings) => {
122
123
  for (const k of [...ENV_KEYS, ...LEGACY_ENV_KEYS])
123
124
  delete env[k];
124
125
  };
126
+ // ── Pre-flight: jq is required by hooks/pre-tool-use.sh ──────────────
127
+ // The hook hard-falls back to a local `ask` when jq is missing, which means
128
+ // approval cards never reach WeCom — silent, confusing failure on fresh
129
+ // installs. Catch it here at registration time with install instructions.
130
+ const requireJq = () => {
131
+ const r = spawnSync("jq", ["--version"], { stdio: "ignore" });
132
+ if (r.status === 0)
133
+ return;
134
+ const install = (() => {
135
+ switch (process.platform) {
136
+ case "darwin": return "brew install jq";
137
+ case "linux": return "sudo apt-get install -y jq # or: sudo yum install -y jq / sudo apk add jq";
138
+ default: return "install jq for your platform";
139
+ }
140
+ })();
141
+ // eslint-disable-next-line no-console
142
+ console.error(`\n[wezard-sync] ERROR: 'jq' is required by the PreToolUse hook but not found on PATH.\n` +
143
+ ` Approval cards will NOT be delivered until it is installed.\n` +
144
+ ` Install it, then re-run sync:\n ${install}\n`);
145
+ process.exit(1);
146
+ };
125
147
  // ── Drivers ───────────────────────────────────────────────────────────
126
148
  const targetKey = (path) => expandHome(path);
127
149
  // CodeBuddy reads MCP server config from `~/.codebuddy/mcp.json`, NOT from
@@ -174,6 +196,7 @@ const main = () => {
174
196
  const remove = argv.includes("--remove") || argv.includes("--uninstall");
175
197
  const dryRun = argv.includes("--dry-run");
176
198
  const { config: cfg } = loadConfig();
199
+ requireJq();
177
200
  const targets = cfg.sync.targets;
178
201
  if (targets.length === 0) {
179
202
  // eslint-disable-next-line no-console
@@ -1 +1 @@
1
- {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../cli/sync.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../cli/sync.ts"],"names":[],"mappings":"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"}
@@ -852,14 +852,15 @@ export const buildAskqDriveActions = (questions, picks) => {
852
852
  };
853
853
  // 「聊聊这个」: 光标钳 0 后落到第 N 行 (自定义文本行), 贴入引导语 — 自由文本
854
854
  // 答案本身即语义完整 (hook 若触发, deny+reason 会再覆盖成同款文案)。
855
- // 两个 Enter: 第一个把自定义文本确认为本题答案并前进到提交页, 第二个在提交页
856
- // (光标 0 = "1. Submit answers") 收工 buildAskqDriveActions 尾部同一收工 Enter。
857
- // 缺第二个 Enter 会停在提交页, CLI 一直等输入 (即 talk-about-this 卡住的根因)。
855
+ // text 动作里 inject 负责 paste + 首个 Enter (确认自定义文本为本题答案、前进到
856
+ // 提交页)。收尾不再盲发第二个 Enter —— codebuddy CLI 里自定义行必须有实际输入
857
+ // 才能确认, 且要真正落到 "Submit answers" 页再 Enter 才结束; 盲发在光标漂移 /
858
+ // 文本没落下时提交不了, CLI 死等输入 (talk-about-this 卡死根因)。改由 confirm_submit
859
+ // 让 mirror 侧读屏确认已到提交页 → Enter → 确认面板关闭, 失败重试。
858
860
  export const buildAskqChatDriveActions = (q) => [
859
861
  { kind: "keys", keys: [...Array(q.options.length + 3).fill("Up"), ...Array(q.options.length).fill("Down")] },
860
862
  { kind: "text", text: "先不回答,我想和你讨论一下这个问题" },
861
- { kind: "keys", keys: ["Enter"] },
862
- { kind: "keys", keys: ["Enter"] },
863
+ { kind: "confirm_submit" },
863
864
  ];
864
865
  export const runMirrorAskqFlow = async ({ log, client, sessionId, chatKey, toolInput, voteTimeoutMs, drive }) => {
865
866
  const questions = parseAskqInput(toolInput);
@@ -993,8 +994,6 @@ export const runMirrorAskqFlow = async ({ log, client, sessionId, chatKey, toolI
993
994
  // 驱动成功 = 面板已按 WeCom 答案提交, 结果随工具自然落地。清槽放掉后续提问;
994
995
  // hook 若迟到, 无槽 → allow → 本地 (即我们驱动的) 答案原样生效, 语义一致。
995
996
  mirrorAskqSlots.delete(sessionId);
996
- // 回执同 hook 流: 答完后 model 进入不可见长 thinking, 先确认答案已落地。
997
- await note(total === 1 ? "✅ 已回传,Claude 处理中…" : `✅ ${total} 题已回传,Claude 处理中…`);
998
997
  };
999
998
  const mirrorPlanSlots = new Map();
1000
999
  const MIRROR_PLAN_SLOT_TTL_MS = 12 * 3600_000; // 与 approval.longPollSec 对齐
@@ -1226,22 +1225,6 @@ const handleAskUserQuestion = async ({ cfg, log, client, body, getMirrorTarget,
1226
1225
  const reason = total === 1
1227
1226
  ? `User answered ${answers[0]} via WeCom`
1228
1227
  : `User answered ${total} questions via WeCom — ${answers.join("; ")}`;
1229
- // 答完最后一题后 model 进入不可见的长 thinking (隐藏式 thinking 不下发,
1230
- // WeCom 端全静默,极易被当成"卡住")。推一条回执确认答案已落地。失败不阻断。
1231
- // 客户端已断开时回执是谎言 (答案送不回去了), 跳过。
1232
- if (!gone) {
1233
- try {
1234
- await client.sendMessage(target, {
1235
- msgtype: "markdown",
1236
- markdown: {
1237
- content: withTagHeader(approver, total === 1 ? "✅ 已回传,Claude 处理中…" : `✅ ${total} 题已回传,Claude 处理中…`),
1238
- },
1239
- });
1240
- }
1241
- catch (e) {
1242
- log.warn({ err: e.message }, "askq ack send failed");
1243
- }
1244
- }
1245
1228
  return { decision: "deny", reason };
1246
1229
  };
1247
1230
  const decisionToHook = (d) => (d === "deny" ? "deny" : "allow");