1仕組みと動作原理
4段階パイプライン:読み取り専用スキャン → agentによるトリアージ分析 → インタラクティブHTMLレポート生成 → 対話内での結論先行サマリー提示。スキャンとレポート生成は分離されており、中間生成物は単一のJSON形式です。
对 macOS 做一次只读存储分析,产出交互式 HTML 报告。流程:扫描 → 分析分级 → 生成网页 → 打开。
スキャナーは完全読み取り専用:df/du/diskutil/stat/ls および os.scandir のみを使用し、ディスクへの書き込みは一切行いません。スクリプトのdocstringとSKILL.mdの鉄則の双方で明記されています。
STRICTLY READ-ONLY: only sizes/lists/reads metadata. Never creates, moves, or deletes anything.
スキャナーはOS(sys.platform)を自動判別し、2通りの対象ディレクトリを処理します。macOSでは home/library/caches/containers/app_support/applications/downloads/dev_caches をスキャンし du でサイズを算出、Windowsでは user_profile/appdata/temp/downloads/program_files をスキャンし os.scandir を使用します。
- **macOS**:扫 home、library、caches、containers、group_containers、app_support、applications、downloads、dev_caches,用 `du` 算大小。 - **Windows**:扫 user_profile、appdata_local、appdata_roaming、temp、downloads、program_files(_x86)、dev_caches,用 `os.scandir` 算大小;`system.disks` 含所有盘符。
トリアージは全棚卸しではなく「クリーンアップ意思決定リスト」です。「削除・対処すべきか」の判断が必要な項目のみを3色シグナルに分類し、通常使用中のアプリケーションやシステムファイルは青色の「システムおよびその他」に分類します。
**三级分类 = 清理决策清单,不是全盘点。** 只把"存在'要不要动它'这个决策"的项放进三灯;日常在用的正常应用、操作系统本身、海量零碎小文件没有清理决策,不进三灯,它们落在磁盘条的蓝色"系统及其他"里。判定标准:
ワンクリック削除はローカルサーバーを利用:server.py が 127.0.0.1 のランダムポートで起動し、セッションごとのランダムトークンを発行。POST /action のリクエスト時のみ実行されます。静的モード(build_report.py)では削除ボタンは明示的に非表示となります。
- Bound to 127.0.0.1 only; every POST requires the session token; Host header
安全モデルは厳格度順の3重ホワイトリスト:rm は緑シグナルの trash_paths のみ、trash は緑および黄シグナルの trash_paths を許可、open はさらに黄シグナルの path と赤シグナルの app_paths を許可。すべて realpath 検証を受け、$HOME 配下であることが必須です。
**安全模型——三套白名单,权限从严到宽**:`rm` 只允许绿灯 `trash_paths`;`trash` 允许绿灯+橙灯 `trash_paths`(橙灯永远不能 rm);`open`(在文件管理器打开,非破坏性)允许上述全部 + 橙灯真实 `path`。所有请求 realpath 校验 + 必须在 $HOME 内 + token + Host 校验,每次点击浏览器先 confirm。
削除は直接の rm ではなくシステム標準のゴミ箱APIを使用:macOS では osascript 経由で Finder に delete させ(失敗時は ~/.Trash への移動にフォールバック)、Windows では SHFileOperationW + FOF_ALLOWUNDO を使用します。
script = 'tell application "Finder" to delete (POSIX file %s as alias)' % json.dumps(path)
黄シグナルはゴミ箱への移動(可逆)のみ許可し、赤シグナルは削除ボタンを一切置かず「ファイルマネージャーで開く」のみを提供します。これは「判断は必要だが手動削除は推奨されない」項目に対する明確な階層付けです。
橙灯只准移废纸篓、可逆,绝不给"直接删除")。App 托管又无安全子路径的(Chrome/微信)只给打开按钮、不给 trash_paths。按钮下方会自动写明注意事项(打开只查看不删、移废纸篓可逆需清空才释放等);如果某项在文件管理器里是 App 内部格式、不方便手动挑选,给它一个 `open_note` 字段做客观说明(会显示在注意事项里)。**口吻要中性、像产品说明**:直接描述"这里是什么结构、为什么不好手动删、想精细操作该去哪",不要写成"我发现/提醒注意/看着像没视频"这种暴露开发者踩坑视角的话。 - 🔴 **谨慎清理(有决策但不建议手删)**:你可能想动、但建议别手删的具体项——重复安装的应用、想卸载的大应用、运行中应用的核心数据等。给"为什么不建议手删" + `indirect_release` 写**具体卸载步骤**(自带卸载器 / 启动台长按 / 右键移废纸篓 / AppCleaner 清残留 / App Store 可重装等,要可照做不是空话)。应用项给 `app_paths`(真实 `.app` 绝对路径数组)→ 网页出现「在文件管理器打开(去卸载)」按钮,定位到 App 让用户自己正规卸载。**红灯不给删除/卸载按钮**
レポートは固定された読書導線を持つインタラクティブHTMLです:ディスク概要(プログレスバー)→ Top 5 → 実行推奨事項 → 3色の折りたたみカード(ワンクリックコマンドコピー付き)→ 長期最適化提案、すなわち「現状 → 診断 → 処方 → 操作 → 予防」の流れで構成されます。
报告阅读流(固定顺序):磁盘总览卡片(容量 + 进度条 + 三色容量 pills + 系统信息,纯数据)→ 占用排行 Top5 → 执行建议 → 🟢🟡🔴 三级可折叠卡片(命令一键复制)→ 长期优化建议。
Windowsサポートは実機未検証であることを誠実に明記し、初回実行時のパス確認、scandirによるサイズ集計、ゴミ箱削除の確認を求めています。複数ドライブレターの走査には対応済みです。
- **Windows**:代码已写(`scan.py` 的 `scan_windows`、`server.py` 的 `_trash_windows` 走 `SHFileOperationW`),但**未在真实 Windows 上实测**。
サードパーティ製依存関係ゼロ:スクリプトはPython 3標準ライブラリのみを使用し、macOS標準の python3/du/diskutil/osascript を活用するため、導入後すぐに動作します。
- 全部脚本是 **Python 3 标准库**,零第三方依赖(不用 pip install)。
2コア機能
4推奨統制措置と判定根拠
- scripts/: ローカルスクリプト・コマンドの実行: scripts/scan.py(読み取り専用スキャン。subprocessで du/df/diskutil 等のシステムコマンドを呼び出し、書き込みは一切行わない)
- 网络端点: 外部ネットワークアクセスの宣言: ローカルループバックのみ: http://127.0.0.1:<ランダムポート>/ でレポートページ配信および POST /action を受付(Hostヘッダーは 127.0.0.1/localhost に限定)
- 本地工作目录: ファイル入出力と成果物出力: /tmp/storage_scan.json(スキャン結果)、ユーザー指定の analysis JSON(agentが出力)、レポートHTML(静的モード時に書き出し)
5二重目の独立検証
- [ok] 扫描器确实只读 — scan.py 只用 os.scandir/os.listdir/du/df/diskutil 等读取与统计;无 open(...,"w")、无 shutil.rmtree/os.remove、无 mkdir;docstring 明写 STRICTLY READ-ONLY。
- [ok] 服务侧白名单构造与文档一致 — load() 中:green.trash_paths → rm/trash/open 三集合;yellow.trash_paths 只进 trash+open;yellow.path(存在时)只进 open;red.app_paths(存在时)只进 open——与 SKILL.md「三套白名单,权限从严到宽」逐条对应。
- [ok] 删除请求的多重校验 — do_POST 依次校验:Host ∈ {127.0.0.1, localhost}、token 相等、mode ∈ {rm,trash,open}、每个 path realpath 后必须在对应白名单、且必须在 HOME 或 /Applications 之下(删除类白名单不含 /Applications)。
- [ok] 回收站删除的实现 — macOS: osascript `tell application "Finder" to delete (POSIX file ...)`,失败回退 shutil.move 到 ~/.Trash;Windows: ctypes 调 SHFileOperationW,fFlags 含 FOF_ALLOWUNDO(进回收站)。
- [ok] 无公网请求 — 全目录 URL 扫描仅命中 http://127.0.0.1:%d/(服务自述地址);无 CDN、无遥测、无第三方 API。
- [ok] 无凭证读取 — API_KEY/token/secret 扫描:唯一 token 变量是 secrets.token_urlsafe(24) 生成的会话 token,非用户凭证;无 env 读取、无 keychain、无配置文件读取。
- [ok] 静态报告确实没有删除能力 — build_report.py 把 __DELETE_CONFIG__ 替换为 "null";模板里的 fetch(DELETE.endpoint, ...) 只有在服务模式下注入 token/endpoint 才可用(SKILL.md 的排障段落也这么说)。
- [ok] 零第三方依赖 — 三个脚本 import 仅 json/os/secrets/shutil/subprocess/sys/time/webbrowser/http.server/re/ctypes;无 requirements/pip 指令。
6結論
b8b3f5bde010e27b…