@mison/wecom-cleaner 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/LICENSE +21 -0
- package/README.md +323 -0
- package/docs/IMPLEMENTATION_PLAN.md +162 -0
- package/docs/releases/v1.0.0.md +32 -0
- package/native/README.md +9 -0
- package/native/bin/darwin-arm64/wecom-cleaner-core +0 -0
- package/native/bin/darwin-x64/wecom-cleaner-core +0 -0
- package/native/manifest.json +15 -0
- package/native/zig/build.sh +68 -0
- package/native/zig/src/main.zig +96 -0
- package/package.json +62 -0
- package/src/analysis.js +58 -0
- package/src/cleanup.js +217 -0
- package/src/cli.js +2619 -0
- package/src/config.js +270 -0
- package/src/constants.js +309 -0
- package/src/doctor.js +366 -0
- package/src/error-taxonomy.js +73 -0
- package/src/lock.js +102 -0
- package/src/native-bridge.js +403 -0
- package/src/recycle-maintenance.js +335 -0
- package/src/restore.js +533 -0
- package/src/scanner.js +1277 -0
- package/src/utils.js +365 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 mison
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
# wecom-cleaner
|
|
2
|
+
|
|
3
|
+
<p align="left">
|
|
4
|
+
<a href="https://www.npmjs.com/package/@mison/wecom-cleaner"><img alt="npm" src="https://img.shields.io/npm/v/%40mison%2Fwecom-cleaner?style=flat-square" /></a>
|
|
5
|
+
<a href="./LICENSE"><img alt="license" src="https://img.shields.io/badge/license-MIT-2ea043?style=flat-square" /></a>
|
|
6
|
+
<img alt="node" src="https://img.shields.io/badge/node-%3E%3D20-1f6feb?style=flat-square" />
|
|
7
|
+
<img alt="platform" src="https://img.shields.io/badge/platform-macOS-0ea5e9?style=flat-square" />
|
|
8
|
+
<img alt="engine" src="https://img.shields.io/badge/engine-Node%20%2B%20Zig-0891b2?style=flat-square" />
|
|
9
|
+
</p>
|
|
10
|
+
|
|
11
|
+
企业微信本地缓存清理工具(交互式 CLI/TUI)。
|
|
12
|
+
|
|
13
|
+
- 软件名:`wecom-cleaner`
|
|
14
|
+
- npm 包:`@mison/wecom-cleaner`
|
|
15
|
+
- 命令名:`wecom-cleaner`
|
|
16
|
+
- 仓库:<https://github.com/MisonL/wecom-cleaner>
|
|
17
|
+
|
|
18
|
+
> 定位:在“可回收、可恢复、可审计”前提下,清理企业微信本地缓存,避免误删业务资料。
|
|
19
|
+
|
|
20
|
+
## 目录
|
|
21
|
+
|
|
22
|
+
- [项目定位](#项目定位)
|
|
23
|
+
- [功能总览](#功能总览)
|
|
24
|
+
- [能力边界](#能力边界)
|
|
25
|
+
- [安装与运行](#安装与运行)
|
|
26
|
+
- [常用参数](#常用参数)
|
|
27
|
+
- [数据与审计文件](#数据与审计文件)
|
|
28
|
+
- [开发与质量门禁](#开发与质量门禁)
|
|
29
|
+
- [发布与打包](#发布与打包)
|
|
30
|
+
- [FAQ](#faq)
|
|
31
|
+
|
|
32
|
+
## 项目定位
|
|
33
|
+
|
|
34
|
+
`wecom-cleaner` 解决的是“本地缓存空间治理”问题,不改变服务端数据。
|
|
35
|
+
|
|
36
|
+
设计原则:
|
|
37
|
+
|
|
38
|
+
- 安全优先:默认以回收区搬移代替直接删除。
|
|
39
|
+
- 可恢复:所有可执行删除都记录索引并支持按批次恢复。
|
|
40
|
+
- 可审计:关键分支会写入状态码,便于追踪与复盘。
|
|
41
|
+
- 渐进增强:有 Zig 核心则加速,无则自动回退 Node。
|
|
42
|
+
|
|
43
|
+
## 功能总览
|
|
44
|
+
|
|
45
|
+
| 模块 | 是否可执行删除 | 说明 |
|
|
46
|
+
| ------------------ | -------------- | -------------------------------------------------- |
|
|
47
|
+
| 年月清理(默认) | 是 | 按账号 + 年月 + 类型筛选缓存,支持 dry-run。 |
|
|
48
|
+
| 会话分析 | 否 | 只读分析目录/体积分布,不做删除。 |
|
|
49
|
+
| 全量空间治理 | 是 | 分级治理高占用缓存目录(安全层/谨慎层/受保护层)。 |
|
|
50
|
+
| 回收区治理 | 是 | 按保留策略清理回收区历史批次,支持 dry-run。 |
|
|
51
|
+
| 恢复已删除批次 | 是 | 基于索引恢复,支持覆盖/重命名/跳过。 |
|
|
52
|
+
| 系统自检(doctor) | 否 | 检查目录权限、账号发现、核心可用性与回收区健康。 |
|
|
53
|
+
| 交互配置 | 否 | 配置根目录、主题、文件存储目录、外部自动探测等。 |
|
|
54
|
+
|
|
55
|
+
### 关键能力
|
|
56
|
+
|
|
57
|
+
1. 多账号支持
|
|
58
|
+
|
|
59
|
+
- 自动识别 `Profiles` 下账号目录。
|
|
60
|
+
- 账号以 `用户名 | 企业名 | 短ID` 显示,可多选。
|
|
61
|
+
- 支持账号别名,修正常见不可读字段。
|
|
62
|
+
|
|
63
|
+
2. 文件存储目录识别
|
|
64
|
+
|
|
65
|
+
- 支持默认路径、手动配置路径、自动探测路径。
|
|
66
|
+
- 自动探测采用结构匹配(如 `*/WXWork Files/Caches`),不依赖目录名。
|
|
67
|
+
- 自动探测结果默认不预选,需用户确认后纳入处理。
|
|
68
|
+
|
|
69
|
+
3. 删除与恢复链路
|
|
70
|
+
|
|
71
|
+
- 删除动作统一进入程序回收区,而不是直接 `rm`。
|
|
72
|
+
- 写入 `index.jsonl` 审计记录,恢复按批次回放。
|
|
73
|
+
- 恢复时做路径边界校验(含 `realpath` 防符号链接越界)。
|
|
74
|
+
- 恢复支持先 `dry-run` 预演,再选择是否执行真实恢复。
|
|
75
|
+
|
|
76
|
+
4. 回收区保留策略
|
|
77
|
+
|
|
78
|
+
- 支持“保留最近 N 批 + 保留近 N 天 + 容量阈值”联合治理。
|
|
79
|
+
- 超过阈值会给出空间提示,可一键进入回收区治理。
|
|
80
|
+
|
|
81
|
+
5. Zig 核心与自动修复
|
|
82
|
+
|
|
83
|
+
- 有可用 Zig 核心时自动启用加速。
|
|
84
|
+
- 不可用时自动回退 Node,功能不受影响。
|
|
85
|
+
- 可按 manifest 下载并校验 SHA256 后修复核心。
|
|
86
|
+
|
|
87
|
+
6. 可观测性与并发安全
|
|
88
|
+
|
|
89
|
+
- `doctor` 模式可输出人类可读报告,或通过 `--json` 输出结构化结果。
|
|
90
|
+
- `doctor` 模式为只读体检:不会自动创建状态目录/回收区,也不会触发 Zig 自动修复下载。
|
|
91
|
+
- 多实例并发默认加锁,检测到陈旧锁可交互清理或通过 `--force` 自动清理。
|
|
92
|
+
|
|
93
|
+
## 能力边界
|
|
94
|
+
|
|
95
|
+
企业微信会话数据库为私有/加密格式,当前无法稳定建立“会话名 -> 本地缓存目录”的强映射。
|
|
96
|
+
|
|
97
|
+
因此:
|
|
98
|
+
|
|
99
|
+
- 支持按“年月目录”执行清理。
|
|
100
|
+
- 支持按“会话维度”做只读分析。
|
|
101
|
+
- 不提供“按会话自动删除”。
|
|
102
|
+
|
|
103
|
+
## 安装与运行
|
|
104
|
+
|
|
105
|
+
### 方式一:直接运行
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
npx @mison/wecom-cleaner
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### 方式二:本地开发
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
npm install
|
|
115
|
+
npm run build:native
|
|
116
|
+
npm run dev
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### 全菜单 smoke 回归
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
npm run e2e:smoke
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
说明:
|
|
126
|
+
|
|
127
|
+
- 脚本会在 `/tmp/wecom-e2e-*` 构造隔离夹具,不触碰真实企业微信目录。
|
|
128
|
+
- 覆盖开始菜单与关键分支:年月清理、会话分析、全量治理、回收区治理、恢复、系统自检、设置。
|
|
129
|
+
- 可用 `npm run e2e:smoke -- --keep` 保留日志与测试目录。
|
|
130
|
+
|
|
131
|
+
## 常用参数
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
wecom-cleaner --root ~/Library/Containers/com.tencent.WeWorkMac/Data/Documents/Profiles
|
|
135
|
+
wecom-cleaner --state-root ~/.wecom-cleaner-state
|
|
136
|
+
wecom-cleaner --external-storage-root /Volumes/Data/MyWeComStorage
|
|
137
|
+
wecom-cleaner --external-storage-auto-detect false
|
|
138
|
+
wecom-cleaner --dry-run-default true
|
|
139
|
+
wecom-cleaner --mode cleanup_monthly
|
|
140
|
+
wecom-cleaner --mode space_governance
|
|
141
|
+
wecom-cleaner --mode recycle_maintain
|
|
142
|
+
wecom-cleaner --mode doctor
|
|
143
|
+
wecom-cleaner --theme auto
|
|
144
|
+
wecom-cleaner --json
|
|
145
|
+
wecom-cleaner --force
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### `--mode` 可选值
|
|
149
|
+
|
|
150
|
+
- `cleanup_monthly`
|
|
151
|
+
- `analysis_only`
|
|
152
|
+
- `space_governance`
|
|
153
|
+
- `recycle_maintain`
|
|
154
|
+
- `restore`
|
|
155
|
+
- `doctor`
|
|
156
|
+
- `settings`
|
|
157
|
+
|
|
158
|
+
### `--theme` 可选值
|
|
159
|
+
|
|
160
|
+
- `auto`:自动判断终端主题
|
|
161
|
+
- `light`:亮色
|
|
162
|
+
- `dark`:暗色
|
|
163
|
+
|
|
164
|
+
### 额外环境变量
|
|
165
|
+
|
|
166
|
+
- `WECOM_CLEANER_NATIVE_AUTO_REPAIR=true|false`:Zig 自动修复总开关(默认 `true`)
|
|
167
|
+
- `WECOM_CLEANER_NATIVE_BASE_URL=<url>`:核心下载基地址
|
|
168
|
+
- `WECOM_CLEANER_NATIVE_DOWNLOAD_TIMEOUT_MS=<ms>`:下载超时(默认 `15000`)
|
|
169
|
+
- `WECOM_CLEANER_NATIVE_PROBE_TIMEOUT_MS=<ms>`:核心探针超时(默认 `3000`,最小 `500`)
|
|
170
|
+
- `WECOM_CLEANER_EXTERNAL_AUTO_DETECT=true|false`:外部存储自动探测总开关
|
|
171
|
+
|
|
172
|
+
## 数据与审计文件
|
|
173
|
+
|
|
174
|
+
默认状态目录:`~/.wecom-cleaner-state`
|
|
175
|
+
|
|
176
|
+
- `config.json`:交互配置
|
|
177
|
+
- `account-aliases.json`:账号别名
|
|
178
|
+
- `index.jsonl`:删除/恢复流水审计
|
|
179
|
+
- `recycle-bin/`:回收区
|
|
180
|
+
- `.wecom-cleaner.lock`:运行锁文件(防并发误操作)
|
|
181
|
+
|
|
182
|
+
`index.jsonl` 常见字段:
|
|
183
|
+
|
|
184
|
+
- `scope`:`cleanup_monthly` 或 `space_governance`
|
|
185
|
+
- `tier`:`safe` / `caution` / `protected`
|
|
186
|
+
- `status`:`success`、`dry_run`、`skipped_*`、`failed`
|
|
187
|
+
- `error_type`:错误分类(如 `path_not_found`、`path_validation_failed`、`permission_denied`)
|
|
188
|
+
|
|
189
|
+
回收区治理审计(`action=recycle_maintain`)常见字段:
|
|
190
|
+
|
|
191
|
+
- `selected_by_age`:按年龄规则选中的批次数
|
|
192
|
+
- `selected_by_size`:按容量规则补选的批次数
|
|
193
|
+
- `remaining_bytes`:治理后回收区总占用
|
|
194
|
+
|
|
195
|
+
常见越界拦截原因(`skipped_invalid_path.invalid_reason`):
|
|
196
|
+
|
|
197
|
+
- `source_outside_profile_root`
|
|
198
|
+
- `source_outside_governance_root`
|
|
199
|
+
- `source_symlink_escape`
|
|
200
|
+
- `recycle_symlink_escape`
|
|
201
|
+
- `missing_allowed_root`
|
|
202
|
+
- `missing_recycle_root`
|
|
203
|
+
- `source_path_unresolvable`
|
|
204
|
+
- `recycle_path_unresolvable`
|
|
205
|
+
|
|
206
|
+
## 开发与质量门禁
|
|
207
|
+
|
|
208
|
+
```bash
|
|
209
|
+
# 语法检查
|
|
210
|
+
npm run check
|
|
211
|
+
|
|
212
|
+
# 单元测试
|
|
213
|
+
npm run test
|
|
214
|
+
|
|
215
|
+
# 覆盖率报告
|
|
216
|
+
npm run test:coverage
|
|
217
|
+
|
|
218
|
+
# 覆盖率门禁(lines/statements >= 75%,functions >= 80%,branches >= 60%)
|
|
219
|
+
npm run test:coverage:check
|
|
220
|
+
|
|
221
|
+
# 格式化与风格检查
|
|
222
|
+
npm run format
|
|
223
|
+
npm run format:check
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
发布前推荐全量门禁:
|
|
227
|
+
|
|
228
|
+
```bash
|
|
229
|
+
npm run check
|
|
230
|
+
npm run test:coverage:check
|
|
231
|
+
npm run format:check
|
|
232
|
+
npm run e2e:smoke -- --keep
|
|
233
|
+
npm run pack:tgz:dry-run
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
当前基线(`v1.0.0`):
|
|
237
|
+
|
|
238
|
+
- 单元测试:`47/47` 通过。
|
|
239
|
+
- 覆盖率:`statements 85.65%`,`branches 70.99%`,`functions 91.39%`,`lines 85.65%`。
|
|
240
|
+
- 全菜单 smoke:通过(含恢复冲突分支与 doctor JSON 分支)。
|
|
241
|
+
|
|
242
|
+
## 发布与打包
|
|
243
|
+
|
|
244
|
+
`prepack` 会自动执行:
|
|
245
|
+
|
|
246
|
+
- `npm run build:native:release`
|
|
247
|
+
- `npm run check`
|
|
248
|
+
|
|
249
|
+
默认构建两个 macOS 核心:
|
|
250
|
+
|
|
251
|
+
- `native/bin/darwin-x64/wecom-cleaner-core`
|
|
252
|
+
- `native/bin/darwin-arm64/wecom-cleaner-core`
|
|
253
|
+
|
|
254
|
+
本地交付包(无作用域前缀)建议:
|
|
255
|
+
|
|
256
|
+
```bash
|
|
257
|
+
npm run pack:tgz
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
输出示例:`wecom-cleaner-<version>.tgz`
|
|
261
|
+
|
|
262
|
+
### 正式发布(GitHub Release + npm)
|
|
263
|
+
|
|
264
|
+
```bash
|
|
265
|
+
# 1) 发布前检查
|
|
266
|
+
npm run check
|
|
267
|
+
npm run test:coverage:check
|
|
268
|
+
npm run format:check
|
|
269
|
+
npm run e2e:smoke
|
|
270
|
+
npm run pack:tgz
|
|
271
|
+
|
|
272
|
+
# 2) 推送主分支与标签
|
|
273
|
+
git push origin main
|
|
274
|
+
git tag v1.0.0
|
|
275
|
+
git push origin v1.0.0
|
|
276
|
+
|
|
277
|
+
# 3) 发布 GitHub Release(附 tgz 包)
|
|
278
|
+
gh release create v1.0.0 \
|
|
279
|
+
--title "v1.0.0" \
|
|
280
|
+
--notes-file docs/releases/v1.0.0.md \
|
|
281
|
+
wecom-cleaner-1.0.0.tgz
|
|
282
|
+
|
|
283
|
+
# 4) 发布 npm
|
|
284
|
+
npm publish --access public
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
建议发布前确认登录状态:
|
|
288
|
+
|
|
289
|
+
- `gh auth status`
|
|
290
|
+
- `npm whoami`
|
|
291
|
+
|
|
292
|
+
跨平台构建示例:
|
|
293
|
+
|
|
294
|
+
```bash
|
|
295
|
+
# 按当前机器平台
|
|
296
|
+
./native/zig/build.sh
|
|
297
|
+
|
|
298
|
+
# 发布前构建 macOS 双架构
|
|
299
|
+
npm run build:native:release
|
|
300
|
+
|
|
301
|
+
# 指定目标编译(示例)
|
|
302
|
+
TARGET_OS=darwin TARGET_ARCH=arm64 ./native/zig/build.sh
|
|
303
|
+
TARGET_OS=windows TARGET_ARCH=x64 ./native/zig/build.sh
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
## FAQ
|
|
307
|
+
|
|
308
|
+
### 1) “Zig加速:已就绪” 和 “已生效” 有什么区别?
|
|
309
|
+
|
|
310
|
+
- 已就绪:检测到 Zig 核心,但当前仅在菜单阶段,还没进入扫描。
|
|
311
|
+
- 已生效:已经进入扫描,且本次实际使用 Zig。
|
|
312
|
+
|
|
313
|
+
### 2) 为什么显示 “Node回退”?
|
|
314
|
+
|
|
315
|
+
检测到 Zig 核心,但本次运行探针失败或运行异常,已自动切回 Node,功能可继续使用。
|
|
316
|
+
|
|
317
|
+
### 3) 会不会误删企业文档?
|
|
318
|
+
|
|
319
|
+
默认策略不会把普通业务文档目录(例如 `WeDrive/<企业名>/...`)纳入治理规则;执行前还有分级提示、确认和回收区兜底。
|
|
320
|
+
|
|
321
|
+
---
|
|
322
|
+
|
|
323
|
+
如果你希望我提供“按你当前机器目录结构定制的一键安全清理方案”,可以直接给我一份 `--dry-run` 输出。
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
# wecom-cleaner 实施与现状说明
|
|
2
|
+
|
|
3
|
+
## 1. 产品定位
|
|
4
|
+
|
|
5
|
+
`wecom-cleaner` 是企业微信本地缓存治理工具,核心目标是“可安全回收空间、可审计、可恢复”。
|
|
6
|
+
|
|
7
|
+
- 软件名:`wecom-cleaner`
|
|
8
|
+
- npm 包名:`@mison/wecom-cleaner`
|
|
9
|
+
- 命令名:`wecom-cleaner`
|
|
10
|
+
|
|
11
|
+
## 2. 当前功能范围
|
|
12
|
+
|
|
13
|
+
1. 开始菜单
|
|
14
|
+
|
|
15
|
+
- 年月清理(默认,可执行删除)
|
|
16
|
+
- 会话分析(只读)
|
|
17
|
+
- 全量空间治理(分级治理)
|
|
18
|
+
- 回收区治理(保留策略)
|
|
19
|
+
- 恢复已删除批次
|
|
20
|
+
- 系统自检(doctor)
|
|
21
|
+
- 交互配置
|
|
22
|
+
|
|
23
|
+
2. 年月清理
|
|
24
|
+
|
|
25
|
+
- 多账号选择与别名管理。
|
|
26
|
+
- 按截止年月或手动勾选月份筛选。
|
|
27
|
+
- 按缓存类型筛选,`wwsecurity` 默认不勾选。
|
|
28
|
+
- 删除动作统一进入回收区,不直接 `rm`。
|
|
29
|
+
|
|
30
|
+
3. 会话分析(只读)
|
|
31
|
+
|
|
32
|
+
- 统计账号/类型/月份维度占用。
|
|
33
|
+
- 明确能力边界:不支持按“会话名”自动删除。
|
|
34
|
+
|
|
35
|
+
4. 全量空间治理
|
|
36
|
+
|
|
37
|
+
- 对 `Profiles` 外高占用目录进行分层治理(安全层/谨慎层/受保护层)。
|
|
38
|
+
- 谨慎层二次确认,受保护层仅分析不删除。
|
|
39
|
+
- 支持外部文件存储缓存目录(`WXWork Files/Caches`)纳入治理。
|
|
40
|
+
|
|
41
|
+
5. 恢复
|
|
42
|
+
|
|
43
|
+
- 支持按批次恢复。
|
|
44
|
+
- 冲突策略:覆盖 / 重命名 / 跳过。
|
|
45
|
+
- 支持先 dry-run 预演,再确认真实恢复。
|
|
46
|
+
- 恢复路径使用 `realpath` 做越界校验并写审计记录。
|
|
47
|
+
|
|
48
|
+
6. 回收区治理
|
|
49
|
+
|
|
50
|
+
- 支持“保留最近 N 批 + 保留近 N 天 + 容量阈值”联合治理。
|
|
51
|
+
- 支持 dry-run 预览与真实清理。
|
|
52
|
+
- 审计记录 `action=recycle_maintain`,包含按年龄/按容量选中的批次数。
|
|
53
|
+
|
|
54
|
+
7. 系统自检(doctor)
|
|
55
|
+
|
|
56
|
+
- 检查 Profile 根目录、状态目录、回收区与索引目录权限。
|
|
57
|
+
- 检查账号发现、文件存储目录识别结果。
|
|
58
|
+
- 检查 native manifest/随包核心/缓存核心探针状态。
|
|
59
|
+
- 检查回收区容量健康并输出建议。
|
|
60
|
+
|
|
61
|
+
## 3. 技术架构
|
|
62
|
+
|
|
63
|
+
1. CLI 主体
|
|
64
|
+
|
|
65
|
+
- `src/cli.js`:交互流程编排。
|
|
66
|
+
- `src/config.js`:CLI 参数与配置持久化。
|
|
67
|
+
|
|
68
|
+
2. 领域模块
|
|
69
|
+
|
|
70
|
+
- `src/scanner.js`:账号发现、目录扫描、体积计算。
|
|
71
|
+
- `src/cleanup.js`:删除(迁移到回收区)与索引记录。
|
|
72
|
+
- `src/restore.js`:批次恢复与冲突处理。
|
|
73
|
+
- `src/analysis.js`:只读分析输出。
|
|
74
|
+
- `src/recycle-maintenance.js`:回收区保留策略与治理执行。
|
|
75
|
+
- `src/doctor.js`:系统自检报告生成。
|
|
76
|
+
- `src/error-taxonomy.js`:错误分类与展示标签。
|
|
77
|
+
- `src/lock.js`:单实例运行锁(含陈旧锁处理)。
|
|
78
|
+
|
|
79
|
+
3. 引擎层
|
|
80
|
+
|
|
81
|
+
- `src/native-bridge.js`:Zig 核心探测、校验、自动修复下载、Node 回退。
|
|
82
|
+
- `native/manifest.json`:核心下载清单与 `SHA256`。
|
|
83
|
+
|
|
84
|
+
## 4. 安全与审计策略
|
|
85
|
+
|
|
86
|
+
1. 删除安全
|
|
87
|
+
|
|
88
|
+
- 所有删除先进入 `recycle-bin/`。
|
|
89
|
+
- 每条动作写入 `index.jsonl`。
|
|
90
|
+
|
|
91
|
+
2. 恢复安全
|
|
92
|
+
|
|
93
|
+
- 严格限制恢复源与目标必须位于允许根路径。
|
|
94
|
+
- 对软链接逃逸与路径不可解析场景做拒绝与审计。
|
|
95
|
+
- 恢复 dry-run 与真实恢复均写审计状态,便于先演练后执行。
|
|
96
|
+
|
|
97
|
+
3. 并发安全
|
|
98
|
+
|
|
99
|
+
- 非 doctor 模式默认启用运行锁,避免多实例并发操作同一状态目录。
|
|
100
|
+
- 支持识别陈旧锁并按 `--force` 自动清理重试。
|
|
101
|
+
|
|
102
|
+
3. Zig 自动修复安全
|
|
103
|
+
|
|
104
|
+
- 仅按清单下载固定目标。
|
|
105
|
+
- 下载后先做 `SHA256` 校验,再做 `--ping` 探针。
|
|
106
|
+
- 校验失败或探针失败会删除缓存并回退 Node。
|
|
107
|
+
|
|
108
|
+
## 5. 质量保障与门禁
|
|
109
|
+
|
|
110
|
+
1. 代码风格
|
|
111
|
+
|
|
112
|
+
- 统一使用 Prettier(仓库内置 `.prettierrc.json`)。
|
|
113
|
+
- 执行命令:`npm run format` / `npm run format:check`。
|
|
114
|
+
|
|
115
|
+
2. 单元测试
|
|
116
|
+
|
|
117
|
+
- 使用 Node 原生测试框架(`node:test`)。
|
|
118
|
+
- 覆盖核心模块:`config/utils/cleanup/restore/scanner/native-bridge/analysis`。
|
|
119
|
+
|
|
120
|
+
3. 覆盖率
|
|
121
|
+
|
|
122
|
+
- 使用 `c8` 输出覆盖率报告。
|
|
123
|
+
- 门禁阈值:`lines/statements >= 75%`,`functions >= 80%`,`branches >= 60%`。
|
|
124
|
+
- 命令:`npm run test:coverage` / `npm run test:coverage:check`。
|
|
125
|
+
- `v1.0.0` 基线:`statements 85.65%`,`branches 70.99%`,`functions 91.39%`,`lines 85.65%`。
|
|
126
|
+
|
|
127
|
+
4. 端到端回归
|
|
128
|
+
|
|
129
|
+
- 使用 `scripts/e2e-smoke.sh` 覆盖全部一级菜单与关键分支(含 doctor 与回收区治理)。
|
|
130
|
+
|
|
131
|
+
## 6. 推荐发布前检查
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
npm run check
|
|
135
|
+
npm run test:coverage:check
|
|
136
|
+
npm run format:check
|
|
137
|
+
npm run e2e:smoke -- --keep
|
|
138
|
+
npm run pack:tgz:dry-run
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## 7. 发布执行(首个正式版)
|
|
142
|
+
|
|
143
|
+
1. 版本与产物
|
|
144
|
+
|
|
145
|
+
- `package.json` / `package-lock.json`:`1.0.0`
|
|
146
|
+
- `native/manifest.json`:版本与 `baseUrl` 对齐 `v1.0.0`
|
|
147
|
+
- 默认打包双架构核心:`darwin-x64` + `darwin-arm64`
|
|
148
|
+
|
|
149
|
+
2. GitHub Release
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
git push origin main
|
|
153
|
+
git tag v1.0.0
|
|
154
|
+
git push origin v1.0.0
|
|
155
|
+
gh release create v1.0.0 --title "v1.0.0" --notes-file docs/releases/v1.0.0.md wecom-cleaner-1.0.0.tgz
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
3. npm 发布
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
npm publish --access public
|
|
162
|
+
```
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# wecom-cleaner v1.0.0
|
|
2
|
+
|
|
3
|
+
首个正式版本,聚焦“安全、可恢复、可审计”的企业微信本地缓存治理。
|
|
4
|
+
|
|
5
|
+
## 主要能力
|
|
6
|
+
|
|
7
|
+
- 年月清理(默认可执行删除,支持 dry-run)
|
|
8
|
+
- 会话分析(只读)
|
|
9
|
+
- 全量空间治理(分级策略)
|
|
10
|
+
- 回收区治理(保留策略 + dry-run)
|
|
11
|
+
- 批次恢复(覆盖/重命名/跳过)
|
|
12
|
+
- 系统自检 doctor(支持 `--json`)
|
|
13
|
+
|
|
14
|
+
## 本次重点改进
|
|
15
|
+
|
|
16
|
+
- 修复恢复 `dry-run` 分支潜在实删风险,预演不再改动源目录。
|
|
17
|
+
- 回收区治理增加批次路径边界校验,防止异常索引导致越界删除。
|
|
18
|
+
- doctor 改为只读体检:不创建目录、不触发自动修复下载。
|
|
19
|
+
- Zig 核心探针增加超时控制,避免异常阻塞。
|
|
20
|
+
- 外部存储根目录推断增强:`Documents/Profiles` 大小写不敏感。
|
|
21
|
+
- e2e smoke 清理逻辑加固,避免误删非安全路径。
|
|
22
|
+
|
|
23
|
+
## 质量与验证
|
|
24
|
+
|
|
25
|
+
- 单元测试:47/47 通过
|
|
26
|
+
- 覆盖率:statements 85.65%,branches 70.99%,functions 91.39%,lines 85.65%
|
|
27
|
+
- 全菜单 smoke:通过(含恢复冲突分支、doctor JSON 分支)
|
|
28
|
+
|
|
29
|
+
## 兼容性
|
|
30
|
+
|
|
31
|
+
- 当前正式支持:macOS(x64 / arm64)
|
|
32
|
+
- Windows 兼容在后续版本规划中
|
package/native/README.md
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Zig 核心说明
|
|
2
|
+
|
|
3
|
+
当前版本采用 `Node CLI + Zig 核心预留` 架构:
|
|
4
|
+
|
|
5
|
+
- 如果存在 `native/bin/<platform>-<arch>/wecom-cleaner-core`,CLI 会尝试加载 Zig 核心。
|
|
6
|
+
- 如果未检测到 Zig 二进制,会自动回退到 Node 引擎,不影响使用。
|
|
7
|
+
- 自动修复下载使用 `native/manifest.json` 固定版本清单,并执行 `SHA256` 强校验 + `--ping` 探针校验。
|
|
8
|
+
|
|
9
|
+
后续可将高并发目录扫描、体积计算、索引操作迁移到 Zig,以提升性能和可维护性。
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"baseUrl": "https://raw.githubusercontent.com/MisonL/wecom-cleaner/v1.0.0/native/bin",
|
|
5
|
+
"targets": {
|
|
6
|
+
"darwin-x64": {
|
|
7
|
+
"binaryName": "wecom-cleaner-core",
|
|
8
|
+
"sha256": "14cfa26895101e7b71824e6bb9282f08a38f9dad72d4df2934094eb2ceefbad0"
|
|
9
|
+
},
|
|
10
|
+
"darwin-arm64": {
|
|
11
|
+
"binaryName": "wecom-cleaner-core",
|
|
12
|
+
"sha256": "fc33ce3fb44309170da8c2867d11eae552e2e9d3c95b8f0e5a8e8392bb630744"
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
ROOT_DIR="$(cd "$(dirname "$0")/../.." && pwd)"
|
|
5
|
+
|
|
6
|
+
HOST_OS="$(uname -s | tr '[:upper:]' '[:lower:]')"
|
|
7
|
+
HOST_ARCH="$(uname -m)"
|
|
8
|
+
|
|
9
|
+
RAW_OS="${TARGET_OS:-$HOST_OS}"
|
|
10
|
+
RAW_ARCH="${TARGET_ARCH:-$HOST_ARCH}"
|
|
11
|
+
|
|
12
|
+
case "$RAW_OS" in
|
|
13
|
+
darwin|macos)
|
|
14
|
+
OS_TAG="darwin"
|
|
15
|
+
ZIG_OS="macos"
|
|
16
|
+
;;
|
|
17
|
+
linux)
|
|
18
|
+
OS_TAG="linux"
|
|
19
|
+
ZIG_OS="linux"
|
|
20
|
+
;;
|
|
21
|
+
windows|windows_nt|mingw*|msys*|cygwin*)
|
|
22
|
+
OS_TAG="windows"
|
|
23
|
+
ZIG_OS="windows"
|
|
24
|
+
;;
|
|
25
|
+
*)
|
|
26
|
+
echo "不支持的操作系统: $RAW_OS" >&2
|
|
27
|
+
exit 1
|
|
28
|
+
;;
|
|
29
|
+
esac
|
|
30
|
+
|
|
31
|
+
case "$RAW_ARCH" in
|
|
32
|
+
x86_64|amd64|x64)
|
|
33
|
+
ARCH_TAG="x64"
|
|
34
|
+
ZIG_ARCH="x86_64"
|
|
35
|
+
;;
|
|
36
|
+
arm64|aarch64)
|
|
37
|
+
ARCH_TAG="arm64"
|
|
38
|
+
ZIG_ARCH="aarch64"
|
|
39
|
+
;;
|
|
40
|
+
*)
|
|
41
|
+
echo "不支持的架构: $RAW_ARCH" >&2
|
|
42
|
+
exit 1
|
|
43
|
+
;;
|
|
44
|
+
esac
|
|
45
|
+
|
|
46
|
+
OUT_DIR="$ROOT_DIR/native/bin/${OS_TAG}-${ARCH_TAG}"
|
|
47
|
+
mkdir -p "$OUT_DIR"
|
|
48
|
+
|
|
49
|
+
BIN_NAME="wecom-cleaner-core"
|
|
50
|
+
if [[ "$OS_TAG" == "windows" ]]; then
|
|
51
|
+
BIN_NAME="${BIN_NAME}.exe"
|
|
52
|
+
fi
|
|
53
|
+
|
|
54
|
+
declare -a BUILD_CMD
|
|
55
|
+
BUILD_CMD=(
|
|
56
|
+
zig build-exe "$ROOT_DIR/native/zig/src/main.zig"
|
|
57
|
+
-O ReleaseFast
|
|
58
|
+
-fstrip
|
|
59
|
+
-femit-bin="$OUT_DIR/$BIN_NAME"
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
if [[ -n "${TARGET_OS:-}" || -n "${TARGET_ARCH:-}" ]]; then
|
|
63
|
+
BUILD_CMD+=(-target "${ZIG_ARCH}-${ZIG_OS}")
|
|
64
|
+
fi
|
|
65
|
+
|
|
66
|
+
"${BUILD_CMD[@]}"
|
|
67
|
+
|
|
68
|
+
echo "构建完成: $OUT_DIR/$BIN_NAME"
|