Просмотр исходного кода

优化用于gpt6的agents文件

HerobrineXia 1 месяц назад
Родитель
Сommit
3ed3a98bc3
5 измененных файлов с 108 добавлено и 211 удалено
  1. 58 88
      .agents/Shared/架构分析.md
  2. 10 37
      .agents/Tests/架构分析.md
  3. 13 46
      .agents/Wpf/架构分析.md
  4. 15 29
      .agents/仓库指示.md
  5. 12 11
      AGENTS.md

+ 58 - 88
.agents/Shared/架构分析.md

@@ -1,88 +1,58 @@
-# MeloongCore 项目架构
-
-[返回 MeloongCore 仓库指示](../仓库指示.md)
-
-## 1. 项目定位
-
-`MeloongCore/Shared/MeloongCore.csproj` 是通用 C# 基础库,目标框架为 .NET Standard 2.0,使用 C# 13、Nullable、Implicit Usings 和 PolySharp。
-
-它属于独立 Git 仓库,不应依赖具体上层应用或 WPF。其目标是为 Windows、macOS 及不同上层应用提供一致的基础能力。
-
-## 2. 目录结构
-
-```text
-MeloongCore/Shared/
-├─ Main.cs                  # 库初始化与应用名
-├─ Extensions/             # 集合、字符串、异常、任务和网络扩展
-├─ General/
-│  ├─ Config.cs            # JSON 配置抽象
-│  ├─ Logger.cs            # 日志抽象
-│  ├─ Progress.cs          # 进度模型
-│  ├─ Worker/              # 限流与可重做 Worker
-│  └─ 其他通用数据结构
-└─ Utils/                  # 文件、目录、路径、任务、网络、加密等工具
-```
-
-## 3. 主要能力
-
-### 3.1 文件与路径
-
-`FileUtils`、`DirectoryUtils` 和 `PathUtils` 封装文件读写、压缩包、目录遍历、路径标准化和父子关系判断,供不同上层应用复用。
-
-### 3.2 异步与 Worker
-
-- `TaskUtils` 提供程序执行、并发遍历、聚合等待等通用任务能力;
-- `ProgressProvider` 支持切分与聚合子进度;
-- `RateLimitedWorker` 合并或限制高频调用;
-- `RedoableWorker` 管理可重做的异步工作。
-
-上层应用可以按需使用这些抽象组织异步任务与进度。
-
-### 3.3 配置
-
-`IConfigProvider` 定义读、写、删除、缓存丢弃等能力。默认 `JsonConfigProvider`:
-
-- 从 JSON 文件惰性读取;
-- 缓存反序列化后的值;
-- 通过 Worker 延迟 500 ms 合并写盘;
-- 使用 `ConfigEntry<T>` 提供固定 provider 的强类型配置;
-- 使用 `DynamicConfigEntry<T>` 支持运行时选择 provider。
-
-默认配置位于应用数据目录的 `config.json`,敏感配置 provider 指向 `secret.json`。加密写入目前仍有未实现分支,使用前需要核对现状。
-
-### 3.4 日志与通用类型
-
-库提供可替换的 Logger、并发列表、OneOf、值范围、数学和字符串工具等。上层应用可以替换 Logger 实例,将底层日志接入自身日志系统。
-
-## 4. 依赖
-
-- `Microsoft.Win32.Registry`:跨目标框架暴露注册表能力;
-- `Newtonsoft.Json`:配置与 JSON 工具;
-- `ThrottleDebounce`:限流/防抖基础;
-- `PolySharp`:为旧运行目标补足现代 C# 编译支持。
-
-## 5. 架构边界
-
-适合放入 MeloongCore 的代码应满足:
-
-- 不依赖具体上层应用的页面、全局状态或业务领域;
-- 不直接依赖 WPF 类型;
-- API 对其他 .NET 应用也有合理含义;
-- Windows 专属能力被清楚隔离,不阻塞 macOS 使用通用部分。
-
-WPF 特有实现应进入 `MeloongCore.Wpf`,上层应用特有实现应保留在对应应用仓库中。
-
-## 6. 优势与风险
-
-优势:
-
-- 目标框架和依赖方向支持跨项目复用;
-- 工具与配置已有对应测试;
-- 现代 C# API 提高了新代码的类型安全和可读性。
-
-风险:
-
-- 通用工具类较多,新增 API 时容易形成重复或过宽的职责;
-- 注册表等 Windows 能力出现在 Shared 中,需要保持调用层面的平台防护;
-- `JsonConfigProvider` 加密写入尚未实现完整;
-- 作为公共依赖修改时,需要考虑已有引用方的兼容性和独立发布节奏。
+# Shared 复用指南
+
+[代码约定](../仓库指示.md) · [Wpf](../Wpf/架构分析.md) · [Tests](../Tests/架构分析.md)
+
+## 按功能定位
+
+| 场景 | 源码入口 |
+| --- | --- |
+| 初始化、应用目录 | [Main.cs](../../Shared/Main.cs)、[PathUtils.cs](../../Shared/Utils/PathUtils.cs) |
+| 强类型键、JSON 配置 | [Config.cs](../../Shared/General/Config.cs) |
+| 日志接入 | [Logger.cs](../../Shared/General/Logger.cs) |
+| 分阶段进度 | [Progress.cs](../../Shared/General/Progress.cs) |
+| 节流、防抖、取消后重跑 | [Worker](../../Shared/General/Worker) |
+| 异步并发、进程执行 | [TaskUtils.cs](../../Shared/Utils/TaskUtils.cs) |
+| 并发列表、联合值、范围 | [ConcurrentList.cs](../../Shared/General/ConcurrentList.cs)、[OneOf.cs](../../Shared/General/OneOf.cs)、[ValueRange.cs](../../Shared/General/ValueRange.cs) |
+| 集合、字符串、异常、Task、HTTP 克隆扩展 | [Extensions](../../Shared/Extensions) |
+| 文件、目录、路径、压缩、校验 | [FileUtils.cs](../../Shared/Utils/FileUtils.cs)、[DirectoryUtils.cs](../../Shared/Utils/DirectoryUtils.cs)、[PathUtils.cs](../../Shared/Utils/PathUtils.cs) |
+| 格式化、数学、枚举、类型、加密 | [Utils](../../Shared/Utils) |
+| 注册表、Windows 增量补丁 | [RegistryUtils.cs](../../Shared/Utils/RegistryUtils.cs)、[MsDelta.cs](../../Shared/General/MsDelta.cs) |
+
+扩展方法主要位于 `MeloongCore.Extensions`,MathUtils、EnumUtils 的扩展位于 `MeloongCore`;项目全局 using 不传播到引用方。新框架同名方法可能改变重载绑定,替换前核对语义。注册表和 MsDelta 是 Windows 专属,Shared 的目标框架不代表所有入口均可跨平台使用。
+
+以下保留不易从名称判断的行为;具体重载和实现以链接源码为准。
+
+## 初始化、配置与日志
+
+- 首次访问默认配置前调用 `Main.Init(appName)`;它设置应用名和默认正则超时,不初始化 WPF 或文件日志。默认 provider 静态初始化后,修改应用名不会迁移其路径。
+- `ConfigEntry<T>` 绑定固定 provider,`DynamicConfigEntry<T>` 每次操作传 provider。替换 `ConfigProviders.Default` 不改变已有 entry 的绑定。
+- `ConfigProviders.Secret` 位于 `Paths.AppData/secret.json`,没有应用名子目录,也不自动加密。当前非 null 加密写入会先修改缓存再抛 `NotImplementedException`。
+- 同一 provider 的同一键固定使用同一类型;显式 JSON null 算已存值。Get 返回对象缓存,修改对象后需 Edit/Set 才安排保存;Edit 不是原子更新。
+- Set 即使值相同也触发 Changed;动态 entry 的 Changed 不携带 provider。PreviewGet 仅修正本次读取,不自动写回。
+- JSON 写入防抖 500 ms;明确落盘点可用 `ConfigUtils.SaveAll()`。DiscardCache 不保存变更;Save 写盘失败不保证恢复 dirty。整文件加载失败回退空对象,不代表所有键读取错误都会回退默认值。
+- `Logger.Instance` 可替换;基类不实现 LogBehavior 所表达的 UI 动作。BaseLogger 构造时启动后台线程并调用虚方法 Init;Output 通常在日志线程,HandleBehavior 在调用线程。
+- FileLogger 创建后修改路径字段可能晚于初始化;退出时先 Flush 再 Dispose,但尚未就绪时 Flush 会返回,Dispose 不保证排空或等待线程。
+
+## 进度与后台任务
+
+- ProgressProvider 用 SplitBy/SplitTo 分阶段;Reset 不清除单调观测历史,全新任务需要新 provider。Finish/Skip 可结算子项,IsFinished 不代表业务成功。
+- ProgressObserver 订阅并节流 GetIncreasing,构造时不立即刷新,结束时 Dispose;回调不保证 UI 线程。
+- RateLimitedWorker 的 ImmediateThenMerge 为节流,ImmediateThenIgnore 忽略密集后续请求,WaitUnillNoNewInvoke 为尾随防抖。复用同一实例;Dispose 不补执行最后一次。
+- RedoableWorker 在运行中 Start 会请求取消旧负载并合并重跑,负载必须协作取消。WaitIfRunning* 只等待空闲,不重抛负载错误,也不保证事件回调已结束。
+- RedoableWorker 的 HasSucceeded/LastResult 可保留历史成功,判断最近运行用 LastSucceeded;事件在工作线程。Worker 接受同步委托,不等待 async lambda 内的异步工作。
+- TaskUtils.WhenAll 聚合进度但不限并发;ForEach 是同步并行,异步限并发用 ForEachAsync。后者失败会停止领取新项,但内部取消令牌不传入 body,在途动作需自行响应外部令牌。
+- RunProgramAsync 返回 Output/ExitCode,非零退出码不自动抛错;输出按 stdout + stderr 拼接。取消/超时不保证终止子进程树;参数会写日志,不应包含密钥。
+
+## 数据结构与扩展语义
+
+- ConcurrentList 单次操作加锁,复合操作需共用 SyncRoot;枚举及与 List 的转换都复制列表,元素仍共享引用。
+- OneOf 的 default 没有有效分支;Is<T> 按声明类型精确匹配,取错分支会抛错。
+- ValueRange.Intersect 无交集仍返回范围,应检查 IsEmpty;IsEmpty 不识别离散域空区间。范围可变,不应修改已作为字典键的实例。
+- EnumerableExtensions 的并行 DistinctBy 不保证首项,重复枚举沿用已见键;MaxBy/MinBy 空输入返回 default;二维数组 ToDictionary 重复键以后者覆盖。
+- RemoveIf/KeepIf 原地修改;RemoveAll 对每项仅移除一次;Except(单值) 还会去重;ForAll 立即顺序枚举且不等待 async lambda。
+- 字符串 Before/After 系列未找到分隔符时保留原文;Between 从最后一个起始分隔符之后截取,不做括号配对。Split 去空模式对空串返回空数组,SplitLines 不修剪行内空白。
+- RegexSearch 的惰性枚举仍可能抛超时;RegexSeek/RegexCheck 捕获失败,而 RegexReplace 直接抛错。
+- ReadString 不关闭输入流;默认 GetString 尝试 BOM、严格 UTF-8,再回退 GB18030。DeserializeJson<T> 用于 JToken 子类,解析错误可能包含原文。
+- ExceptionExtensions.IsCanceled 对混有其他错误的聚合也可返回 true;RootException 只沿单条 InnerException,Flatten 扩展与 AggregateException 同名实例方法含义不同。ThrowIfCanceled 不保证保留原堆栈;IsBadNetwork 可能把主动取消判为网络不佳。
+- TaskExtensions.Run 同步阻塞;NoCapture 仅为 ConfigureAwait(false),不保证切到后台线程。
+- HTTP CloneAsync 缓冲复制全部内容,Properties 中的对象仍共享;无取消令牌重载。WebUtils.cs 定义 HttpRequestCodeException,未提供自动发送或失败状态检查。

