@mison/wecom-cleaner 1.2.0 → 1.3.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.
@@ -0,0 +1,141 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ usage() {
5
+ cat <<'EOF'
6
+ 用法:
7
+ check_update_report.sh [--channel stable|pre] [--root <path>] [--state-root <path>]
8
+
9
+ 说明:
10
+ - 执行“检查更新(只读)”,不做任何安装动作。
11
+ - 输出用户可读任务卡片。
12
+ EOF
13
+ }
14
+
15
+ if ! command -v jq >/dev/null 2>&1; then
16
+ echo "错误:缺少 jq,请先安装(brew install jq)。" >&2
17
+ exit 2
18
+ fi
19
+
20
+ if ! command -v wecom-cleaner >/dev/null 2>&1; then
21
+ echo "错误:未找到 wecom-cleaner 命令,请先安装 @mison/wecom-cleaner。" >&2
22
+ exit 2
23
+ fi
24
+
25
+ CHANNEL="stable"
26
+ ROOT=""
27
+ STATE_ROOT=""
28
+
29
+ while [[ $# -gt 0 ]]; do
30
+ case "$1" in
31
+ --channel | --upgrade-channel)
32
+ CHANNEL="${2:-stable}"
33
+ shift 2
34
+ ;;
35
+ --root)
36
+ ROOT="${2:-}"
37
+ shift 2
38
+ ;;
39
+ --state-root)
40
+ STATE_ROOT="${2:-}"
41
+ shift 2
42
+ ;;
43
+ -h | --help)
44
+ usage
45
+ exit 0
46
+ ;;
47
+ *)
48
+ echo "错误:未知参数 $1" >&2
49
+ usage
50
+ exit 2
51
+ ;;
52
+ esac
53
+ done
54
+
55
+ case "$CHANNEL" in
56
+ stable | pre) ;;
57
+ *)
58
+ echo "错误:--channel 只能是 stable 或 pre" >&2
59
+ exit 2
60
+ ;;
61
+ esac
62
+
63
+ REPORT_JSON="$(mktemp -t wecom-check-update.XXXX.json)"
64
+ REPORT_ERR="$(mktemp -t wecom-check-update.XXXX.err)"
65
+ trap 'rm -f "$REPORT_JSON" "$REPORT_ERR"' EXIT
66
+
67
+ cmd=(--check-update --output json --upgrade-channel "$CHANNEL")
68
+ if [[ -n "$ROOT" ]]; then
69
+ cmd+=(--root "$ROOT")
70
+ fi
71
+ if [[ -n "$STATE_ROOT" ]]; then
72
+ cmd+=(--state-root "$STATE_ROOT")
73
+ fi
74
+
75
+ if ! wecom-cleaner "${cmd[@]}" >"$REPORT_JSON" 2>"$REPORT_ERR"; then
76
+ err_head="$(head -n 3 "$REPORT_ERR" 2>/dev/null || true)"
77
+ echo "执行失败:${err_head:-未知错误}" >&2
78
+ exit 1
79
+ fi
80
+
81
+ checked="$(jq -r '.summary.checked // false' "$REPORT_JSON")"
82
+ has_update="$(jq -r '.summary.hasUpdate // false' "$REPORT_JSON")"
83
+ current_version="$(jq -r '.summary.currentVersion // "-"' "$REPORT_JSON")"
84
+ latest_version="$(jq -r '.summary.latestVersion // "-"' "$REPORT_JSON")"
85
+ source_used="$(jq -r '.summary.source // "none"' "$REPORT_JSON")"
86
+ channel_used="$(jq -r '.summary.channel // "stable"' "$REPORT_JSON")"
87
+ skipped_by_user="$(jq -r '.summary.skippedByUser // false' "$REPORT_JSON")"
88
+ duration_ms="$(jq -r '.meta.durationMs // 0' "$REPORT_JSON")"
89
+ warnings_count="$(jq -r '(.warnings // []) | length' "$REPORT_JSON")"
90
+ errors_count="$(jq -r '(.errors // []) | length' "$REPORT_JSON")"
91
+
92
+ source_label="$source_used"
93
+ case "$source_used" in
94
+ npm) source_label="npmjs" ;;
95
+ github) source_label="GitHub Release" ;;
96
+ none) source_label="不可用" ;;
97
+ esac
98
+
99
+ channel_label="稳定版"
100
+ if [[ "$channel_used" == "pre" ]]; then
101
+ channel_label="预发布"
102
+ fi
103
+
104
+ if [[ "$checked" != "true" ]]; then
105
+ conclusion="检查失败,请稍后重试。"
106
+ elif [[ "$has_update" == "true" ]]; then
107
+ if [[ "$skipped_by_user" == "true" ]]; then
108
+ conclusion="检测到新版本,但该版本已被设置为跳过提醒。"
109
+ else
110
+ conclusion="检测到新版本,可按你确认后升级。"
111
+ fi
112
+ else
113
+ conclusion="当前已是最新版本。"
114
+ fi
115
+
116
+ printf '\n=== 更新检查结果(给用户)===\n'
117
+ printf -- '- 执行结论:%s\n' "$conclusion"
118
+ printf -- '- 本次只做版本检查,不会改动你的数据或本机安装。\n'
119
+
120
+ printf '\n版本信息\n'
121
+ printf -- '- 当前版本:%s\n' "$current_version"
122
+ printf -- '- 最新版本:%s\n' "$latest_version"
123
+ printf -- '- 检查通道:%s\n' "$channel_label"
124
+ printf -- '- 信息来源:%s(先 npm,失败再回退 GitHub)\n' "$source_label"
125
+ printf -- '- 用户跳过提醒:%s\n' "$( [[ "$skipped_by_user" == "true" ]] && printf '是' || printf '否' )"
126
+
127
+ if [[ "$has_update" == "true" && "$skipped_by_user" != "true" ]]; then
128
+ printf '\n建议下一步(需你确认后执行)\n'
129
+ printf -- '- 默认升级方式(npm):wecom-cleaner --upgrade npm --upgrade-version %s --upgrade-yes\n' "$latest_version"
130
+ printf -- '- 备选方式(GitHub 脚本):wecom-cleaner --upgrade github-script --upgrade-version %s --upgrade-yes\n' "$latest_version"
131
+ fi
132
+
133
+ printf '\n运行状态\n'
134
+ printf -- '- 耗时:%s ms\n' "$duration_ms"
135
+ printf -- '- 告警:%s\n' "$warnings_count"
136
+ printf -- '- 错误:%s\n' "$errors_count"
137
+
138
+ printf '\n指标释义\n'
139
+ printf -- '- 当前版本:你本机 wecom-cleaner 版本。\n'
140
+ printf -- '- 最新版本:按所选通道可获取的最新可用版本。\n'
141
+ printf -- '- 用户跳过提醒:表示该版本是否被标记为“暂不提醒”。\n'
@@ -190,7 +190,7 @@ run_cmd_to_file() {
190
190
  if ! wecom-cleaner "${cmd_parts[@]}" >"$output_file" 2>"$err_file"; then
191
191
  local err_head
192
192
  err_head="$(head -n 3 "$err_file" 2>/dev/null || true)"
193
- echo "执行失败(dry-run=$dry_run):${err_head:-未知错误}" >&2
193
+ echo "执行失败(dry-run=${dry_run}):${err_head:-未知错误}" >&2
194
194
  return 1
195
195
  fi
196
196
  }
