@zmainer/dsh-wx-bridge 1.1.1 → 1.1.2
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/README.md +6 -0
- package/lib/kernel/wxpush.mjs +30 -4
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -266,6 +266,12 @@ ode_modules\@zmainer\dsh-wx-bridge` → 改名成 `...dsh-wx-bridge.bak` 更稳
|
|
|
266
266
|
|
|
267
267
|
## 最近变更
|
|
268
268
|
|
|
269
|
+
- **1.1.2**:修 `wxpush.mjs` 的**默认数据目录解析**——原来只按 `$DSH_HOME/wxbridge` 兜底,桌面端
|
|
270
|
+
(Electron)里 `DSH_HOME` 常为空或指向另一个 home,于是消息被排进 `~/.dsh/wxbridge/outbox`,
|
|
271
|
+
而桥在 `%APPDATA%\dsh-desktop\harness\wxbridge` 取件 ⇒ **排了队没人发**(本机实测)。
|
|
272
|
+
现在顺序是:`--data-dir`/`WXBRIDGE_DATA`/`BRIDGE_DATA` → `WXBRIDGE_CONFIG` 里的 `dataDir` →
|
|
273
|
+
**本文件自己所在的目录**(桥每次启动都把 CLI 刷到 `<dataDir>/wxpush.mjs`,跟着文件走永远对)。
|
|
274
|
+
另加 `--print-dir` 便于排查「消息推到哪去了」。
|
|
269
275
|
- **1.1.1**:**默认权限预设从 `danger-full-access` 收紧为 `workspace-write`**——审批能在微信里答了以后,
|
|
270
276
|
"手机端无人可答审批"就不再是把通道放到最宽的理由。行为变化:工作区之外的写与提权会先在微信里弹审批卡
|
|
271
277
|
(回「批准 / 拒绝」),要旧行为就把 `acp.permPreset` 设回 `danger-full-access`,要更严设 `read-only`。
|
package/lib/kernel/wxpush.mjs
CHANGED
|
@@ -11,10 +11,11 @@
|
|
|
11
11
|
* 它只做一件事:把一条 JSON 丢进 <dataDir>/outbox/,桥轮询时替它发出去。
|
|
12
12
|
* 零依赖、零网络:没有微信凭据 / 桥没在跑时也只是排队,不会报错给你。
|
|
13
13
|
*/
|
|
14
|
-
import { mkdirSync, writeFileSync } from 'node:fs'
|
|
15
|
-
import { join, resolve } from 'node:path'
|
|
14
|
+
import { mkdirSync, writeFileSync, readFileSync } from 'node:fs'
|
|
15
|
+
import { join, resolve, dirname } from 'node:path'
|
|
16
16
|
import { homedir } from 'node:os'
|
|
17
17
|
import { randomUUID } from 'node:crypto'
|
|
18
|
+
import { fileURLToPath } from 'node:url'
|
|
18
19
|
|
|
19
20
|
const args = process.argv.slice(2)
|
|
20
21
|
const argOf = (name, def = '') => { const i = args.indexOf(name); return i >= 0 && args[i + 1] !== undefined ? args[i + 1] : def }
|
|
@@ -37,14 +38,39 @@ async function readStdin() {
|
|
|
37
38
|
return out.trim()
|
|
38
39
|
}
|
|
39
40
|
|
|
41
|
+
/**
|
|
42
|
+
* 数据目录解析(顺序很重要,2026-09-24 实测踩过):
|
|
43
|
+
* ① --data-dir / WXBRIDGE_DATA / BRIDGE_DATA —— 显式指定,永远最大
|
|
44
|
+
* ② WXBRIDGE_CONFIG 指向的配置里的 dataDir —— 同样的显式配置链
|
|
45
|
+
* ③ **本文件自己所在的目录** —— 桥每次启动都会把本文件刷到 <dataDir>/wxpush.mjs 一份,
|
|
46
|
+
* 所以"跟着这个文件走"永远等于桥真正在用的目录,不依赖任何环境变量
|
|
47
|
+
* 刻意**不读** $DSH_HOME/wxbridge/config.json 之类:桌面端(Electron)里 DSH_HOME 常为空或指向
|
|
48
|
+
* 另一个 home,读到的可能是旧目录里的旧 dataDir;实测症状就是"推送排了队,桥那头没人取件"。
|
|
49
|
+
*/
|
|
50
|
+
const SELF_DIR = dirname(fileURLToPath(import.meta.url))
|
|
51
|
+
|
|
52
|
+
function explicitConfigDataDir() {
|
|
53
|
+
const f = process.env.WXBRIDGE_CONFIG
|
|
54
|
+
if (!f) return ''
|
|
55
|
+
try {
|
|
56
|
+
const d = JSON.parse(readFileSync(f, 'utf8')).dataDir
|
|
57
|
+
return d ? resolve(String(d)) : ''
|
|
58
|
+
} catch { return '' }
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const dataDir = resolve(argOf('--data-dir') || process.env.WXBRIDGE_DATA || process.env.BRIDGE_DATA
|
|
62
|
+
|| explicitConfigDataDir() || SELF_DIR)
|
|
63
|
+
|
|
40
64
|
const text = (argOf('--text') || (args.includes('--stdin') ? await readStdin() : '') || positionalText()).trim()
|
|
65
|
+
if (args.includes('--print-dir')) {
|
|
66
|
+
console.log('[wxpush] dataDir=' + dataDir + (text ? '' : '(未给内容,仅打印目录)'))
|
|
67
|
+
process.exit(0)
|
|
68
|
+
}
|
|
41
69
|
if (!text) {
|
|
42
70
|
console.error('[wxpush] 没有内容:用法 node wxpush.mjs "要推送的话"(或 --text / --stdin)')
|
|
43
71
|
process.exit(2)
|
|
44
72
|
}
|
|
45
73
|
|
|
46
|
-
const dataDir = resolve(argOf('--data-dir') || process.env.WXBRIDGE_DATA || process.env.BRIDGE_DATA
|
|
47
|
-
|| join(process.env.DSH_HOME || join(homedir(), '.dsh'), 'wxbridge'))
|
|
48
74
|
const outbox = join(dataDir, 'outbox')
|
|
49
75
|
const entry = {
|
|
50
76
|
text: text.slice(0, 4000),
|