weflow-cli 1.6.1 → 1.6.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/CHANGELOG.md +18 -0
- package/README.md +1 -0
- package/bin/weflow-cli.ts +36 -9
- package/dist/bin/weflow-cli.js +38 -9
- package/dist/bin/weflow-cli.js.map +1 -1
- package/dist/src/core/ntCore.d.ts.map +1 -1
- package/dist/src/core/ntCore.js +4 -0
- package/dist/src/core/ntCore.js.map +1 -1
- package/dist/src/services/chatService.d.ts +7 -0
- package/dist/src/services/chatService.d.ts.map +1 -1
- package/dist/src/services/chatService.js +15 -5
- package/dist/src/services/chatService.js.map +1 -1
- package/dist/src/services/exportService.d.ts.map +1 -1
- package/dist/src/services/exportService.js +15 -3
- package/dist/src/services/exportService.js.map +1 -1
- package/dist/src/utils/pythonProcessEnv.d.ts.map +1 -1
- package/dist/src/utils/pythonProcessEnv.js +16 -1
- package/dist/src/utils/pythonProcessEnv.js.map +1 -1
- package/docs/HEALTH-CHECK.md +98 -0
- package/docs/RELEASING.md +177 -124
- package/package.json +1 -1
- package/scripts/biz_daily.py +3 -1
- package/scripts/export_chat_html.py +9 -0
- package/scripts/health_check.py +336 -0
- package/scripts/nt_decrypt.py +1352 -1216
- package/scripts/watch_issues.py +212 -0
- package/scripts/watch_mail.py +131 -0
- package/src/core/ntCore.ts +4 -0
- package/src/services/chatService.ts +14 -5
- package/src/services/exportService.ts +15 -3
- package/src/utils/pythonProcessEnv.ts +18 -2
package/docs/RELEASING.md
CHANGED
|
@@ -1,124 +1,177 @@
|
|
|
1
|
-
# 发布清单
|
|
2
|
-
|
|
3
|
-
npm 包与 GitHub 分开发布,中间隔多久都不奇怪——`1.5.0` 与主线之间曾拉开 128 个提交、
|
|
4
|
-
两个多月,直接导致用户照着 README 敲 `init --path` 却报 `unknown option`。
|
|
5
|
-
|
|
6
|
-
按下面顺序走,每一步都有对应的**失败长什么样**。
|
|
7
|
-
|
|
8
|
-
## 1. 定版本号
|
|
9
|
-
|
|
10
|
-
按语义化版本,不是按「改了多少行」:
|
|
11
|
-
|
|
12
|
-
| 改动性质 | 升哪一位 | 例 |
|
|
13
|
-
| --- | --- | --- |
|
|
14
|
-
| 新功能、新命令、新参数 | **minor** | 1.5.0 → 1.6.0 |
|
|
15
|
-
| 只修 bug、只改文档 | patch | 1.6.0 → 1.6.1 |
|
|
16
|
-
| 破坏兼容 | major | 1.6.0 → 2.0.0 |
|
|
17
|
-
|
|
18
|
-
已备好但**从未发布**的版本号可以并进下一个:`1.5.1` 准备过却没发,
|
|
19
|
-
它的修复就直接并进了 `1.6.0`。
|
|
20
|
-
|
|
21
|
-
## 2. 整理 CHANGELOG
|
|
22
|
-
|
|
23
|
-
- 把 `## Unreleased` 改名为 `## <新版本号>`
|
|
24
|
-
- 若上一版已写好但没发布,把它的条目并入,删掉那个空段
|
|
25
|
-
- 通用说明(如「npm 与 GitHub 分开发布」)移到文件顶部,别留在版本段里
|
|
26
|
-
|
|
27
|
-
## 3. 构建与测试
|
|
28
|
-
|
|
29
|
-
```powershell
|
|
30
|
-
npm run build
|
|
31
|
-
npm test
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
## 4. 打包检查(**不能跳过**)
|
|
35
|
-
|
|
36
|
-
```powershell
|
|
37
|
-
npm pack --dry-run
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
本地常有 `output/`(几 GB 产出)、`models/`(几 GB 模型)、`_env.json`(含密钥)
|
|
41
|
-
这类东西。`package.json` 的 `files` 是白名单,理论上挡住——但**白名单也可能写漏**,
|
|
42
|
-
所以逐项确认:
|
|
43
|
-
|
|
44
|
-
```powershell
|
|
45
|
-
npm pack --dry-run 2>&1 | grep -E "npm notice [0-9]" > /tmp/list.txt
|
|
46
|
-
grep -E "^output/|^models/|node_modules|\.env|\.db$|\.dat$|secret|credential" /tmp/list.txt
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
**这条命令必须没有输出。** 有输出就停下来查。
|
|
50
|
-
|
|
51
|
-
同时确认新增文件确实**在**包里(白名单是按目录配的,容易漏):
|
|
52
|
-
|
|
53
|
-
```powershell
|
|
54
|
-
grep -E "新文件名" /tmp/list.txt
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
## 5. 发布
|
|
58
|
-
|
|
59
|
-
需要 npm 凭据。`ribiaosu` 账号开了 2FA,所以两条路:
|
|
60
|
-
|
|
61
|
-
**凭据(推荐,一次配置长期可用)** — 用**带 `Bypass 2FA` 的 Granular Access Token**,
|
|
62
|
-
在 https://www.npmjs.com/settings/ribiaosu/tokens 生成时**必须勾选那个框**。
|
|
63
|
-
漏勾的 token 会在发布时报 `403 ... bypass 2fa enabled is required`。
|
|
64
|
-
|
|
65
|
-
| 现象 | 原因 |
|
|
66
|
-
| --- | --- |
|
|
67
|
-
| `403 ... two-factor authentication ... required` | token 没勾 Bypass 2FA,或没用 OTP |
|
|
68
|
-
| `ENEEAUTH` | 没登录 / 没配 token |
|
|
69
|
-
|
|
70
|
-
**验证 token 是否可用**(`bypass_2fa` 必须是 `true`):
|
|
71
|
-
|
|
72
|
-
```powershell
|
|
73
|
-
curl -s -H "Authorization: Bearer <token>" https://registry.npmjs.org/-/npm/v1/tokens
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
**一次性验证码**:
|
|
77
|
-
|
|
78
|
-
```powershell
|
|
79
|
-
npm publish --otp=<6位码>
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
## 6. 触发国内镜像同步(**新加的必要步骤**)
|
|
83
|
-
|
|
84
|
-
国内用户大多用 `registry.npmmirror.com`(淘宝源),它对新版本有同步延迟。
|
|
85
|
-
不同步的话,发布后几个小时内会有人来提「版本不存在」的 issue——
|
|
86
|
-
`weflow-cli@1.6.0` 就这样被报过一次(Issue #8)。
|
|
87
|
-
|
|
88
|
-
```powershell
|
|
89
|
-
curl -X PUT https://registry.npmmirror.com/-/package/weflow-cli/syncs
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
返回 `{"ok":true,...,"state":"waiting"}` 即已受理。**约 5 分钟后**生效。
|
|
93
|
-
|
|
94
|
-
## 7. 验证两个源都是新版本
|
|
95
|
-
|
|
96
|
-
```powershell
|
|
97
|
-
npm view weflow-cli version --registry=https://registry.npmjs.org
|
|
98
|
-
npm view weflow-cli version --registry=https://registry.npmmirror.com
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
两个都要是新版本号才对外宣告。官方源发布后自身也有几分钟 CDN 传播延迟——
|
|
102
|
-
期间 `npm view` 可能显示旧版本、tarball 可能 404,**这是在传播,不是失败**。
|
|
103
|
-
用这个判断是否真的发出去了:
|
|
104
|
-
|
|
105
|
-
```powershell
|
|
106
|
-
npm publish # 再发一次
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
报 `409 Conflict - Cannot publish over previously staged version` → **已经发布成功**。
|
|
110
|
-
|
|
111
|
-
## 8. 兜底:告诉用户怎么绕开镜像
|
|
112
|
-
|
|
113
|
-
```powershell
|
|
114
|
-
npm config get registry # 看用的哪个源
|
|
115
|
-
npm view weflow-cli version --registry=https://registry.npmjs.org # 用官方源查
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
两个源结果不一致 → 是镜像同步问题,不是包的问题:
|
|
119
|
-
`npm install -g weflow-cli@<版本> --registry=https://registry.npmjs.org` 立刻可用。
|
|
120
|
-
|
|
121
|
-
## 发布后
|
|
122
|
-
|
|
123
|
-
- 回到相关 issue 回复「已发布 + 升级方式」
|
|
124
|
-
- GitHub Release 与本清单解耦:源码、编译包、npm 三者版本差异要对用户可见
|
|
1
|
+
# 发布清单
|
|
2
|
+
|
|
3
|
+
npm 包与 GitHub 分开发布,中间隔多久都不奇怪——`1.5.0` 与主线之间曾拉开 128 个提交、
|
|
4
|
+
两个多月,直接导致用户照着 README 敲 `init --path` 却报 `unknown option`。
|
|
5
|
+
|
|
6
|
+
按下面顺序走,每一步都有对应的**失败长什么样**。
|
|
7
|
+
|
|
8
|
+
## 1. 定版本号
|
|
9
|
+
|
|
10
|
+
按语义化版本,不是按「改了多少行」:
|
|
11
|
+
|
|
12
|
+
| 改动性质 | 升哪一位 | 例 |
|
|
13
|
+
| --- | --- | --- |
|
|
14
|
+
| 新功能、新命令、新参数 | **minor** | 1.5.0 → 1.6.0 |
|
|
15
|
+
| 只修 bug、只改文档 | patch | 1.6.0 → 1.6.1 |
|
|
16
|
+
| 破坏兼容 | major | 1.6.0 → 2.0.0 |
|
|
17
|
+
|
|
18
|
+
已备好但**从未发布**的版本号可以并进下一个:`1.5.1` 准备过却没发,
|
|
19
|
+
它的修复就直接并进了 `1.6.0`。
|
|
20
|
+
|
|
21
|
+
## 2. 整理 CHANGELOG
|
|
22
|
+
|
|
23
|
+
- 把 `## Unreleased` 改名为 `## <新版本号>`
|
|
24
|
+
- 若上一版已写好但没发布,把它的条目并入,删掉那个空段
|
|
25
|
+
- 通用说明(如「npm 与 GitHub 分开发布」)移到文件顶部,别留在版本段里
|
|
26
|
+
|
|
27
|
+
## 3. 构建与测试
|
|
28
|
+
|
|
29
|
+
```powershell
|
|
30
|
+
npm run build
|
|
31
|
+
npm test
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## 4. 打包检查(**不能跳过**)
|
|
35
|
+
|
|
36
|
+
```powershell
|
|
37
|
+
npm pack --dry-run
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
本地常有 `output/`(几 GB 产出)、`models/`(几 GB 模型)、`_env.json`(含密钥)
|
|
41
|
+
这类东西。`package.json` 的 `files` 是白名单,理论上挡住——但**白名单也可能写漏**,
|
|
42
|
+
所以逐项确认:
|
|
43
|
+
|
|
44
|
+
```powershell
|
|
45
|
+
npm pack --dry-run 2>&1 | grep -E "npm notice [0-9]" > /tmp/list.txt
|
|
46
|
+
grep -E "^output/|^models/|node_modules|\.env|\.db$|\.dat$|secret|credential" /tmp/list.txt
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**这条命令必须没有输出。** 有输出就停下来查。
|
|
50
|
+
|
|
51
|
+
同时确认新增文件确实**在**包里(白名单是按目录配的,容易漏):
|
|
52
|
+
|
|
53
|
+
```powershell
|
|
54
|
+
grep -E "新文件名" /tmp/list.txt
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## 5. 发布
|
|
58
|
+
|
|
59
|
+
需要 npm 凭据。`ribiaosu` 账号开了 2FA,所以两条路:
|
|
60
|
+
|
|
61
|
+
**凭据(推荐,一次配置长期可用)** — 用**带 `Bypass 2FA` 的 Granular Access Token**,
|
|
62
|
+
在 https://www.npmjs.com/settings/ribiaosu/tokens 生成时**必须勾选那个框**。
|
|
63
|
+
漏勾的 token 会在发布时报 `403 ... bypass 2fa enabled is required`。
|
|
64
|
+
|
|
65
|
+
| 现象 | 原因 |
|
|
66
|
+
| --- | --- |
|
|
67
|
+
| `403 ... two-factor authentication ... required` | token 没勾 Bypass 2FA,或没用 OTP |
|
|
68
|
+
| `ENEEAUTH` | 没登录 / 没配 token |
|
|
69
|
+
|
|
70
|
+
**验证 token 是否可用**(`bypass_2fa` 必须是 `true`):
|
|
71
|
+
|
|
72
|
+
```powershell
|
|
73
|
+
curl -s -H "Authorization: Bearer <token>" https://registry.npmjs.org/-/npm/v1/tokens
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
**一次性验证码**:
|
|
77
|
+
|
|
78
|
+
```powershell
|
|
79
|
+
npm publish --otp=<6位码>
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## 6. 触发国内镜像同步(**新加的必要步骤**)
|
|
83
|
+
|
|
84
|
+
国内用户大多用 `registry.npmmirror.com`(淘宝源),它对新版本有同步延迟。
|
|
85
|
+
不同步的话,发布后几个小时内会有人来提「版本不存在」的 issue——
|
|
86
|
+
`weflow-cli@1.6.0` 就这样被报过一次(Issue #8)。
|
|
87
|
+
|
|
88
|
+
```powershell
|
|
89
|
+
curl -X PUT https://registry.npmmirror.com/-/package/weflow-cli/syncs
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
返回 `{"ok":true,...,"state":"waiting"}` 即已受理。**约 5 分钟后**生效。
|
|
93
|
+
|
|
94
|
+
## 7. 验证两个源都是新版本
|
|
95
|
+
|
|
96
|
+
```powershell
|
|
97
|
+
npm view weflow-cli version --registry=https://registry.npmjs.org
|
|
98
|
+
npm view weflow-cli version --registry=https://registry.npmmirror.com
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
两个都要是新版本号才对外宣告。官方源发布后自身也有几分钟 CDN 传播延迟——
|
|
102
|
+
期间 `npm view` 可能显示旧版本、tarball 可能 404,**这是在传播,不是失败**。
|
|
103
|
+
用这个判断是否真的发出去了:
|
|
104
|
+
|
|
105
|
+
```powershell
|
|
106
|
+
npm publish # 再发一次
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
报 `409 Conflict - Cannot publish over previously staged version` → **已经发布成功**。
|
|
110
|
+
|
|
111
|
+
## 8. 兜底:告诉用户怎么绕开镜像
|
|
112
|
+
|
|
113
|
+
```powershell
|
|
114
|
+
npm config get registry # 看用的哪个源
|
|
115
|
+
npm view weflow-cli version --registry=https://registry.npmjs.org # 用官方源查
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
两个源结果不一致 → 是镜像同步问题,不是包的问题:
|
|
119
|
+
`npm install -g weflow-cli@<版本> --registry=https://registry.npmjs.org` 立刻可用。
|
|
120
|
+
|
|
121
|
+
## 发布后
|
|
122
|
+
|
|
123
|
+
- 回到相关 issue 回复「已发布 + 升级方式」
|
|
124
|
+
- GitHub Release 与本清单解耦:源码、编译包、npm 三者版本差异要对用户可见
|
|
125
|
+
|
|
126
|
+
### 回复用户的规矩
|
|
127
|
+
|
|
128
|
+
报障的人多半不是开发者,也不看长文。**回复写给用户,不是写给同事:**
|
|
129
|
+
|
|
130
|
+
- **先给出结论和做法**(已修复 / 升级到 x.y.z),技术细节不要写进回复
|
|
131
|
+
- **三五句话说完**。根因分析、代码片段、执行顺序论证属于 commit message 和
|
|
132
|
+
本文档,不属于 issue 回复
|
|
133
|
+
- 升级类回复直接给命令,别让人自己找
|
|
134
|
+
- **发出前先给维护者过目**,确认后再发
|
|
135
|
+
|
|
136
|
+
反面例子:一条回复里贴了 Python 代码片段和逐步的执行顺序分析,内容全对,
|
|
137
|
+
但给用户的感受是「看不懂、太长」。
|
|
138
|
+
|
|
139
|
+
### 新动态邮件提醒
|
|
140
|
+
|
|
141
|
+
`scripts/watch_issues.py` 轮询本仓库的 issue 与回复,有非维护者发言时发邮件。
|
|
142
|
+
由 Windows 计划任务 `WeFlow Issue Watch` 每 30 分钟调用一次,不依赖任何编辑器
|
|
143
|
+
或 Claude 会话处于打开状态。
|
|
144
|
+
|
|
145
|
+
邮件凭据放在仓库外,不进版本库:
|
|
146
|
+
|
|
147
|
+
```json
|
|
148
|
+
// ~/.weflow-issue-watch.json (QQ 邮箱需用「授权码」,不是登录密码)
|
|
149
|
+
{
|
|
150
|
+
"smtp_user": "1473517806@qq.com",
|
|
151
|
+
"smtp_auth": "<授权码>",
|
|
152
|
+
"mail_to": "1473517806@qq.com",
|
|
153
|
+
"repo": "zhuobichen/weflow-cli"
|
|
154
|
+
}
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
- 首次运行只记录基线、不发信,避免把历史 issue 一次性全发出去
|
|
158
|
+
- 发送失败不推进记录,下次自动重试
|
|
159
|
+
- 手动跑一次:`py scripts/watch_issues.py`
|
|
160
|
+
- 查看/改频率:`Get-ScheduledTask -TaskName 'WeFlow Issue Watch'`
|
|
161
|
+
|
|
162
|
+
### 发布后自检
|
|
163
|
+
|
|
164
|
+
```powershell
|
|
165
|
+
npm view weflow-cli version --registry=https://registry.npmjs.org
|
|
166
|
+
npm view weflow-cli version --registry=https://registry.npmmirror.com
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
两个源都是新版本,再对外说「已发布」。
|
|
170
|
+
|
|
171
|
+
然后跑一遍体检,确认这次改动没有把读取路径或某个导出格式弄坏:
|
|
172
|
+
|
|
173
|
+
```powershell
|
|
174
|
+
py scripts/health_check.py
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
退出码 `0` 才算干净。检查项与各自的由来见 [HEALTH-CHECK.md](HEALTH-CHECK.md)。
|
package/package.json
CHANGED
package/scripts/biz_daily.py
CHANGED
|
@@ -194,9 +194,11 @@ def get_db_keys(config):
|
|
|
194
194
|
bytes.fromhex(biz_salt), 256000, dklen=32
|
|
195
195
|
).hex()
|
|
196
196
|
if not biz_key:
|
|
197
|
+
# 只指向 passphrase 一条路: 早先还建议 `config set bizKey`, 但该键不在
|
|
198
|
+
# CLI 的可写白名单里, 照做必然报 INVALID_CONFIG_KEY。
|
|
197
199
|
raise SystemExit(
|
|
198
200
|
'缺少公众号数据库密钥: 请运行 weflow-cli fav set-key --passphrase <64位hex> '
|
|
199
|
-
'配置全库 passphrase (自动派生各库密钥)
|
|
201
|
+
'配置全库 passphrase (自动派生各库密钥)'
|
|
200
202
|
)
|
|
201
203
|
|
|
202
204
|
return {
|
|
@@ -2121,6 +2121,8 @@ def main():
|
|
|
2121
2121
|
parser.add_argument('--per-page', type=int, default=0,
|
|
2122
2122
|
help='Messages per file; overrides --parts. Keeps a long history snappy to open')
|
|
2123
2123
|
parser.add_argument('--date', default=os.environ.get('WEFLOW_EXPORT_DATE', ''), help='Only export messages from local date YYYY-MM-DD')
|
|
2124
|
+
parser.add_argument('--limit', type=int, default=int(os.environ.get('WEFLOW_EXPORT_LIMIT') or 0),
|
|
2125
|
+
help='Only export the most recent N messages (0 = all)')
|
|
2124
2126
|
parser.add_argument('--emoticon-seed', default=os.environ.get('WEFLOW_EMOTICON_SEED', ''),
|
|
2125
2127
|
help='Account seed; decrypts custom stickers from the local cache')
|
|
2126
2128
|
parser.add_argument('--passphrase', default=os.environ.get('WEFLOW_NT_PASSPHRASE', ''), help='Shared NT passphrase for deriving shard keys')
|
|
@@ -2220,6 +2222,13 @@ def main():
|
|
|
2220
2222
|
_phase("before fetch")
|
|
2221
2223
|
messages = fetch_messages_from_shards(args.db, args.key, args.salt, args.talker, args.date, args.passphrase)
|
|
2222
2224
|
|
|
2225
|
+
# `--limit` means the most recent N, the same as `messages` and
|
|
2226
|
+
# `export json`. Sliced here, before the media and sender maps are built,
|
|
2227
|
+
# so neither does work for messages that are about to be dropped.
|
|
2228
|
+
if args.limit and args.limit > 0 and len(messages) > args.limit:
|
|
2229
|
+
print(f"Limiting to the most recent {args.limit} of {len(messages)} messages")
|
|
2230
|
+
messages = messages[-args.limit:]
|
|
2231
|
+
|
|
2223
2232
|
if not messages:
|
|
2224
2233
|
if args.date:
|
|
2225
2234
|
file_prefix = sanitize_filename(args.name or args.talker)
|