@@ -275,6 +275,7 @@ if [[ -z "$selected_categories_human" ]]; then
275
275
  fi
276
276
 
277
277
  printf '\n=== 清理结果(给用户)===\n'
278
+ printf -- '- 执行结论:%s(%s)\n' "$conclusion" "$reason"
278
279
  if [[ "$executed" == "true" ]]; then
279
280
  printf -- '- 已完成:已清理 %s 项聊天缓存,释放 %s。\n' "$execute_success" "$(human_bytes "$execute_reclaimed")"
280
281
  elif [[ "$preview_matched" -eq 0 ]]; then
@@ -287,6 +288,7 @@ printf -- '- 你的目标:清理 %s 及之前的企业微信聊天缓存。\n'
287
288
  printf '\n你关心的范围\n'
288
289
  printf -- '- 账号:%s(识别到 %s 个账号)\n' "$account_scope_label" "$scope_accounts"
289
290
  printf -- '- 数据类型:%s\n' "$selected_categories_human"
291
+ printf -- '- 筛选月份桶:%s,筛选类别数:%s\n' "$scope_months" "$scope_categories"
290
292
  if [[ -n "$matched_month_start" && -n "$matched_month_end" ]]; then
291
293
  printf -- '- 实际命中月份:%s ~ %s\n' "$matched_month_start" "$matched_month_end"