+ 10 - 37
.agents/Tests/架构分析.md

@@ -1,43 +1,16 @@
-# MeloongCore.Tests 项目架构
+# Tests 定位与环境
 
-[返回 MeloongCore 仓库指示](../仓库指示.md)
+[代码约定](../仓库指示.md) · [WPF 构建要求](../Wpf/架构分析.md)
 
-## 1. 项目定位
+Tests 是 TUnit 可执行测试项目,引用 Shared 与 Wpf,运行目标为 .NET Framework 4.8;其运行结果不能证明 macOS 兼容性。运行机制和资源复制配置见 [项目文件](../../Tests/MeloongCore.Tests.csproj)。
 
-`MeloongCore/Tests/MeloongCore.Tests.csproj` 是基于 TUnit 的 .NET Framework 4.8 测试程序,同时引用 `MeloongCore` 与 `MeloongCore.Wpf`。
-
-它主要保护通用基础库,不覆盖引用本库的上层应用业务。
-
-## 2. 测试范围
-
-| 测试文件 | 覆盖能力 |
+| 修改能力 | 对应测试目录或文件(相对于 Tests/) |
 | --- | --- |
-| `General/ConfigTest.cs` | JSON 配置读写、默认值与缓存 |
-| `General/ProgressTest.cs` | 进度切分与聚合 |
-| `General/WorkerTest.cs` | Worker 调度、限流或重做语义 |
-| `Utils/CryptographyUtilsTest.cs` | 加密工具 |
-| `Utils/DirectoryUtilsTest.cs` | 目录操作 |
-| `Utils/FileUtilsTest.cs` | 文件与压缩包处理 |
-| `Utils/PathUtilsTest.cs` | 路径规范化和关系判断 |
-| `Utils/TaskUtilsTest.cs` | 异步任务与进程能力 |
-| `TestUtils.cs` | 测试公共支持 |
-
-`TestFiles/FileUtils` 中包含正常、损坏、不同编码和恶意路径的压缩包样本,用于验证 Zip Slip 等边界。
-
-## 3. 项目特点
-
-- 输出类型为 `Exe`,由 TUnit 测试运行机制执行;
-- 测试资源复制到输出目录;
-- 同时引用 WPF 层,因此可以覆盖少量 WPF 相关基础能力。
-
-## 4. 测试缺口
-
-当前测试主要集中于 Shared 的通用工具、配置、进度与 Worker,Wpf 层的平台行为覆盖仍较少。
-
-## 5. 建议
+| 配置、进度、Worker | `General/` |
+| 加密、目录、文件、路径、任务和进程 | `Utils/` |
+| 初始化、日志接入、临时目录 | `TestUtils.cs` |
+| 压缩格式、编码、损坏文件与 Zip Slip | `TestFiles/FileUtils/` |
 
