纯 Windows 只读存储分析,交互式 HTML 报告 + 一键清理。
| 阶段 | 谁执行 | 做什么 | 产出 |
|---|---|---|---|
| ------ | -------- | -------- | ------ |
| Step 1-2 | scan.py 脚本 | 只读扫描 12 组目标,算大小 | %TEMP%\storage_scan.json |
| Step 3 | Agent (你) | 读参考→探查→三灯分级→写 JSON | %TEMP%\storage_analysis.json |
| Step 4 | server.py 脚本 | 启动本地服务 → 交互式网页 | http://127.0.0.1:端口/ |
| Step 5 | Agent (你) | 用 preview_url 打开 + 对话给摘要 | 浏览器预览 + 文字结论 |
> 速览:用户说"磁盘满了" → 跑 scan.py --quick(0.3s) 看概况 → 需要详情再跑全量(9s) → 按附录A模板写分析JSON → server.py 启动交互式服务 → 自动用 preview_url 打开 → 给用户一句话摘要。全程只读扫描,交互式网页支持一键清理。
os.scandir / shutil.disk_usage / 列目录。即使用户在对话里说"帮我删",也要先停下确认,不要直接代跑。
C:\Windows 除了 Installer / Temp / SoftwareDistribution之外不扫描不操作。
\\?\ 前缀。Step 3 完成后,必须暂停,向用户展示:
用户同意后才进入 Step 4。 如果用户要求调整,只调用户指定的项,不要推翻全部分级。
| 异常场景 | 处理方式 |
|---|---|
| ---------- | ---------- |
| Python 未安装 | 提示用户安装 Python 3.10+:winget install python3 或从 python.org 下载。不要用 python3 命令,Windows 上是 python 或 py -3。 |
| scan.py 输出为空 | 检查 %TEMP%\storage_scan.json 是否存在且非空。为空则重新扫描并加 2>&1 捕获 stderr 排查错误。 |
| 扫描结果全 0(空盘) | 报告直接给摘要"磁盘基本为空,无需清理"。不跑 Step 3 分析。 |
| 某个 target 目录不存在 | 跳过,不给 denied。如 C:\Windows\Installer 在某些精简版 Windows 上不存在。 |
| server.py 端口被占用 | server.py 使用端口 0(随机),不会冲突。如遇异常,检查防火墙/杀毒软件是否拦截 127.0.0.1 本地回环。仅在用户要求服务模式时使用。 |
| build_report.py 写入桌面失败 | 检查桌面路径是否可写,如被 OneDrive 同步占用则改写到 %USERPROFILE% 或 %TEMP%。 |
| 浏览器打不开 | 手动复制终端输出的 URL 到浏览器。或用 --no-browser 参数跳过自动打开。 |
| recycle_bin 扫描为空 | 原因:普通用户无权读 C:\$Recycle.Bin。给提示:"回收站大小无法直接读取,请右键桌面回收站查看属性"。 |
| 磁盘接近满(<1GB 可用) | 优先使用 --quick 模式避免扫描写出大量 JSON 占用最后空间。写 analysis JSON 时确认 %TEMP% 有足够空间。 |
| 权限拒绝(denied) | 扫描结果中 denied 标注的目录,在报告中列出并说明"可能遗漏体量"。不要尝试 runas 提权。 |
python scripts/scan.py --quick > %TEMP%\storage_scan.json
仅扫描一级子目录大小(跳过递归),大文件自动聚合显示。
适用场景:快速判断"有没有大问题"。
python scripts/scan.py > %TEMP%\storage_scan.json
扫描 12 组目标(详见 references/windows.md),耗时约 9-15s(SSD)。
读不到的目录标 denied。
先读 references/windows.md 了解布局规则,再读扫描 JSON。
按 附录A 的 6 条检查清单逐条执行,按 附录B 的模板写出 analysis JSON。
核心决策规则(详见附录A):
pip Cache,反例:node_modulesWeChat Files,反例:Windows\System32MobileAppEngine,反例:C:\Windows使用 PowerShell Start-Process 以独立进程启动(不受 Bash 超时影响):
Start-Process -FilePath "python" -ArgumentList "scripts/server.py","%TEMP%\storage_analysis.json","--no-browser","--port-file","%TEMP%\storage_server_url.txt" -WindowStyle Hidden
启动后:
%TEMP%\storage_server_url.txt 获取 URLGET /health 确认服务正常Start-Process 在用户默认浏览器中打开 URL(不要用 preview_url,内嵌浏览器无法正确执行交互式功能)preview_url 在内嵌面板中预览(仅查看,一键清理功能需在真实浏览器中使用)这是默认模式,交互式网页支持:
可选:静态报告模式(仅查看,不能操作删除):
python scripts/build_report.py %TEMP%\storage_analysis.json %USERPROFILE%\Desktop\storage-report.html
纯静态只读 HTML 文件,不含删除功能。仅在用户明确要求静态报告时使用。
报告打开后,给一段结论先行的摘要:总可释放估算、最该先清的 2-3 项、风险最高的一项。细节让用户看网页。
逐条执行,每完成一条在脑中打勾。
标签按优先级从高到低匹配,命中即停止,后面的不再考虑:
| 优先级 | 标签 | 释义 | 判定依据 |
|--------|------|------|----------|
| 1 | 系统文件 | 操作系统运行依赖的核心文件与组件仓库,误删可能导致系统不稳定、功能异常或无法启动 | C:\Windows 下除 Temp/SoftwareDistribution 外的全部子目录, C:\Boot, EFI 分区, pagefile.sys, hiberfil.sys |
| 2 | 应用程序文件 | 应用程序安装目录下的全部文件(含 exe/dll/资源/配置),删除将导致对应应用无法运行 | C:\Program Files\, C:\Program Files (x86)\, %LOCALAPPDATA%\Programs\* 下的应用目录 |
| 3 | 虚拟机镜像 | 虚拟机/模拟器的磁盘镜像文件,删除将导致虚拟机数据完全丢失且不可恢复 | EmulatorSdk 镜像, WSL vhdx, Hyper-V 虚拟硬盘, VMware .vmdk, VirtualBox .vdi |
| 4 | 应用数据 | 应用产生的不可再生或具有持久价值的用户个人数据,通常位于 AppData 及其子目录 | WPS 模板, 微信聊天记录, 钉钉消息, 邮箱本地数据 |
| 5 | 应用缓存 | 面向最终用户的应用产生的可再生临时文件,删除不影响功能、不丢用户数据 | 浏览器 Cache, 缩略图缓存, 微信/QQ 图片缓存, %TEMP%\*, Office 最近文件索引 |
| 6 | 开发缓存 | 包管理器/构建工具/IDE 产生的可再生中间文件,删除后可通过重新下载或构建恢复 | pip Cache, .npm, .gradle, .m2/repository, Cargo target/, Yarn cache, NuGet packages |
| 7 | 用户文件 | 用户主动创建/编辑/保存的个人文档、工程文件、自建图片等 | Desktop, Documents, Pictures, WorkBuddy\* 项目目录 |
| 8 | 媒体内容 | 从网络下载或应用缓存的消费型音视频文件,常见于 Downloads/Videos/Music 及各 App 离线目录 | Downloads 里的 .mp4/.mkv/.avi, App 离线视频缓存, Music\ |
| 9 | 下载内容 | Downloads 目录下用户通过浏览器/下载器获取后未整理的文件(安装包、压缩包、文档等) | Downloads\.exe, Downloads\.msi, Downloads\*.zip |
| 10 | 回收站 | Windows 回收站内容 | C:\$Recycle.Bin, 各盘符 \$Recycle.Bin |
| 11 | 其他 | 以上均不匹配的兜底分类 | — |
> 互斥规则:按优先级 1→11 依次匹配,命中即停。例如:Downloads 下的安装包优先匹配 9(下载内容),而非 8(媒体内容);%TEMP% 下的编译中间文件优先匹配 6(开发缓存),而非 5(应用缓存)。
ProgramData 子目录、不明用途的隐藏目录 → ls 查看内部结构,查出归属。
例:kingsoft/wps_international/addons 实为国际版 WPS 的冗余插件。
🟢 可自动清理 — 纯缓存/临时文件/安装包残留/可再生不丢用户数据
浏览器 Cache、%TEMP%\*、--updater 目录、pip Cache(开发缓存可再生)、IntelliJ IDEA cachesnode_modules(项目依赖,删了项目跑不了)、AppData\Roaming\Microsoft(Office 设置不可再生)、微信聊天记录(用户数据)trash_paths[]、commands[{label,cmd}]、kill_processes[]。trash_paths 不能为空,漏了按钮就不出现。🟡 需人工判断 — 含用户数据或有判断成本
WeChat Files(聊天记录含重要数据)、Downloads 文件夹(可能有重要文件未整理)、WPS 模板(含自定义)、VMware 虚拟机镜像(大小巨大但可能还在用)C:\Windows\Installer 不能手删(用 DISM 清理)、C:\Windows\WinSxS 不能手删(系统组件仓库)、C:\Windows\System32 不能手删content_profile、why_manual、disposal、risk。trash_paths(🟡 只能移废纸篓,永不给 rm)。open_note 字段说明。🔴 建议卸载(别手删) — 大应用/重复安装/想卸载的项
MobileAppEngine(7.6GB)、EdrawSoft(1.2GB)、Autodesk(2GB+)C:\Windows(操作系统本身)、Microsoft Office(如果还在用)、dotnet(系统运行时依赖)、Git(开发必备工具)why_keep、indirect_release(具体卸载步骤,可照做不是空话)、app_paths[]。如果某级超过 10 项,挑最重要的列,其余合并到 summary。
"约"已表示估算,不要再加"(估算)"。
tier_stats 的 green/yellow/red 必须是可解析的 GB 数字开头(如"约 27.8 GB")。
{
"generated_at": "2026-06-03 17:00:00",
"scan_seconds": 9.3,
"system": { /* 从 scan.json 的 system 字段直接复制 */ },
"top5": [
{"rank": 1, "tier": "red", "size": "约 7.6 GB", "type": "应用程序文件",
"name": "MobileAppEngine", "path": "C:\\Program Files\\MobileAppEngine",
"note": "华为手机助手模拟器,EmulatorSdk 占 7.4 GB"}
],
"green": [
{
"name": "WorkBuddy 桌面端更新缓存",
"path": "C:\\Users\\xxx\\AppData\\Local\\@genieworkbuddy-desktop-updater",
"size_estimate": "约 450 MB",
"kill_processes": [],
"trash_paths": ["C:\\Users\\xxx\\AppData\\Local\\@genieworkbuddy-desktop-updater"],
"commands": [
{"label": "PowerShell 移入回收站",
"cmd": "Remove-Item -Path \"$env:LOCALAPPDATA\\@genieworkbuddy-desktop-updater\" -Recurse -Force"}
]
}
],
"yellow": [
{
"name": "WPS 双版本插件/模板",
"path": "C:\\Users\\xxx\\AppData\\Roaming\\kingsoft",
"size": "约 4.4 GB",
"content_profile": "WPS 中文版+国际版数据。wps/addons 2.2GB,wps_international/addons 1.9GB。",
"why_manual": "涉及两个版本的共用数据,无法自动判断主要用哪版。",
"disposal": "只用中文版:wps_international/addons 1.9GB 可安全删除。",
"risk": "删除 wps_international 后国际版 WPS 启动时会重新下载插件。",
"trash_paths": ["C:\\Users\\xxx\\AppData\\Roaming\\kingsoft\\wps_international"]
}
],
"red": [
{
"name": "MobileAppEngine(华为手机助手)",
"path": "C:\\Program Files\\MobileAppEngine",
"size": "约 7.6 GB",
"why_keep": "7.4GB 为 EmulatorSdk Android 模拟器镜像。如果不用华为手机连电脑可卸载。",
"indirect_release": "设置→应用→已安装的应用→搜索 MobileAppEngine→卸载。释放约 7.6GB。",
"app_paths": ["C:\\Program Files\\MobileAppEngine"],
"auto_reclaim": "否,需手动卸载"
}
],
"denied": [],
"summary": {
"overview": "C 盘仅剩 4.3GB,最大占用是华为手机助手 7.6GB + WPS 数据 4.4GB。可立刻释放约 1.8GB。",
"tier_stats": {"green": "约 1.8 GB", "yellow": "约 15.0 GB", "red": "约 12.4 GB"},
"priority": [
"最优先:清除更新缓存 5 项约 1.8GB,零风险",
"其次:清理 WPS 国际版插件 1.9GB"
],
"long_term": [
"启用存储感知:设置→系统→存储→存储感知→开",
"定期 DISM:DISM /Online /Cleanup-Image /StartComponentCleanup",
"大文件迁移至 D 盘:D 盘还有 218GB 可用"
]
}
}
注意事项:
system 字段直接复制 scan.json 的 system,不要改动结构。trash_paths 必须是真实存在的绝对路径数组,不能为空数组。trash_paths 只放核实过安全可移的子路径(如旧备份目录),不是整个 path。trash_paths 留空或不写。commands[].cmd 写完整的可执行命令,用户可以直接复制到 PowerShell。| 维度 | 原版 | Windows 版 |
|---|---|---|
| ------ | ------ | ----------- |
| 平台 | macOS + Windows | Windows only |
| 扫描目标 | 7 组 (Win) | 12 组 + dev_caches |
| macOS 代码 | ~150 行 | 0 行 |
| 盲区 | ~65 GB | 已覆盖 |
| --quick 模式 | 无 | 有 |
| --cache 缓存 | 无 | 有 |
| 健康检查 | 无 | GET /health |
| 长路径处理 | 无 | \\?\ 前缀 |
| 回收站查询 | 无 | Windows API |
| hiberfil/pagefile | 未检测 | 已检测 |
cleanmgr(磁盘清理)、存储感知(设置→系统→存储)DISM /Online /Cleanup-Image /StartComponentCleanup /ResetBasepowercfg /hibernate off基于原版 storage-analyzer (KKKKhazix/khazix-skills) 的完整逆向分析创建纯 Windows 实现。
修改动机:
改动清单:
| 类型 | 项目 | 优势 |
|---|---|---|
| ------ | ------ | ------ |
| 新增 | 5 个系统级扫描目标(Installer/ProgramData/回收站/WinSxS/Windows Temp) | 扫描覆盖率从 ~35% 提升到 ~90% |
| 新增 | --quick 模式(0.2s 一级扫描 + 大文件自动聚合) | 首轮反馈从 14s 降到 0.2s,用户零等待 |
| 新增 | --cache 24h 缓存 + COMPUTERNAME 自动识别 | 二次扫描 <0.1s,消除重复扫描 |
| 新增 | GET /health 健康检查 + 启动自检 | 服务存活可感知,启动失败立刻报错 |
| 新增 | --min-mb 自定义阈值参数 | 大文件优先,用户可控粒度 |
| 新增 | hiberfil.sys / pagefile.sys 系统文件检测 | 休眠/虚拟内存占用可见,不再遗漏 |
| 删减 | 砍掉全部 macOS 代码(~150 行) | 代码量 -50%,Windows 专精,维护成本降低 |
| 修改 | Frontmatter 四段式结构化(做什么/何时用/触发词/反触发) | Agent 触发准确率提升,误触发减少 |
| 修改 | Step 3 6 条可勾选检查清单 + ⏸️ 确认门 | 防止 Agent 跳过用户审查,分级结果必须用户同意 |
| 修改 | 9 场景异常处理表 | 边界条件全覆盖(Python 未安装/空扫描/磁盘满/权限拒绝等) |
| 修改 | 11 种标签体系(含优先级链 + 互斥规则 + 正反例) | 分类准确率提升,名称去歧义(应用本体→应用程序文件) |
| 修改 | 附录 B 内联有效 JSON 模板(替代原版伪 JSON schema) | Agent 零推理写分析 JSON,照抄结构即可 |
| 优化 | Quick 模式 46 项→7 项(文件级自动聚合) | 用户一屏看完,不再被 40 个 .msp 淹没 |
| 优化 | 约束规则一章合并(铁律+确认门+异常处理) | 认知负荷 -60%,规则一次读完 |
| 优化 | Agent/Script 职责对照表 | 一眼知谁负责哪个阶段 |
| 修复 | os.path.isfile() → os.path.exists()(pagefile 检测) | 系统文件不再漏检 |
| 修复 | COMPUTERNAME → socket.gethostname() fallback | 缓存文件名不再显示 "unknown" |
| 修复 | 行缓冲 → sys.stdout.reconfigure(line_buffering=True) | 后台启动输出即时可见 |
| 修复 | \\?\ 长路径前缀 + FOF_NOERRORUI | 260 字符路径不丢失,错误弹窗抑制 |
原版 vs Windows 版性能:
| 指标 | 原版 | Windows 版 |
|---|---|---|
| ------ | ------ | ----------- |
| Quick 扫描 | — | 0.2s |
| 全量扫描 | 14.2s | 9.3s |
| 二次扫描(缓存命中) | 14.2s | <0.1s |
| 扫描覆盖率 | ~35% | ~90% |
| Quick 模式 Top 条目 | (无此模式) | 7 项(聚合后) |
| macOS 代码 | 150 行 | 0 行 |
修复报告 HTML 在浏览器中显示空白的致命问题。根因:JSON 数据注入 HTML 时,3 个崩溃点会导致整个 块解析失败 → 页面空白。
崩溃点分析:
| 崩溃点 | 触发条件 | 后果 |
|---|---|---|
| -------- | --------- | ------ |
注入 | JSON 中路径含 字符串 | 浏览器提前关闭 标签 → JS 块断裂 → 空白页 |
\u2028/\u2029 | JSON 字符串含 Unicode 行/段分隔符 | 合法 JSON 但非法 JS → 语法错误 → 空白页 |
| amber/yellow 歧义 | Agent 写 amber 而非 yellow | normalize 把 DATA.yellow 设为空数组 → 黄色项全部丢失 |
改动清单:
| 文件 | 类型 | 项目 | 说明 |
|---|---|---|---|
| ------ | ------ | ------ | ------ |
build_report.py | 新增 | validate() 结构验证函数 | 检查必需 top-level 键、amber/yellow 歧义、green/yellow/red 项必填字段、summary 完整性,输出诊断警告 |
build_report.py | 修复 | 三重安全转义 | → <\/script,\u2028 → \u2028,\u2029 → \u2029,彻底消除 JS 解析崩溃 |
build_report.py | 新增 | _warnings 注入数据 | 将结构验证警告传入模板,页面也能显示诊断提示 |
report_template.html | 修复 | amber→yellow / green_items→green 兼容 | Agent 写 amber 不再导致数据丢失 |
report_template.html | 修复 | 逐项字段补全 | green/yellow/red 每一项缺失的字段自动填安全默认值(如 content_profile → "暂无内容画像"),不再显示 undefined 或空白 |
report_template.html | 新增 | mount 函数结构诊断 | 检测 green/yellow/red 全空、缺少 size_estimate、缺少 content_profile 等问题,页面顶部显示警告横幅 |
report_template.html | 新增 | build_report 警告透传 | _warnings 数组中的验证警告也会在页面中显示 |
report_template.html | 修复 | catch 块增加调试信息 | JS 解析失败时不再空白,显示错误详情和原始数据片段 |
server.py | 修复 | 三重安全转义(同 build_report.py) | 服务模式下也不会因 / \u2028 崩溃 |
server.py | 修复 | amber→yellow 兼容 | load() 函数自动将 amber 键重命名为 yellow |
测试验证:
| 测试场景 | 结果 |
|---|---|
| --------- | ------ |
| 标准 JSON(完全匹配附录B模板) | ✅ 正常渲染 |
| 不完美 JSON(amber 代替 yellow + red 缺必填字段) | ✅ 有警告横幅但正常渲染,数据不丢失 |
| 极端最小 JSON(只有 system 字段,无 green/yellow/red) | ✅ 优雅降级,页面显示警告而非空白 |
含 \u2028/\u2029 的 JSON | ✅ 正确转义为 \u2028/\u2029,不再触发 JS 语法错误 |
在交互式网页中增加"一键清理"功能:确认面板让用户勾选要清理的绿色项,确认后逐项串行删除并实时显示进度,失败项跳过继续,最后显示结果摘要。
交互流程:
点击"一键清理全部 N 项 (约 X GB)" → 弹出确认面板
→ 面板列出所有绿色项(复选框 + 名称 + 路径 + 大小)
→ 用户勾选/取消 → 点击"确认移到废纸篓"或"直接删除"
→ 逐项串行调用 /action API
→ 每完成一项:更新进度条 + 状态标记(✓/✗)
→ 某项失败?跳过继续,记录错误
→ 全部完成:显示结果摘要(成功 N 项 / 失败 M 项 + 失败原因)
→ 用户点"关闭"
改动清单:
| 文件 | 类型 | 项目 | 说明 |
|---|---|---|---|
| ------ | ------ | ------ | ------ |
report_template.html | 新增 | 确认面板 UI(modal) | 半透明遮罩 + 居中弹窗 + 复选框列表 + 全选/取消全选 |
report_template.html | 新增 | openBatchModal() | 收集可清理绿色项,构建确认面板列表 |
report_template.html | 新增 | executeBatchClean(mode) | async 串行逐项删除,实时更新进度条 + 状态标记 |
report_template.html | 新增 | 进度条 + 结果摘要 | 进度条动画 + 成功(绿)/部分成功(黄)/失败(红) 三色结果面板 |
report_template.html | 改进 | 绿色区醒目大按钮 | 原 btn-sm 改为 btn-lg,显示"🗑 一键清理全部 N 项 (约 X GB)" |
report_template.html | 新增 | 逐项状态 CSS | batch-cleaning(清理中)、batch-ok(✓)、batch-fail(✗) 三种卡片状态 |
report_template.html | 新增 | 点击遮罩关闭面板 | 点击 modal 外部遮罩区域自动关闭 |
report_template.html | 改进 | "直接删除"选项默认隐藏 | 需手动勾选"显示直接删除选项"才出现,防止误操作 |
report_template.html | 新增 | 静态模式提示 | 静态报告模式下点一键清理,提示用户使用 server.py 启动服务模式 |
关键设计决策:
修复"一键清理"全部失败的 bug。根因:_to_wide_null_terminated() 返回 bytes(encode("utf-16-le")),但 SHFILEOPSTRUCTW.pFrom 声明为 wintypes.LPCWSTR,ctypes 期望 str 而非 bytes,导致每次移到废纸篓都报错 unicode string or integer address expected instead of bytes instance。
修复:
_to_wide_null_terminated() 返回 str 而非 bytesstr 转为 UTF-16import ctypes 语句(该函数不再需要 ctypes)move_to_trash() 增加错误码 120/124 回退逻辑:系统保护目录(如 C:\Windows\SoftwareDistribution\Download)或含被占用文件的目录无法移到回收站时,自动回退到 hard_delete(),避免清理失败ALLOWED_ROOTS 新增 C:\Program Files 和 C:\Program Files (x86):修复 🔴 项"在资源管理器打开"时 L7 root boundary 拦截(如 C:\Program Files\Autodesk)report_template.html 修复 onclick 属性中 Windows 路径反斜杠丢失:esc(p).replace(/'/g,"\\'") 增加 .replace(/\\/g,'\\\\'),防止 JS 字符串中 \P 被当作无效转义序列吞掉反斜杠(如 C:\ProgramData\Autodesk 变成 C:ProgramDataAutodesk)修复交互式网页始终显示为"静态模式"(DELETE = null)的根因问题,涉及两个独立 bug。
Bug 1:内联 JSON 赋值导致 JS 解析崩溃
| 因素 | 旧设计 | 新设计 |
|---|---|---|
| ------ | -------- | -------- |
| 数据注入方式 | DATA = {json};(直接赋值) | + JSON.parse() |
| DELETE 与 DATA | 同一个 try/catch 块 | 分离为两个独立 try/catch |
| \u2028/\u2029 | 需手动转义(遗漏则 JS 语法错误) | 不需要(JSON.parse 不经过 JS 语法解析器) |
| 内嵌浏览器兼容 | 大内联 JSON 导致 try 块整体失败 | JSON.parse 在所有浏览器中可靠 |
根因:旧设计把 JSON 直接当作 JS 表达式赋值(DATA = {json};),任何 JSON 合法但 JS 非法的字符(如 U+2028/U+2029)或某些内嵌浏览器对大内联 JSON 的处理差异,都会导致 try 块抛出异常 → catch 块设置 DELETE = null → 页面表现为"静态模式"。由于 DATA 和 DELETE 在同一个 try/catch 中,DATA 的错误连带使 DELETE 失效。
Bug 2:Bash run_in_background 超时杀进程
| 因素 | 旧方式 | 新方式 |
|---|---|---|
| ------ | -------- | -------- |
| 启动命令 | Bash run_in_background | PowerShell Start-Process |
| 进程生命周期 | 绑定到 Bash 会话,2分钟超时被杀 | 完全独立,不受会话超时影响 |
| 端口发现 | 无 | --port-file 写入文件,延迟读取 |
| 打开方式 | preview_url(内嵌浏览器,交互功能不可用) | Start-Process URL(用户默认浏览器) |
改动清单:
| 文件 | 类型 | 项目 | 说明 |
|---|---|---|---|
| ------ | ------ | ------ | ------ |
report_template.html | 重构 | 数据注入方式 | DATA = {json} → + JSON.parse(document.getElementById('__report_data__').textContent) |
report_template.html | 重构 | DELETE 解析 | 与 DATA 分离为独立 try/catch,DATA 失败不影响 DELETE |
report_template.html | 移除 | \u2028/\u2029 转义 | 不再需要(JSON.parse 不经过 JS 语法解析) |
server.py | 新增 | --port 参数 | 可指定固定端口(默认随机) |
server.py | 新增 | --port-file 参数 | 启动后写入 URL 到指定文件,供外部读取端口 |
server.py | 修复 | 线程模型 | daemon 线程 → 主线程 serve_forever + self-test 后台线程 |
server.py | 简化 | 转义逻辑 | 移除 \u2028/\u2029 转义(不再需要),仅保留 转义 |
build_report.py | 简化 | 转义逻辑 | 同上 |
SKILL.md | 更新 | Step 4 | 改用 Start-Process 启动 + 默认浏览器打开 |
共 2 个版本