292
294
  else
@@ -300,6 +302,7 @@ printf -- '- 命中字节:%s(命中目录当前大小)\n' "$(human_bytes "
300
302
  printf -- '- 预计释放:%s(预演估算)\n' "$(human_bytes "$preview_reclaimed")"
301
303
  if [[ "$executed" == "true" ]]; then
302
304
  printf -- '- 实际释放:%s(真实执行结果)\n' "$(human_bytes "$execute_reclaimed")"
305
+ printf -- '- 执行明细:成功 %s / 跳过 %s / 失败 %s\n' "$execute_success" "$execute_skipped" "$execute_failed"
303
306
  printf -- '- 清理批次:%s(可用于恢复)\n' "$execute_batch"
304
307
  printf -- '- 复核结果:剩余可清理 %s 项\n' "$verify_matched"
305
308
  else
@@ -431,6 +434,13 @@ if [[ "$executed" == "true" ]]; then
431
434
  fi
432
435
  fi
433
436
 
437
+ printf '\n运行状态\n'
438
+ printf -- '- 扫描引擎:%s\n' "$engine"
439
+ printf -- '- 总耗时:%s ms\n' "$duration_total"
440
+ printf -- '- 告警:%s\n' "$warnings_total"
441
+ printf -- '- 错误:%s\n' "$errors_total"
442
+ printf -- '- 预演失败项:%s\n' "$preview_failed"
443
+
434
444
  if [[ "$warnings_total" -gt 0 || "$errors_total" -gt 0 ]]; then
435
445
  printf '\n异常与提示\n'
436
446
  printf -- '- 告警:%s\n' "$warnings_total"
@@ -143,7 +143,7 @@ run_cmd_to_file() {
143
143
  fi
144
144
  if ! wecom-cleaner "${cmd_parts[@]}" >"$output_file" 2>"$err_file"; then
145
145
  err_head="$(head -n 3 "$err_file" 2>/dev/null || true)"
146
- echo "执行失败(dry-run=$dry_run):${err_head:-未知错误}" >&2
146
+ echo "执行失败(dry-run=${dry_run}):${err_head:-未知错误}" >&2
147
147
  return 1
148
148
  fi
149
149
  }
@@ -145,7 +145,7 @@ run_cmd_to_file() {
145
145
  fi
146
146
  if ! wecom-cleaner "${cmd_parts[@]}" >"$output_file" 2>"$err_file"; then
147
147
  err_head="$(head -n 3 "$err_file" 2>/dev/null || true)"
148
- echo "执行失败(dry-run=$dry_run):${err_head:-未知错误}" >&2
148
+ echo "执行失败(dry-run=${dry_run}):${err_head:-未知错误}" >&2
149
149
  return 1
150
150
  fi
151
151
  }
@@ -173,7 +173,7 @@ run_cmd_to_file() {
173
173
  fi
174
174
  if ! wecom-cleaner "${cmd_parts[@]}" >"$output_file" 2>"$err_file"; then
175
175
  err_head="$(head -n 3 "$err_file" 2>/dev/null || true)"
176
- echo "执行失败(dry-run=$dry_run):${err_head:-未知错误}" >&2
176
+ echo "执行失败(dry-run=${dry_run}):${err_head:-未知错误}" >&2
177
177
  return 1
178
178
  fi
179
179
  }
@@ -241,6 +241,7 @@ warnings_total=$((warnings_preview + warnings_exec + warnings_verify))
241
241
  errors_total=$((errors_preview + errors_exec + errors_verify))
242
242
 
243
243
  printf '\n=== 全量空间治理结果(给用户)===\n'
244
+ printf -- '- 执行结论:%s(%s)\n' "$conclusion" "$reason"
244
245
  if [[ "$executed" == "true" ]]; then
