Skip to content

v1.1.0

Latest

Choose a tag to compare

@iBitBetter iBitBetter released this 19 Jul 01:50
e21a5c7

Changelog

本项目所有重要改动记录于此文件。

格式遵循 Keep a Changelog,版本号遵循 语义化版本

1.1.0 — 2026-07-17

两天集中迭代(2026-07-16 ~ 07-17):TUI 全面改为 Mole 风格;GUI 完全重写为金山毒霸卡片风格,并将 Winapp2 社区规则正式接入 GUI(默认开启、可关闭);新增管理员提权重试与「重启时删除」兜底;社区规则扫描条目显示真实软件图标。

Added

  • GUI 完全重写(金山毒霸卡片风格)
    • 单窗口卡片式布局:打开即自动扫描 → 扫描完点「一键清理」→ 清理后自动重扫;复用现有引擎 Config / SystemCleaner / SizeUtils
    • 内置 IconPainter:Canvas 绘制 20+ 种图标(Windows/文件夹/浏览器/IM 等),无需外部图片资源。
    • 新增四态状态机 MODE_IDLE / MODE_SCANNING / MODE_CLEANING / MODE_DONE,分别控制头部配色、按钮组与卡片样式。
      • 扫描/清理中:蓝色头部 + 当前路径滚动 + 卡片逐个展开动画(350ms 错开);清理进度实时更新。
      • 完成态:绿色头部 +「已清理 XX MB」大标题 + 横向柱状图(每分类一列)+ 明细列表(按大小降序,状态徽章 已清理/部分清理/失败)。
    • 「重新扫描」改为白色背景绿色文字实心按钮,与「管理员权限重试」并列。
  • GUI 接入 Winapp2 社区规则(默认开启、可关闭)
    • 新增第 4 个分类 Community(紫色),IconPainter._community 紫色拼图图标。
    • 标题栏「社区规则」复选框(默认勾选),切换触发重扫;_find_community_ini() + _load_community_rules() 移植自 CLI 版并缓存。
    • 扫描前按开关注入 set_community_rules();窗口背景色跟随红/蓝/绿头部。
  • 「管理员权限重试」按钮(UAC 提权重跑)
    • _is_admin()Shell32.IsUserAnAdmin)+ _relaunch_as_admin()ShellExecuteW "runas" 触发 UAC,带 --admin-retry / --community-off 透传)。
    • 仅当完成态存在 failed 项时显示;提权成功后关闭当前非管理员窗口,由提权副本自动重扫 + 自动清理(跳过确认框)。
  • 「重启时删除」(MoveFileEx)兜底系统锁文件
    • 引擎新增 schedule_reboot_delete()(ctypes MoveFileExW(MOVEFILE_DELAY_UNTIL_REBOOT));_delete_files / _clean_contents 支持 reboot_fallback,返回元组升级为 (deleted, failed, scheduled)
    • clean() 新增 "scheduled" 状态;仅提权副本(reboot_fallback=self.admin_retry)才登记重启删除,普通清理不改系统行为。
    • 完成态新增蓝色徽章「已计划重启删除」,错误原因蓝色显示。
  • 社区规则扫描条目显示真实软件图标
    • winapp2_adapter.py 新增 _pick_detect_exe(rule, env):从 DetectFile 挑 exe 路径并展开 %ProgramFiles% 等变量,在 to_winmole_rules() 导出 detect_file 字段。
    • GUI 新增 _extract_app_icon(exe_path)SHGetFileInfoW + DrawIconEx → PIL ARGB)与 _get_app_icon()(按 exe+尺寸缓存 tk.PhotoImage);社区条目优先显示真图标,失败回落手绘拼图。
  • TUI(winmole_simple.py)全面改为 Mole 风格
    • 扫描结果页:按 System / App caches / Browsers / Community 分组报告,含系统信息(CPU / 剩余空间)与白名单状态。
    • 首页 Banner 改为 block 字符 "MOLE" 大 logo;菜单改为三栏 Table(编号+标题+英文说明)+ 快捷键栏。
    • 磁盘分析页:Unicode 条形图(█/░)+ 百分比排名列表 + 快捷键栏。
    • 系统监控页:状态栏 + ASCII mole logo + 纵向分区块(CPU / Memory / Disk / Power / Processes / Network)。
    • 卸载页:交互式多选列表(↑↓/Space/Enter/0 全选/S 排序// 搜索/Q 退出),rich Live 原地更新消除抖动。
    • 首页新增 6. Community 开关菜单项(运行时开/关 Winapp2 规则,等价于 --community);移除 Builds / Installers 菜单项与对应死代码(clean_build_artifacts / clean_installers / BuildArtifactCleaner 引用)。

Changed

  • winmole_engine.py 引擎增强
    • SystemCleaner.scan() 按规则来源注入 category 字段(system_junk→System, im_cleanup→App caches, browser_cache→Browsers, community→Community)。
    • 新增 command 字段支持:scan() 为带 command 的规则生成代表项(size=0);clean() 识别后调用新增静态方法 _run_command(subprocess,带 timeout 与 utf-8 容错)。
    • _parse_hive() 重写:新增 HKEY_USERS / HKEY_CURRENT_CONFIG 及缩写 HKU\ / HKCC\_delete_community_key()clean() 主循环 except (OSError, ValueError),单坏键只记 failed 不中断批量。
    • RegistryCleaner.get_installed_apps() 读取注册表 InstallDate 字段。
  • winmole_simple.py 输入处理
    • 顶部条件导入 msvcrt;新增 _read_key() 单键读取 Windows 扩展键(↑↓←→/PgUp/PgDn/Home/End)并兼容 ANSI VT 序列。
    • monitor_system() 递归刷新改为 while True 循环(消除栈累积);卸载页抖动先 console.clear() 后改用 rich Live 固定高度原地更新。
  • winapp2_adapter.pyto_winmole_rules() 透传 detect_file;变量展开与 Detect 剪枝持续优化。
  • locales.py:补充 community / command / 各 TUI 页面相关中英 key。
  • Tkinter 真图标用 lbl.image = photo 保引用,防止被 GC。

Fixed

  • 修复 GUI「一键清理」失效:缺 from tkinter import messagebox 导致 _do_clean() 运行时 NameError 中断(已补 import)。
  • 修复完成态三处问题:副标题浅绿在绿底不可见(改 #F0FFF0)、「重新扫描」融入背景非按钮(改白底绿字实心)、下方大片空白(改为柱状图 + 明细列表)。
  • 修复社区规则名称截断:_make_subitem 硬限 8 字符 → Community 18 / 其他 14 字符,列数 6→4。
  • 修复完成态看不到失败原因:_on_clean_complete 未将 clean() 返回的 status/error 写回 self.scan_results,已按 (path,name) 匹配合并。
  • 修正社区规则清理不掉的根因说明:系统锁文件需管理员或重启删除,错误信息改为「Files locked by system/apps — close apps or run as Admin」;提权重试失效后降级为「重启时删除」。
  • 修复卸载页上下箭头无法移动:Prompt.askinput() 无法捕获扩展键,改用 _read_key() 单键读取。
  • 修复社区注册表清理崩溃:HKEY_USERS\.DEFAULT 等未知 hive 抛 ValueError 中断全批,已识别并改为单键 failed。
  • 修复多处 CRLF / 转义导致的导入与脚本替换失败(源码改用 raw 字符串、bytes 替换等)。

1.0.0 — 2026-07-08

相对远端基线 v0.2.0-beta 的首次功能升级。核心新增 Winapp2/Winapp3 社区清理规则的 opt-in 支持,并修复了打包与解析的若干稳定性问题。

Added

  • Winapp2 / Winapp3 社区清理规则(opt-in,默认关闭)
    • 新增 winapp2_adapter.py:解析 Winapp2/Winapp3 INI 语法(FileKey / RegKey / ExcludeKey / Detect / DetectFile / DetectOS)。
      • PascalCase 变量(如 %ProgramFiles%)大小写不敏感展开,兼容 Windows os.environ 大写键。
      • 双架构目录展开(%ProgramFiles% → x64 + x86)、\os.sep 跨平台归一化。
      • 重复 key 文本预处理去重(_dedup_ini_lines),兼容真实 winapp2.ini 中大量重复选项。
      • Detect 剪枝(含注册表型 Detect 真实查表)、注册表 hive 归一化(HKLM\HKEY_LOCAL_MACHINE\)。
      • load_community() 统一返回 {file_rules, reg_rules, raw_rules, count, kept}
    • 解析真实 data/Winapp2.ini 实测:2781 文件规则 + 263 注册表规则。
  • GUI 社区规则开关
    • System Junk 面板新增「Community rules (Winapp2)」勾选框,默认关闭,含状态提示(已发现/未找到 .ini)与帮助文案。
    • 扫描结果 tree 新增 Source 列(Built-in / Community:分类),含 Warning 的规则在汇总行标注 ⚠ N 条规则含警告
    • 注册表面板新增 Community 分类(默认关闭,开启社区开关时自动勾选),扫描合并 community_reg_rules
  • CLI 社区规则开关
    • winmole_simple.py 新增 -c / --community / --winapp2(三者等价,默认关闭)。
    • 开启后加载社区文件 + 注册表规则:文件项标 [C] 并展示 warning;注册表删键前独立二次确认(Confirm.ask)。
  • 测试与样本
    • 新增 test_planb.py(6 项端到端测试:filespec 只删匹配文件保留目录、整目录保留空目录、REMOVESELF 删空目录、默认关闭无社区项、社区规则转换、注册表条目结构),全部通过。
    • 新增 data/winapp3_sample.ini(13 条真实 Winapp3 样本 + RegKey/DetectOS 语法补充)。
  • 工程化
    • 新增 .gitattributes*.bat text eol=crlf,保证 package.bat 等克隆后仍是 CRLF)。

Changed

  • package.bat 重写
    • 编码由 UTF-8+LF 改为 GBK + CRLF(修复 cmd.exe 因 LF 续行失效导致的「不是内部或外部命令」)。
    • 强制 pyinstaller>=6.0.0(兼容 version_info.txt 的裸 VSVersionInfo(...) 写法)。
    • 新增 WINMOLE_NONINTERACTIVE=1 非交互模式(跳过末尾 Test now? / pause,避免后台构建卡死)。
    • 构建日志落盘 build_logs/gui.logbuild_logs/cli.log,失败时 tail 40 行。
    • GUI / CLI 构建均增加 --hidden-import=winapp2_adapter --add-data "data;data"(adapter 与 data/ 一并打包)。
    • 自动创建/修复 venv。
  • winmole_engine.py 引擎增强
    • SystemCleaner 新增 community_rules 字段 + set_community_rules()scan() 经统一 _scan_rule_paths() 处理内置与社区规则。
    • 支持 _filespec(只删匹配文件、保留目录)、_remove_self(删空目录)、is_file() 分支(glob 同时命中文件时单独处理)。
    • RegistryCleaner 新增 _delete_community_key() 精确删键,clean() 支持 category="community"category_map 增加 community
  • locales.py:中英补充 community 相关 key(community_toggle / community_help / community_status_* / reg_cat_community / clean_col_source / clean_warn_note)。
  • .gitignore:补充 .workbuddy/build_logs/,避免本地数据目录与日志进入仓库。

Fixed

  • 修复 package.bat 在 LF 换行符下每行报「不是内部或外部命令」(改用 GBK + CRLF 写入)。
  • 修复 version_info.txt 在 PyInstaller < 6 下 KeyError(强制 >=6.0.0)。
  • 修复真实 data/Winapp2.ini 加载时 DuplicateOptionError: option 'Default' already exists(Python 3.13 configparser 先于 dict 赋值抛错;改用 _dedup_ini_lines 文本预处理合并重复值)。
  • 修复启用 Community rules 后 NotADirectoryError: [WinError 267] 目录名称无效(glob 同时匹配目录与文件,文件被传入 os.walk 崩溃;新增 is_file() 分支 + is_dir() 守卫)。

[0.2.0-beta]

远端仓库基线快照(早于本 changelog 建立)。包含早期 winmole_engine.py / winmole_gui.py / winmole_simple.py / locales.py / cleanup_rules.yaml 等内置清理能力,尚未集成社区规则与适配器。