-测试范围应保持在 MeloongCore 的公共行为内:
+[TestUtils.cs](../../Tests/TestUtils.cs) 中 TestBase 初始化 MeloongCore 并接入测试日志;TestWithFolder 在系统临时目录下创建含 GUID、特殊字符和长路径的测试目录,样本从输出目录复制。
 
-1. 保持本项目只测试 MeloongCore 与 WPF 适配层;
-2. 上层应用的业务测试由对应应用仓库维护;
-3. 新增公共能力时,优先补充与其行为和平台边界相对应的测试。
+测试目前主要覆盖 Shared,引用 Wpf 不意味着已覆盖其平台行为。按本次修改选择相关行为验证,上层应用业务测试留在引用方仓库。

+ 13 - 46
.agents/Wpf/架构分析.md

@@ -1,51 +1,18 @@
-# MeloongCore.Wpf 项目架构
+# Wpf 入口与构建
 
-[返回 MeloongCore 仓库指示](../仓库指示.md)
+[代码约定](../仓库指示.md) · [Shared](../Shared/架构分析.md)
 
-## 1. 项目定位
+构建 WPF 工程使用 Visual Studio 2022 的 `MSBuild.exe`。本项目为通用 Windows/WPF 适配层,依赖 Shared;纯 .NET 逻辑留在 Shared,应用专用外观和页面逻辑留在引用方。
 