245
246
  printf -- '- 已完成:已治理 %s 项空间目标,释放 %s。\n' "$execute_success" "$(human_bytes "$execute_reclaimed")"
246
247
  elif [[ "$matched_targets" -eq 0 ]]; then
@@ -263,6 +264,7 @@ printf -- '- 命中体积:%s\n' "$(human_bytes "$matched_bytes")"
263
264
  printf -- '- 预计释放:%s\n' "$(human_bytes "$preview_reclaimed")"
264
265
  if [[ "$executed" == "true" ]]; then
265
266
  printf -- '- 实际释放:%s\n' "$(human_bytes "$execute_reclaimed")"
267
+ printf -- '- 执行明细:成功 %s / 跳过 %s / 失败 %s\n' "$execute_success" "$execute_skipped" "$execute_failed"
266
268
  printf -- '- 清理批次:%s(可用于恢复)\n' "$execute_batch"
267
269
  printf -- '- 复核结果:剩余可治理 %s 项\n' "$verify_matched"
268
270
  else
@@ -0,0 +1,240 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ usage() {
5
+ cat <<'EOF'
6
+ 用法:
7
+ upgrade_report.sh [--method npm|github-script] [--version <x.y.z>] [--channel stable|pre]
8
+ [--execute true|false] [--root <path>] [--state-root <path>]
9
+
10
+ 说明:
11
+ - 默认仅预演(--execute false),不做真实升级。
12
+ - --execute true 时才会实际执行升级。
13
+ EOF
14
+ }
15
+
16
+ if ! command -v jq >/dev/null 2>&1; then
17
+ echo "错误:缺少 jq,请先安装(brew install jq)。" >&2
18
+ exit 2
19
+ fi
20
+
21
+ if ! command -v wecom-cleaner >/dev/null 2>&1; then
22
+ echo "错误:未找到 wecom-cleaner 命令,请先安装 @mison/wecom-cleaner。" >&2
23
+ exit 2
24
+ fi
25
+
26
+ METHOD="npm"
27
+ VERSION=""
28
+ CHANNEL="stable"
29
+ EXECUTE="false"
30
+ ROOT=""
31
+ STATE_ROOT=""
32
+
33
+ while [[ $# -gt 0 ]]; do
34
+ case "$1" in
35
+ --method | --upgrade)
36
+ METHOD="${2:-npm}"
37
+ shift 2
38
+ ;;
39
+ --version | --upgrade-version)
40
+ VERSION="${2:-}"
41
+ shift 2
42
+ ;;
43
+ --channel | --upgrade-channel)
44
+ CHANNEL="${2:-stable}"
45
+ shift 2
46
+ ;;
47
+ --execute)
48
+ EXECUTE="${2:-false}"
49
+ shift 2
50
+ ;;
51
+ --root)
52
+ ROOT="${2:-}"
53
+ shift 2
54
+ ;;
55
+ --state-root)
56
+ STATE_ROOT="${2:-}"
57
+ shift 2
58
+ ;;
59
+ -h | --help)
60
+ usage
61
+ exit 0
62
+ ;;
63
+ *)
64
+ echo "错误:未知参数 $1" >&2
65
+ usage
66
+ exit 2
67
+ ;;
68
+ esac
69
+ done
70
+
71
+ case "$METHOD" in
72
+ npm | github-script) ;;
73
+ *)
74
+ echo "错误:--method 只能是 npm 或 github-script" >&2
75
+ exit 2
76
+ ;;
77
+ esac
78
+
79
+ case "$CHANNEL" in
80
+ stable | pre) ;;
81
+ *)
82
+ echo "错误:--channel 只能是 stable 或 pre" >&2
83
+ exit 2
84
+ ;;
85
+ esac
86
+
87
+ case "$EXECUTE" in
88
+ true | false) ;;
89
+ *)
90
+ echo "错误:--execute 只能是 true 或 false" >&2
91
+ exit 2
92
+ ;;
93
+ esac
94
+
95
+ CHECK_JSON="$(mktemp -t wecom-upgrade-check.XXXX.json)"
96
+ CHECK_ERR="$(mktemp -t wecom-upgrade-check.XXXX.err)"
97
+ EXEC_JSON="$(mktemp -t wecom-upgrade-exec.XXXX.json)"
98
+ EXEC_ERR="$(mktemp -t wecom-upgrade-exec.XXXX.err)"
99
+ trap 'rm -f "$CHECK_JSON" "$CHECK_ERR" "$EXEC_JSON" "$EXEC_ERR"' EXIT
100
+
101
+ check_cmd=(--check-update --output json --upgrade-channel "$CHANNEL")
102
+ if [[ -n "$ROOT" ]]; then
103
+ check_cmd+=(--root "$ROOT")
104
+ fi
105
+ if [[ -n "$STATE_ROOT" ]]; then
106
+ check_cmd+=(--state-root "$STATE_ROOT")
107
+ fi
108
+
109
+ check_ok="true"
110
+ if ! wecom-cleaner "${check_cmd[@]}" >"$CHECK_JSON" 2>"$CHECK_ERR"; then
111
+ check_ok="false"
112
+ fi
113
+
114
+ has_update="false"
115
+ current_version="-"
116
+ latest_version="-"
117
+ source_used="none"
118
+ if [[ "$check_ok" == "true" ]]; then
119
+ has_update="$(jq -r '.summary.hasUpdate // false' "$CHECK_JSON")"
120
+ current_version="$(jq -r '.summary.currentVersion // "-"' "$CHECK_JSON")"
121
+ latest_version="$(jq -r '.summary.latestVersion // "-"' "$CHECK_JSON")"
122
+ source_used="$(jq -r '.summary.source // "none"' "$CHECK_JSON")"
123
+ fi
124
+
125
+ plan_target="$VERSION"
126
+ if [[ -z "$plan_target" && "$check_ok" == "true" && "$latest_version" != "-" ]]; then
127
+ plan_target="$latest_version"
128
+ fi
129
+
130
+ plan_cmd=(wecom-cleaner --upgrade "$METHOD")
131
+ if [[ -n "$plan_target" ]]; then
132
+ plan_cmd+=(--upgrade-version "$plan_target")
133
+ fi
134
+ plan_cmd+=(--upgrade-channel "$CHANNEL" --upgrade-yes)
135
+ if [[ -n "$ROOT" ]]; then
136
+ plan_cmd+=(--root "$ROOT")
137
+ fi
138
+ if [[ -n "$STATE_ROOT" ]]; then
139
+ plan_cmd+=(--state-root "$STATE_ROOT")
140
+ fi
141
+ plan_cmd+=(--output json)
142
+
143
+ if [[ "$EXECUTE" != "true" ]]; then
144
+ printf '\n=== 程序升级预演结果(给用户)===\n'
145
+ if [[ "$check_ok" == "true" ]]; then
146
+ printf -- '- 执行结论:仅预演,未执行真实升级。\n'
147
+ if [[ "$has_update" == "true" ]]; then
148
+ printf -- '- 检查结果:检测到新版本(当前 %s,最新 %s)。\n' "$current_version" "$latest_version"
149
+ else
150
+ printf -- '- 检查结果:当前已是最新版本(%s)。\n' "$current_version"
151
+ fi
152
+ printf -- '- 信息来源:%s(先 npm,失败再回退 GitHub)。\n' "$source_used"
153
+ else
154
+ err_head="$(head -n 3 "$CHECK_ERR" 2>/dev/null || true)"
155
+ echo "执行失败:${err_head:-未知错误}" >&2
156
+ printf -- '- 执行结论:更新检查失败,未进入升级预演。\n'
157
+ printf -- '- 检查结果:%s\n' "${err_head:-未知错误}"
158
+ exit 1
159
+ fi
160
+ printf -- '- 升级方式:%s\n' "$METHOD"
161
+ printf -- '- 计划目标版本:%s\n' "${plan_target:--}"
162
+ printf -- '- 计划执行命令:%s\n' "${plan_cmd[*]}"
163
+ printf '\n说明\n'
164
+ printf -- '- 如需真实执行,请追加参数:--execute true\n'
165
+ printf -- '- 升级会更新本机安装,不会触碰聊天缓存数据。\n'
166
+ exit 0
167
+ fi
168
+
169
+ upgrade_cmd=(--upgrade "$METHOD" --upgrade-channel "$CHANNEL" --upgrade-yes --output json)
170
+ if [[ -n "$VERSION" ]]; then
171
+ upgrade_cmd+=(--upgrade-version "$VERSION")
172
+ fi
173
+ if [[ -n "$ROOT" ]]; then
174
+ upgrade_cmd+=(--root "$ROOT")
175
+ fi
176
+ if [[ -n "$STATE_ROOT" ]]; then
177
+ upgrade_cmd+=(--state-root "$STATE_ROOT")
178
+ fi
179
+
180
+ upgrade_ok="true"
181
+ if ! wecom-cleaner "${upgrade_cmd[@]}" >"$EXEC_JSON" 2>"$EXEC_ERR"; then
182
+ upgrade_ok="false"
183
+ fi
184
+
185
+ if ! jq -e . >/dev/null 2>&1 <"$EXEC_JSON"; then
186
+ err_head="$(head -n 3 "$EXEC_ERR" 2>/dev/null || true)"
187
+ echo "执行失败:${err_head:-未知错误}" >&2
188
+ exit 1
189
+ fi
190
+
191
+ summary_executed="$(jq -r '.summary.executed // false' "$EXEC_JSON")"
192
+ summary_method="$(jq -r '.summary.method // "-"' "$EXEC_JSON")"
193
+ summary_target="$(jq -r '.summary.targetVersion // "-"' "$EXEC_JSON")"
194
+ summary_status="$(jq -r '.summary.status // "-"' "$EXEC_JSON")"
195
+ summary_command="$(jq -r '.summary.command // "-"' "$EXEC_JSON")"
196
+ duration_ms="$(jq -r '.meta.durationMs // 0' "$EXEC_JSON")"
197
+ warnings_count="$(jq -r '(.warnings // []) | length' "$EXEC_JSON")"
198
+ errors_count="$(jq -r '(.errors // []) | length' "$EXEC_JSON")"
199
+
200
+ installed_version="$(wecom-cleaner --version 2>/dev/null || true)"
201
+ if [[ -z "$installed_version" ]]; then
202
+ installed_version="-"
203
+ fi
204
+
205
+ printf '\n=== 程序升级结果(给用户)===\n'
206
+ if [[ "$upgrade_ok" == "true" ]]; then
207
+ printf -- '- 执行结论:升级流程已完成。\n'
208
+ else
209
+ printf -- '- 执行结论:升级执行失败,请按错误信息排查。\n'
210
+ fi
211
+
212
+ printf '\n执行信息\n'
213
+ printf -- '- 升级方式:%s\n' "$summary_method"
214
+ printf -- '- 目标版本:%s\n' "$summary_target"
215
+ printf -- '- 是否执行升级:%s\n' "$( [[ "$summary_executed" == "true" ]] && printf '是' || printf '否' )"
216
+ printf -- '- 命令退出码:%s\n' "$summary_status"
217
+ printf -- '- 执行命令:%s\n' "$summary_command"
218
+ printf -- '- 升级后版本:%s\n' "$installed_version"
219
+
220
+ if [[ "$errors_count" -gt 0 ]]; then
221
+ printf '\n错误摘要\n'
222
+ while IFS= read -r message; do
223
+ [[ -z "${message:-}" ]] && continue
224
+ printf -- '- %s\n' "$message"
225
+ done < <(jq -r '.errors // [] | .[] | .message // ""' "$EXEC_JSON")
226
+ fi
227
+
228
+ printf '\n运行状态\n'
229
+ printf -- '- 耗时:%s ms\n' "$duration_ms"
230
+ printf -- '- 告警:%s\n' "$warnings_count"
231
+ printf -- '- 错误:%s\n' "$errors_count"
232
+
233
+ printf '\n指标释义\n'
234
+ printf -- '- 目标版本:本次升级计划安装的版本。\n'
235
+ printf -- '- 升级后版本:命令执行后本机实际返回的版本号。\n'
236
+ printf -- '- 命令退出码:0 表示升级命令执行成功,非 0 表示执行失败。\n'
237
+
238
+ if [[ "$upgrade_ok" != "true" ]]; then
239
+ exit 1
240
+ fi