@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.
- package/README.md +67 -15
- package/docs/NON_INTERACTIVE_SPEC.md +52 -0
- package/docs/TEST_MATRIX.md +110 -0
- package/docs/releases/v1.2.1.md +33 -0
- package/docs/releases/v1.3.0.md +45 -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 +5 -5
- package/native/zig/src/main.zig +1 -1
- package/package.json +2 -1
- package/skills/wecom-cleaner-agent/SKILL.md +9 -5
- package/skills/wecom-cleaner-agent/agents/openai.yaml +1 -1
- package/skills/wecom-cleaner-agent/references/commands.md +24 -0
- package/skills/wecom-cleaner-agent/scripts/check_update_report.sh +141 -0
- package/skills/wecom-cleaner-agent/scripts/cleanup_monthly_report.sh +11 -1
- package/skills/wecom-cleaner-agent/scripts/recycle_maintain_report.sh +1 -1
- package/skills/wecom-cleaner-agent/scripts/restore_batch_report.sh +1 -1
- package/skills/wecom-cleaner-agent/scripts/space_governance_report.sh +3 -1
- package/skills/wecom-cleaner-agent/scripts/upgrade_report.sh +240 -0
- package/src/cli.js +709 -2
- package/src/config.js +51 -0
- package/src/constants.js +2 -0
- package/src/doctor.js +24 -0
- package/src/recycle-maintenance.js +44 -3
- package/src/updater.js +503 -0
|
@@ -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
|