-`MeloongCore/Wpf/MeloongCore.Wpf.csproj` 是 MeloongCore 的 WPF/Windows 适配层,面向 .NET Framework 4.8,依赖 `MeloongCore`。
+路径相对于 `Wpf/`:
 
-它的存在使 Shared 项目无需引用 WPF,同时让多个上层 WPF 应用复用窗口、对话框、转换器与 Windows API 封装。
-
-## 2. 源码组成
-
-| 文件 | 职责 |
+| 场景 | 入口 |
 | --- | --- |
-| `Main.cs` | WPF 层初始化 |
-| `Controls/ModernTooltipService.cs` | 现代化 ToolTip 行为 |
-| `Extensions/WpfExtensions.cs` | WPF 对象和控件扩展 |
-| `General/Dialogs.cs` | 文件、文件夹和消息对话框封装 |
-| `General/ValueConverters.cs` | WPF Binding 值转换器 |
-| `Utils/WindowsUtils.cs` | Windows 权限、窗口和系统相关工具 |
-
-## 3. 依赖
-
-- `MeloongCore`;
-- WPF 的 `PresentationCore`、`PresentationFramework`、`System.Xaml`;
-- `System.Windows.Forms`,用于部分 Windows UI 互操作;
-- `Ookii.Dialogs.Wpf`;
-- `Newtonsoft.Json` 与 PolySharp。
-
-## 4. 架构边界
-
-此项目适合承载“可被多个 WPF 应用复用”的平台代码,例如:
-
-- WPF 控件扩展和附加行为;
-- 通用值转换器;
-- Windows 窗口与权限操作;
-- 文件夹选择等系统对话框。
-
-它不适合承载:
-
-- 特定上层应用的控件外观或页面逻辑;
-- 具体应用的领域业务;
-- 只被一个调用点使用的小型包装;
-- 可以留在 Shared 的纯 .NET 逻辑。
-
-## 5. 维护关注点
-
-- 本项目承载 Windows/WPF 特有能力,而 Shared 仍需考虑 macOS;平台 API 必须留在本项目或明确受保护的代码路径中。
-- `System.Windows.Forms` 与 WPF 混用时要注意 DPI、窗口句柄和线程模型。
-- 该项目由多个上层应用和 Tests 引用,公共 API 变更影响面较大。
-- 应避免把具体上层应用的全局日志、设置或窗口实例反向引入本项目。
+| WPF 初始化 | `Main.cs` |
+| ToolTip 附加行为 | `Controls/ModernTooltipService.cs` |
+| 控件与对象扩展 | `Extensions/WpfExtensions.cs` |
+| 文件、文件夹与消息对话框 | `General/Dialogs.cs` |
+| Binding 转换器 | `General/ValueConverters.cs` |
+| Windows 权限、窗口与系统操作 | `Utils/WindowsUtils.cs` |
+
+System.Windows.Forms 与 WPF 互操作涉及 DPI、窗口句柄和线程模型;调整相关行为时检查调用线程与窗口归属。

