{"id":23885147,"url":"https://github.com/duckduckstudio/sundry","last_synced_at":"2026-01-31T19:05:40.348Z","repository":{"id":278940726,"uuid":"937194703","full_name":"DuckDuckStudio/Sundry","owner":"DuckDuckStudio","description":"Sundry 是一个 WinGet 相关的工具，帮您更方便地移除清单、修改清单、分析验证错误等","archived":false,"fork":false,"pushed_at":"2026-01-23T08:55:03.000Z","size":23474,"stargazers_count":10,"open_issues_count":28,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-01-24T01:32:34.157Z","etag":null,"topics":["logs-analysis","winget","winget-pkgs"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/DuckDuckStudio.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-02-22T15:05:21.000Z","updated_at":"2026-01-23T08:55:01.000Z","dependencies_parsed_at":"2025-03-13T09:19:34.576Z","dependency_job_id":"dc84c48a-bfbf-4fd5-87c4-63b579f9ae1f","html_url":"https://github.com/DuckDuckStudio/Sundry","commit_stats":null,"previous_names":["duckduckstudio/sundry"],"tags_count":55,"template":false,"template_full_name":null,"purl":"pkg:github/DuckDuckStudio/Sundry","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DuckDuckStudio%2FSundry","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DuckDuckStudio%2FSundry/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DuckDuckStudio%2FSundry/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DuckDuckStudio%2FSundry/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/DuckDuckStudio","download_url":"https://codeload.github.com/DuckDuckStudio/Sundry/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DuckDuckStudio%2FSundry/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28950374,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-31T18:30:42.805Z","status":"ssl_error","status_checked_at":"2026-01-31T18:30:19.593Z","response_time":128,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["logs-analysis","winget","winget-pkgs"],"created_at":"2025-01-04T04:41:00.292Z","updated_at":"2026-01-31T19:05:40.341Z","avatar_url":"https://github.com/DuckDuckStudio.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Sundry\r\n\r\n[![GitHub Releases 最新版本](https://img.shields.io/github/release/DuckDuckStudio/Sundry)](https://github.com/DuckDuckStudio/Sundry/releases/latest) ![GitHub Releases 下载数](https://img.shields.io/github/downloads/DuckDuckStudio/Sundry/total.svg)  \r\n\r\nSundry 是一个 WinGet 相关的工具，帮您更方便地移除清单、修改清单、分析验证错误等。  \r\n\r\n## 如何获取\r\n### Windows\r\n可以前往 [GitHub Release](https://github.com/DuckDuckStudio/Sundry/releases) 页面下载安装程序或 zip/7z 归档。  \r\n或者使用 WinGet 获取:  \r\n```bash\r\nwinget install --id DuckStudio.Sundry --source winget --exact\r\n```\r\n\r\n### Ubuntu\r\n[从源构建](#ubuntu-1)。  \r\n\r\n## 使用说明\r\n当您获取本工具后，请先使用这个命令初始化配置文件:  \r\n\r\n```bash\r\nsundry config init\r\n```\r\n\r\n\u003e 题外话: 这个配置文件就是我将其从我自己的工具变为这里的工具的方法 XD  \r\n\u003e 参见 [配置文件文档](docs/config/) 了解有关配置文件的更多说明。  \r\n\r\n初始化完配置文件后用以下命令确认下:  \r\n\r\n```bash\r\nsundry config show\r\n```\r\n\r\n如果有任何地方不对，请使用这个命令修改对应键的值:  \r\n\r\n```bash\r\nsundry config \"\u003c配置项\u003e\" \"\u003c值\u003e\"\r\n```\r\n\r\n\u003e 如果你想手动编辑配置文件，请运行 `sundry config edit`。  \r\n\r\n## 可用命令\r\n\r\n\u003cdetails\u003e\r\n  \u003csummary\u003e\u003ccode\u003esundry help\u003c/code\u003e\u003c/summary\u003e\r\n\r\n![Sundry help 命令展示图。该命令用于输出 Sundry 帮助信息。](docs/photos/README/Demo/Commands/help.png)  \r\n\r\n- 别名: 任何非命令字符\r\n- 作用: 显示 Sundry 帮助\r\n\r\n\u003c/details\u003e\r\n\r\n\r\n\u003cdetails\u003e\r\n  \u003csummary\u003e\u003ccode\u003esundry ver\u003c/code\u003e\u003c/summary\u003e\r\n\r\n![Sundry ver 命令展示图。该命令用于输出 Sundry 的版本和安装位置。](docs/photos/README/Demo/Commands/ver.png)  \r\n\r\n- 别名: `ver`, `版本`, `version`, `Version`, `--version`, `--ver`, `-v`\r\n- 作用: 显示 Sundry 版本和安装位置\r\n\r\n\u003c/details\u003e\r\n\r\n\r\n\u003cdetails\u003e\r\n  \u003csummary\u003e\u003ccode\u003esundry remove\u003c/code\u003e\u003c/summary\u003e\r\n\r\n![Sundry remove 命令展示图。该命令用于从上游仓库（microsoft/winget-pkgs）中移除一个指定的包的指定版本，并带上理由（如果有）后自动创建拉取请求。](docs/photos/README/Demo/Commands/remove.png)  \r\n\r\n\u003e 截图来自拉取请求: https://github.com/microsoft/winget-pkgs/pull/265074  \r\n\r\n- 别名: `移除`, `remove`\r\n- 作用: **移除一个指定的包的指定版本**，并在移除前自动检查该版本是否确实存在问题。可以指定理由或跳过自动检查。**默认理由为“安装程序URL在GitHub Action上返回了404”。**\r\n- 用法: `sundry remove \u003c包标识符\u003e \u003c包版本\u003e [是否跳过自动检查] [理由]`\r\n- 示例:\r\n  - 基本: `sundry remove DuckStudio.FufuTools 1.3.10`\r\n  - 跳过自动检查: `sundry remove DuckStudio.FufuTools 1.3.10 True`\r\n  - 指定理由: `sundry remove DuckStudio.FufuTools 1.3.10 \"该版本存在一个已知问题\"`\r\n  - 指定理由的同时跳过自动检查: `sundry remove DuckStudio.FufuTools 1.3.10 True \"该版本存在一个已知问题\"`\r\n\r\n\u003c/details\u003e\r\n\r\n\r\n\u003cdetails\u003e\r\n  \u003csummary\u003e\u003ccode\u003esundry autoremove\u003c/code\u003e\u003c/summary\u003e\r\n\r\n![Sundry autoremove 命令展示图。该命令用于自动检查并移除指定包标识符下的失效版本。](docs/photos/README/Demo/Commands/autoremove.png)  \r\n\r\n- 别名: `自动移除`, `autoremove`\r\n- 作用: 自动检查并移除指定包标识符下的失效版本。\r\n- 用法: `sundry autoremove \u003c包标识符\u003e [是否跳过检查]`\r\n- 示例:\r\n  - 基本: `sundry autoremove DuckStudio.Sundry`\r\n  - 跳过检查 (直接移除整个包): `sundry autoremove DuckStudio.Sundry skip`\r\n\r\n\u003c/details\u003e\r\n\r\n\r\n\u003cdetails\u003e\r\n  \u003csummary\u003e\u003ccode\u003esundry modify\u003c/code\u003e\u003c/summary\u003e\r\n\r\n![Sundry modify 命令展示图。该命令用于帮助用户打开需要修改的那个包的那个版本，并在修改完毕后自动向上游仓库（microsoft/winget-pkgs）提交拉取请求。](docs/photos/README/Demo/Commands/modify.png)  \r\n\r\n- 别名: `单改`, `单修改`, `modify`\r\n- 作用: **修改一个指定的包的指定版本的清单**，并在修改完后自动提交拉取请求。\r\n- 用法: `sundry modify \u003c包标识符\u003e \u003c版本\u003e [理由/解决的议题]`\r\n- 示例:\r\n  - 基本: `sundry modify XBMCFoundation.Kodi 18.2.0.0 ` (https://github.com/microsoft/winget-pkgs/pull/267613)\r\n  - 指定理由: `sundry modify XBMCFoundation.Kodi 18.3.0.0 \"替换 HTTP 为 HTTPS\"` (https://github.com/microsoft/winget-pkgs/pull/267614)\r\n  - 链接议题: `sundry modify DuckStudio.Sundry 1.2.6 \"https://github.com/microsoft/winget-pkgs/issues/267539\"`\r\n  - 指定理由的同时链接议题: \r\n    ```pwsh\r\n    sundry modify DuckStudio.Sundry 1.2.6 \"一些修改。\r\n    - Resolves https://github.com/microsoft/winget-pkgs/issues/267539\"\r\n    ```\r\n    \u003e GitHub Docs: [使用关键词将拉取请求链接到议题](https://docs.github.com/zh/issues/tracking-your-work-with-issues/using-issues/linking-a-pull-request-to-an-issue#linking-a-pull-request-to-an-issue-using-a-keyword)  \r\n\r\n\u003c/details\u003e\r\n\r\n\r\n\u003cdetails\u003e\r\n  \u003csummary\u003e\u003ccode\u003esundry logs-analyse\u003c/code\u003e\u003c/summary\u003e\r\n\r\n![Sundry logs-analyse 命令展示图。该命令用于分析 Azure Validation Pipeline Run 失败时的日志，自动查找具体哪里失败了。](docs/photos/README/Demo/Commands/logs-analyse.png)  \r\n\r\n- 别名: `日志分析`, `logs-analyse`, `logs_analyse`, `Azure日志分析`\r\n- 作用: **分析 [Azure Validation Pipeline Run](https://duckduckstudio.github.io/Articles/#/信息速查/终端/WinGet/参考信息?id=验证管道日志在哪看？) 失败时的日志，自动查找具体哪里失败了。**\r\n- 用法: `sundry logs-analyse \u003cAzure Pipeline Url\u003e [是否保留日志文件] [是否显示一般信息]`\r\n- 示例:\r\n  \u003e 这里的 Azure Validation Pipeline Run 是 https://github.com/microsoft/winget-pkgs/pull/295511#issuecomment-3315258870 的。\r\n  - 基本: `sundry logs-analyse \"https://dev.azure.com/shine-oss/8b78618a-7973-49d8-9174-4360829d979b/_build/results?buildId=183216\"` (需要用户输入)\r\n  - 不保留日志文件: `sundry logs-analyse \"https://dev.azure.com/shine-oss/8b78618a-7973-49d8-9174-4360829d979b/_build/results?buildId=183216\" n`\r\n  - 保留日志文件: `sundry logs-analyse \"https://dev.azure.com/shine-oss/8b78618a-7973-49d8-9174-4360829d979b/_build/results?buildId=183216\" y` (运行后将打开日志文件所在目录)\r\n  - 不显示一般信息: 默认，不需要传递额外参数。\r\n  - 显示一般信息: `sundry logs-analyse \"https://dev.azure.com/shine-oss/8b78618a-7973-49d8-9174-4360829d979b/_build/results?buildId=183216\" 占位 y`\r\n  - 保留日志文件且不显示一般信息: 默认不显示一般信息，同保留日志文件的示例。\r\n  - 保留日志文件且显示一般信息: `sundry logs-analyse \"https://dev.azure.com/shine-oss/8b78618a-7973-49d8-9174-4360829d979b/_build/results?buildId=183216\" y y`\r\n\r\n\u003e 下载日志文件时响应 404 意味着什么？\r\n\r\n1. 验证管道没有上传日志。\r\n2. 此次运行的日志已被删除。  \r\n  如果这是一个较早的运行，日志可能已经被项目配置自动清理掉了。\r\n\r\nSundry 会尝试分析下载成功的日志，跳过下载失败的日志。  \r\n\r\n\u003e 分析结果前面的标识是什么意思？\r\n\r\n| 标识 | 是什么 | 什么时候应该看 |\r\n|-----|-----|-----|\r\n| Screenshot | 验证管道提供的错误截图 | Validation-Unattended-Failed |\r\n| Analysis | 一般日志信息 | Validation-Installation-Error、Validation-Shell-Execute 等安装过程中遇到的问题 |\r\n| ExeRunInfo | 验证管道的工件 `ValidationResult.zip` 中的 `InstallationVerification_Result.json` 中有关可执行文件运行的信息 | Validation-Executable-Error |\r\n\r\n\u003e 日志分析结果 (Analysis) 的颜色代表什么？\r\n\r\n| 颜色 | 啥意思 |\r\n|-----|-----|\r\n| 黄色 | 很大可能是你的 PR 遇到的问题 |\r\n| 红色 | 一些其他可能的问题 |\r\n| 默认颜色 | 一般信息，默认不显示 |\r\n\r\n\u003e [!WARNING]  \r\n\u003e `sundry logs-analyse cleanup` 已被 `sundry cleanup logs-analyse` 取代，前者计划在未来的 Sundry 中移除。  \r\n\r\n\u003c/details\u003e\r\n\r\n\u003cdetails\u003e\r\n  \u003csummary\u003e\u003ccode\u003esundry verify\u003c/code\u003e\u003c/summary\u003e\r\n\r\n![Sundry verify 命令展示图。该命令用于测试本地或 PR 上的清单的安装和卸载，并获取注册表变更。](docs/photos/README/Demo/Commands/verify.png)  \r\n\r\n\u003e 截图是在 Hyper-V Windows 10 x64 虚拟机上的测试。  \r\n\u003e 虽然他们已经换成了 Windows 11 虚拟机，不过我觉得也没啥差别，Sundry 也可以在 Windows 11 虚拟机上使用。  \r\n\r\n- 别名: `verify`, `验证`\r\n- 作用: **用于测试本地或 PR 上的清单的安装和卸载，并获取 ARP 条目变更。**\r\n- 用法:\r\n  - 本地仓库清单: `sundry verify \u003c包标识符\u003e \u003c包版本\u003e`\r\n  - 指定清单文件夹: `sundry verify \u003c清单文件夹路径\u003e`\r\n  - PR 清单: `sundry verify \u003cPR链接\u003e`\r\n- 示例:\r\n  - 测试本地仓库清单: `sundry verify DuckStudio.FufuTools 1.3.10`\r\n  - 测试指定清单文件夹: `sundry verify D:/WinGet/Manifests/d/DuckStudio/FufuTools/1.3.10/`\r\n  - 测试 PR 清单: `sundry verify \u003cPR链接\u003e`\r\n\r\n\u003e [!NOTE]\r\n\u003e 1. **它只能获取 HEAD 分支没被删除的 PR 的清单**，如果 HEAD 分支被删除了，GitHub API 会响应 404 Not Found。  \r\n\u003e 2. 它暂时**无法获取 `UpgradeCode`**。  \r\n\r\n\u003c/details\u003e\r\n\r\n\u003cdetails\u003e\r\n  \u003csummary\u003e\u003ccode\u003esundry ignore\u003c/code\u003e\u003c/summary\u003e\r\n\r\n![Sundry ignore 命令展示图。该命令用于管理 winget-tools 中的检测脚本的忽略字段。](docs/photos/README/Demo/Commands/ignore.png)  \r\n\r\n- 别名: `忽略`, `检查忽略`, `ignore`\r\n- 作用: **管理 [winget-tools](https://github.com/DuckDuckStudio/winget-tools/) 中的检测脚本的忽略字段。**\r\n- 用法: `sundry ignore \u003cadd/remove/edit/list\u003e [忽略字段] [理由]`\r\n- 示例:\r\n  - 添加忽略字段: `sundry ignore add \"https://www.argyllcms.com/\" \"服务器冲不动咖啡 (418)\"`\r\n  - 移除忽略字段: `sundry ignore remove \"https://www.argyllcms.com/\" \"又冲得动了\"`\r\n  - 编辑忽略字段: `sundry ignore edit`\r\n  - 列出所有忽略字段: `sundry ignore list`\r\n\r\n\u003e [!WARNING]  \r\n\u003e 该命令计划在未来的 Sundry 中移除。  \r\n\r\n\u003c/details\u003e\r\n\r\n\r\n\u003cdetails\u003e\r\n  \u003csummary\u003e\u003ccode\u003esundry cat\u003c/code\u003e\u003c/summary\u003e\r\n\r\n![Sundry cat 命令展示图。该命令用于获取指定包标识符的指定版本的清单，可以指定获取所有清单或某个类型的清单。](docs/photos/README/Demo/Commands/cat.png)  \r\n\r\n- 别名: 没有别名，只能用 `cat`。\r\n- 作用: **获取指定包标识符的指定版本的清单**，可以指定获取所有清单或某个类型的清单。\r\n- 用法: `sundry cat \u003c包标识符\u003e \u003c版本\u003e [清单类型] [区域设置(如果是locale类型)]`\r\n- 示例:\r\n  - 获取所有清单: `sundry cat DuckStudio.Sundry 1.2.3`\r\n    - 亦可使用 `sundry cat DuckStudio.Sundry 1.2.3 all`\r\n    - 除 `all` 外还可用 `全部`, `所有`\r\n  - 获取指定类型的清单:\r\n    - 安装程序清单: `sundry cat DuckStudio.Sundry 1.2.3 i`\r\n      - 可以用 `installer`, `安装程序`, `安装`, `i`\r\n    - 区域清单: `sundry cat DuckStudio.Sundry 1.2.3 l zh-CN`\r\n      - 可以用 `locale`, `区域`, `区域设置`, `l`\r\n      - 必须指定具体哪个区域设置的清单\r\n    - 版本清单: `sundry cat DuckStudio.Sundry 1.2.3 v`\r\n      - 可以用 `version`, `ver`, `v`, `版本`\r\n\r\n\u003c/details\u003e\r\n\r\n\r\n\u003cdetails\u003e\r\n  \u003csummary\u003e\u003ccode\u003esundry prune\u003c/code\u003e\u003c/summary\u003e\r\n\r\n![Sundry prune 命令展示图。该命令用于清理仓库远程已删除的分支。](docs/photos/README/Demo/Commands/prune.png)  \r\n\r\n- 别名: 没有别名，只能用 `prune`。\r\n- 作用: **清理仓库远程已删除的分支。**\r\n  - 等效于:  \r\n    ```bash\r\n    cd $winget_pkgs\r\n    git remote prune origin\r\n    cd $winget_tools\r\n    git remote prune origin\r\n    ```\r\n- 用法: `sundry prune`\r\n- 示例: `sundry prune`\r\n\r\n\u003c/details\u003e\r\n\r\n\r\n\u003cdetails\u003e\r\n  \u003csummary\u003e\u003ccode\u003esundry sync\u003c/code\u003e\u003c/summary\u003e\r\n\r\n![Sundry sync 命令展示图。该命令用于同步 fork 仓库和上游仓库的修改。](docs/photos/README/Demo/Commands/sync.png)  \r\n\r\n- 别名: `sync`, `同步`, `synchronize`, `sync-fork`\r\n- 作用: **同步 fork 仓库和上游仓库的修改。**\r\n- 用法: `sundry sync`\r\n- 示例: `sundry sync`\r\n\r\n\u003c/details\u003e\r\n\r\n\r\n\u003cdetails\u003e\r\n  \u003csummary\u003e\u003ccode\u003esundry repr\u003c/code\u003e\u003c/summary\u003e\r\n\r\n![Sundry repr 命令展示图。该命令用于显示字符串的真面目，就像\\n那种。](docs/photos/README/Demo/Commands/repr.png)  \r\n\r\n- 别名: 没有别名，只能用 `repr`。\r\n- 作用: 等效于 Python 的 `repr()`，用于获取字符串真实的样子。\r\n- 用法: `sundry repr \u003c文件路径/文本内容\u003e [编码(默认 UTF-8)]`\r\n- 示例:\r\n  - 文本:\r\n    ```pwsh\r\n    sundry repr \"第一行\r\n    第二行\"\r\n    ```\r\n  - 文件: `sundry repr \"D:/文件路径/文件.txt\"`\r\n  - 指定编码: `sundry repr \"D:/文件路径/文件.txt\" \"gbk\"`\r\n\r\n\u003c/details\u003e\r\n\r\n\r\n\u003cdetails\u003e\r\n  \u003csummary\u003e\u003ccode\u003esundry config\u003c/code\u003e\u003c/summary\u003e\r\n\r\n![Sundry config 命令展示图。该命令用于管理 Sundry 配置。](docs/photos/README/Demo/Commands/config.png)  \r\n\r\n- 别名: `config`, `配置`\r\n- 作用: 管理 Sundry 配置。\r\n- 用法: `sundry config \u003c参数...\u003e`\r\n- 示例:\r\n  - 初始化配置文件: `sundry config init`\r\n  - 显示当前配置: `sundry config show`\r\n  - 编辑配置文件: `sundry config edit`\r\n  - 修改配置项: `sundry config git.signature false`\r\n  - 更新配置文件: `sundry config update` (当然你直接重新 `init` 一份也可以)\r\n\r\n\u003e 有关配置文件的更多信息，请参阅[配置文件文档](docs/config/README.md)。\r\n\r\n\u003c/details\u003e\r\n\r\n\r\n\u003cdetails\u003e\r\n  \u003csummary\u003e\u003ccode\u003esundry revert\u003c/code\u003e\u003c/summary\u003e\r\n\r\n![Sundry revert 命令展示图。该命令用于还原本地仓库的修改，如果 Sundry 在修改的某个过程中崩溃了，则可以使用此命令还原 Sundry 做的修改。](docs/photos/README/Demo/Commands/revert.png)  \r\n\r\n- 别名: `还原`, `revert`\r\n- 作用: **还原本地仓库的修改**，如果 Sundry 在修改的某个过程中崩溃了，则可以使用此命令还原 Sundry 做的修改。\r\n- 用法: `sundry revert \u003c仓库\u003e \u003c是否已提交\u003e \u003c是否丢弃\u003e`\r\n- 示例:\r\n  - 还原所有仓库、未提交、丢弃: `sundry revert all n y`\r\n  - 还原 winget-pkgs 仓库、已提交、丢弃: `sundry revert pkgs y y`\r\n  - 还原 winget-tools 仓库、未提交、保留: `sundry revert tools n n`\r\n\r\n\u003c/details\u003e\r\n\r\n\r\n\u003cdetails\u003e\r\n  \u003csummary\u003e\u003ccode\u003esundry fun\u003c/code\u003e\u003c/summary\u003e\r\n\r\n![Sundry fun 命令展示图。该命令用于管理 Sundry 的 fun.txt](docs/photos/README/Demo/Commands/fun.png)  \r\n\r\n- 别名: 没有别名，只能用 `fun`。\r\n- 作用: **管理 Sundry 的 `fun.txt`。**\r\n- 用法: `sundry fun \u003crandom/list/edit/add/remove/import\u003e [参数...]`\r\n- 示例:\r\n  - 随机一个: `sundry fun` 或 `sundry fun random`\r\n    - 还可以使用 `sundry fun 随机`\r\n  - 列出所有: `sundry fun list`\r\n    - 可以用 `获取`, `读取`, `get`, `list`\r\n  - 编辑 fun.txt: `sundry fun edit`\r\n    - 可以用 `编辑`, `edit`, `打开`, `open`\r\n  - 添加新的: `sundry fun add \"提问: 罗浮六御中谁最幸福? 答案: 符玄。因为她姓符。\"`\r\n    - 可以用 `add`, `添加`\r\n  - 移除原来的: `sundry fun remove \"Ciallo～(∠・ω\u003c )⌒☆\"`\r\n    - 可以用 `remove`, `移除`\r\n  - 从其他文件导入(覆盖): `sundry import \"D:/文件路径/另一个fun.txt\"`\r\n    - 可以用 `import`, `导入`\r\n\r\n\u003c/details\u003e\r\n\r\n\r\n\u003cdetails\u003e\r\n  \u003csummary\u003e\u003ccode\u003esundry cleanup\u003c/code\u003e\u003c/summary\u003e\r\n\r\n![Sundry cleanup 命令展示图。该命令用于清理 Sundry 的各个工具运行时产生的文件。](docs/photos/README/Demo/Commands/cleanup.png)  \r\n\r\n- 别名: `清理`, `cleanup`, `clean`\r\n- 作用: **清理 Sundry 的各个工具运行时产生的文件。**\r\n- 用法: `sundry cleanup \u003c工具名\u003e`\r\n  - 除了工具名外，您还可以使用 `all` / `aec` 这些特殊标识来清理某部分的文件。有关这些特殊标识的说明请见下方的示例。\r\n- 示例:\r\n  - 清理所有: `sundry cleanup all`\r\n  - 清理除缓存外所有: `sundry cleanup` (等效于 `sundry cleanup aec`)\r\n  - 清理指定工具: `sundry cleanup logs-analyse`\r\n\r\n\u003c/details\u003e\r\n\r\n### Ubuntu 支持\r\n\r\n| 命令 | 是否支持 | 备注 |\r\n|-----|-----|-----|\r\n| help | ✓ |  |\r\n| ver | ✓ |  |\r\n| remove | ✕ | 验证阶段需要 WinGet，不确定如何读取 Token |\r\n| autoremove | ✕ | 验证阶段需要 WinGet，移除版本依赖 remove 命令 |\r\n| modify | ✕ | 验证清单需要 WinGet，不确定如何读取 Token |\r\n| logs-analyse | 部分支持 | 不支持自动打开日志文件夹 |\r\n| verify | ✕ | 您只能在 Windows 上验证包 |\r\n| ignore | ✕ | 不确定如何读取 Token |\r\n| cat | ✓ |  |\r\n| sync | ✓ |  |\r\n| prune | ✓ |  |\r\n| repr | ✓ |  |\r\n| config | ✓ |  |\r\n| revert | ✓ |  |\r\n| fun | ✓ |  |\r\n| cleanup | ✓ |  |\r\n\r\n## 自己构建\r\n### Windows\r\n\r\n\u003e [!TIP]\r\n\u003e 仓库下有一个适用于 Windows 的[构建流](https://github.com/DuckDuckStudio/Sundry/blob/main/.github/workflows/build.yaml)，你可以 fork 后直接运行，它会将结果上传为工件。  \r\n\r\n1. 克隆后 `cd` 到项目所在目录\r\n2. 更新代码中的版本号\r\n```pwsh\r\npython \"自动化脚本/修改版本号.py\" \"2025.520.1314\"\r\n```\r\n3. 安装依赖\r\n```pwsh\r\npython -m venv .venv\r\n\u0026 \".venv\\Scripts\\Activate.ps1\"\r\npython.exe -m pip install --upgrade pip\r\npip install -r \"requirements.txt\"\r\n```\r\n4. 转换图标格式 (可选)\r\n```pwsh\r\npython \"自动化脚本/png-2-ico.py\"\r\n```\r\n5. 构建\r\n```pwsh\r\npyinstaller --onefile --distpath=\"Release\" --name=\"sundry.exe\" \"src/sundry.py\" --icon \"icon/Sundry.ico\"\r\n# 如果前面没转换图标格式，参数中的图标请用 icon/Sundry.png，Pyinstaller 会尝试自己转换格式。\r\n```\r\n6. 复制所需文件\r\n```pwsh\r\nCopy-Item -Path \"src/fun.txt\" -Destination \"Release\" -Verbose\r\nCopy-Item -Path \"LICENSE\" -Destination \"Release\" -Verbose\r\n```\r\n7. `Release` 下就是构建结果\r\n\r\n### Ubuntu\r\n```bash\r\nset -e\r\necho \"克隆源码...\"\r\ngit clone https://github.com/DuckDuckStudio/Sundry.git\r\ncd Sundry\r\necho \"创建虚拟环境并安装依赖...\"\r\npython3 -m venv .venv\r\nsource .venv/bin/activate\r\npip install -r \"requirements.txt\"\r\necho \"构建二进制文件...\"\r\npython3 \"自动化脚本/修改版本号.py\" \"2025.520.1314\"\r\npyinstaller --onefile --distpath=\"Release\" --name=\"sundry\" \"src/sundry.py\"\r\ndeactivate\r\ncp -v \"src/fun.txt\" \"Release\"\r\ncp -v \"LICENSE\" \"Release\"\r\necho \"整理文件...\"\r\ncd ..\r\ncp -rv \"Sundry/Release\" \"./Release\"\r\nrm -rvf Sundry\r\ncd Release\r\necho \"配置 Sundry...\"\r\n./sundry ver\r\n./sundry config init\r\n```\r\n\r\n然后 `./Release` 下就是构建结果。  \r\n\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fduckduckstudio%2Fsundry","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fduckduckstudio%2Fsundry","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fduckduckstudio%2Fsundry/lists"}