+ 15 - 29
.agents/仓库指示.md

@@ -1,35 +1,21 @@
-# MeloongCore 仓库指示
+# MeloongCore 代码约定
 
-## 技术栈
+## 风格与复用
 
-- 使用 C# 13、Nullable、Implicit Usings 和 PolySharp。
-- `Shared` 面向 .NET Standard 2.0,不依赖 WPF。
-- `Wpf` 与 `Tests` 面向 .NET Framework 4.8。
-- 保持现代、清晰的 C# 写法,但不做过度抽象、优化或防御性检查。
-- 简化类结构,少留空行,但保留必要的注释。
-- 修改已有代码时优先保持最小改动,并删除修改后确定无用的内容。
-- 不添加只有一两行的小型辅助方法;仅有一个引用的方法或变量应积极考虑内联。
+- 使用 C# 13、Nullable、Implicit Usings 和 PolySharp;保持目标框架兼容。
+- 保持改动精简、结构紧凑并保留必要注释;避免无实际收益的抽象、优化和防御性检查。
+- 不为一两行逻辑添加辅助方法;仅有一个引用的方法或变量优先考虑内联。
+- 新增工具前检查现有 Extensions、General 和 Utils,避免重复实现。
 
-## C# 代码风格
+## C# 风格
 
-- 大括号不换行;变量名使用小驼峰,类型、属性和方法名使用大驼峰。
-- 没有 `else`、逻辑较短且仅含一条语句的 `if` 写在一行并省略大括号,例如 `if (flag) break;`;`if` 一旦换行,必须添加大括号。
-- 单行大括号内的内容前后不加空格,例如 `{element}`。
-- 行尾注释与代码之间、`//` 与注释正文之间各留一个空格,例如 `break; // 注释`。XML 文档注释引用参数时使用 `<paramref name="..."/>`。
-- 优先使用 C# 13 下更简洁且清晰的写法,例如 using 声明、本地函数和集合表达式。
-- 使用 `""` 表示空字符串,不使用 `string.Empty`。
+- 大括号不换行;变量名小驼峰,类型、属性和方法名大驼峰。
+- 无 `else`、简短且仅一条语句的 `if` 写成 `if (flag) break;`;换行则加大括号。单行大括号内部不留首尾空格,如 `{element}`。
+- 行尾注释格式为 `break; // 注释`;XML 文档参数引用用 `<paramref name="..."/>`。
+- 使用 `""` 表示空字符串;优先采用 C# 13 下简洁清晰的写法。
 
-## 项目边界
+## 公共 API 与平台边界
 
-- `Shared` 只存放可跨产品复用的通用能力,不得依赖具体上层应用的业务领域或 UI 页面。
-- Windows 与 WPF 特有功能优先放入 `Wpf`,避免破坏 Shared 的 macOS 可用性。
-- `Tests` 负责保护 Shared 与 Wpf 的公共行为,不应反向依赖引用本库的上层应用项目。
-- 新增工具前先检查现有 Extensions、General 和 Utils,避免重复实现。
-- 公共 API 会影响所有引用方,修改签名或语义前应检查兼容性。
-
-## 仓库安全
-
-- MeloongCore 是独立 Git 仓库,提交内容不得依赖特定引用方的私有目录结构或开发流程。
-- 构建 WPF 工程时使用 Visual Studio 2022 的 `MSBuild.exe`。
-- 保留用户已有的未提交修改,不覆盖或清理无关文件。
-- 不提交密钥、访问令牌、构建产物、测试结果或本地环境文件。
+- Shared 承载跨产品通用能力;Windows/WPF 特有功能优先放入 Wpf,已有平台专属入口需保持明确的调用边界。
+- 上层应用的业务、页面和全局状态留在引用方;Tests 只保护本库公共行为,不反向依赖应用项目。
+- 修改公共 API 签名或语义时检查已有引用方的兼容性。

+ 12 - 11
AGENTS.md

@@ -1,15 +1,16 @@
-# Agents 指南
+# MeloongCore Agents 指南
 
-本仓库的详细开发指示保存在 `.agents` 目录中。
+- 使用中文沟通;文本使用 UTF-8 无 BOM(65001),PowerShell 文本读写显式指定 UTF-8 编码。
+- 通用代码兼顾 Windows 与 macOS;Shared 面向 .NET Standard 2.0,不依赖 WPF。Wpf 与 Tests 面向 .NET Framework 4.8。
+- 本库是独立仓库,不依赖引用方的业务、私有目录或开发流程。
 
-## 基础环境
+## 按任务查阅
 
-- 使用中文沟通。
-- 通用代码需要同时考虑 Windows 与 macOS;平台特有代码必须保持明确边界。
-- 文本文件统一使用 UTF-8 无 BOM(代码页 65001)。使用 Windows PowerShell 读取或写入文本时必须显式指定 `-Encoding UTF8`。
+| 任务 | 文档 |
+| --- | --- |
+| 修改代码或公共 API | [代码约定](.agents/仓库指示.md) |
+| 查找通用能力、扩展方法及其语义差异 | [Shared 复用指南](.agents/Shared/架构分析.md) |
+| 修改 Windows/WPF 能力或构建 WPF 工程 | [Wpf 说明](.agents/Wpf/架构分析.md) |
+| 定位测试与测试环境 | [Tests 说明](.agents/Tests/架构分析.md) |
 
-处理本仓库内容前,必须完整读取并遵循:
-
-- [MeloongCore 仓库指示](.agents/仓库指示.md)
-
-该文件是本仓库规则的组成部分,不是可选参考资料。若指示文件无法读取,应先向用户说明,不得自行猜测或忽略缺失的规则。
+只读当前任务相关资料;入口、约定或关键行为变化时更新对应文档。