Files

167 lines
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# AtomUI AI 协作规范
这份文档承载面向 AI 编程助手的具体工程约束。`AGENTS.md` 只引用它;后续如果某条约束属于 AOT、Gallery、资源生命周期、发布流程等更具体领域,应移动到对应专项文档,并在这里保留简短索引或原则。
## 约束放置原则
- 根目录 `AGENTS.md` 只写项目入口、文档路由和稳定协作原则。
- 具体、可执行、会增长的规则放到 `docs/engineering/`、`docs/gallery/`、`docs/modules/` 或控件文档中。
- 新增规则前先判断归属:跨项目协作放本文档;AOT 放 `aot-programming-guidelines.md`;Gallery 页面放 `gallery-showcase-design-pattern.md`;发布放 release workflow 文档。
- 当一个规则只适用于某个子系统,不要为了可见性塞进 `AGENTS.md`,应在该子系统文档中写清楚并从相关入口引用。
## 参考项目源码
当用户说“参考某个项目源码”或表达同等意图时,必须先执行 [参考项目源码查找规范](reference-project-source-guidelines.md) 中规定的本地优先查找流程。不得跳过项目目录下的 `.referenceprojects`、逐级向上的 `ReferenceProjects`,直接去 GitHub;只有所有本地位置都未命中时,GitHub 才是允许的兜底来源。
## Bug 修复
修复 bug 时必须优先寻找从根源杜绝问题的方案,而不是只在触发点打补丁。
编写 BUG 类型 Issue 时,按 [BUG Issue 规范](bug-issue-guidelines.md) 收集上下文并描述期望行为;不要在 Issue 中混入实现方案、验收清单或测试计划。
执行顺序:
1. 复现或从错误栈、日志、截图、用户步骤中还原触发路径。
2. 追踪坏状态、异常或错误行为的来源,直到能解释为什么会发生。
3. 搜索同类实现和同类触发入口,判断是否存在同源 bug。
4. 先补能失败的回归测试;无法自动化时,说明原因并保留可复查的手动验证步骤。
5. 在源头修复共享逻辑、状态模型、生成器、生命周期或契约,而不是只拦截当前样例。
6. 修复后按照“回归测试范围”规则重跑回归测试,并根据影响面补跑必要的相邻模块测试。
不要把这些行为当作根因修复:
- 捕获异常后吞掉。
- 对当前控件或当前 Demo 写特殊判断,但共享路径仍然会失败。
- 加延时、重试或强制刷新来掩盖状态同步问题。
- 用 `UnconditionalSuppressMessage` 或条件编译隐藏 AOT/trim warning,但没有改变运行时动态行为。
## 临时复现 Demo
用户要求“跑起来看看”、复现 Issue、做最小可视化 Demo 或修复后复核 Demo 时,默认把 Demo 当作临时取证工具,
而不是仓库产物。
- 默认在 `/private/tmp`、`/tmp` 或当前 sandbox 允许写入的临时目录创建 Demo;除非用户明确要求保存示例项目,
不得把复现 Demo 放进仓库源码、测试目录、Gallery 或文档示例中。
- 临时目录命名应包含项目或 Issue 线索,例如 `atomui-issue449-live-*`,便于识别和清理。
- Demo 必须引用当前工作区源码或当前待验证产物,并尽量复用仓库中的目标框架、Avalonia 版本、AtomUI 注册方式和
启动路径;不要用不同依赖组合制造新的变量。
- Demo 必须保留原始触发条件,例如尺寸约束、滚动、冻结列、标题、Header 可见性、GridLine 设置、数据量和溢出
条件。不得通过移除触发条件让症状消失后宣称修复。
- 如果 Demo 只用于复现或人工确认,修复完成并得到用户确认后必须停止相关进程、关闭可控会话,并删除临时 Demo
目录。删除前如需保留证据,只保留必要日志、截图路径或简短结果说明,不保留可运行 Demo 工程。
- 临时 Demo 不能替代回归测试。只要修复落入仓库代码,就必须优先补可自动化失败的回归测试;确实无法自动化时,
才记录手动 Demo 验证步骤和无法自动化的原因。
- 最终汇报要说明临时 Demo 是否已删除、仓库中保留了哪些正式修复和测试,以及是否仍有长运行进程需要用户处理。
## Public API 变更约束
修复 bug 时,默认不得引入新的 Public API,除非已经得到用户明确允许。
Public API 包括但不限于 `public` / `protected` 类型、成员、构造函数、Avalonia 属性、事件、公开接口、可被 XAML 引用的公开控件类型、主题资源 key、`ControlTheme` key、`TemplatePart`、伪类等对外契约。
修复应优先复用现有公开契约、`private` / `internal` 实现、模板内部结构或已有共享基础设施。不得为了当前 bug 修复方便,新增空的 `public` 类型、包装类、属性、事件或临时公开扩展点。
如果判断根因修复确实需要新增或调整 Public API,必须先停止实现,并向用户说明:
1. 为什么不改 Public API 无法从源头修复。
2. 具体会新增或变更哪些 API。
3. 对兼容性、文档、测试和示例的影响。
4. 是否存在不改 Public API 的替代方案及代价。
如果不确定某个类型、成员或 XAML 契约是否属于 Public API,应先询问用户,不要自行决定。
## AOT 与动态行为
新增功能和修复 bug 默认都要做一次 AOT 兼容判断。具体规则以 [AOT 编程规范](../development/aot-programming-guidelines.md) 为准,不在本文档重复展开。
重点约束:
- 同一需求有 AOT 友好实现和运行时反射/动态发现实现时,选择 AOT 友好实现。
- 能用 source generator、显式注册或 descriptor 的路径,不使用反射扫描。
- 发布路径、source generator 运行时注册、动态数据 path 等风险点按 AOT 文档验证。
## Gallery
Gallery 页面结构、懒加载、示例组织和旧 API/Token sidecar 禁用规则以 [Gallery ShowCase Design Pattern](../../gallery/authoring/gallery-showcase-design-pattern.md) 为准。
Gallery 改动时注意:
- 不把已移除的 API/Token sidecar 重新手写成普通布局。
- 不在页面结构调整中顺手改 Demo 行为。
- 延迟创建只能改变创建时机,不能改变示例控件树语义。
- 涉及 NativeAOT 发布或发布脚本时,阅读 [Gallery NativeAOT Release Workflow](../workflows/gallery-aot-release-workflow.md)。
## 资源与生命周期
涉及 `DynamicResource`、非 Visual `AvaloniaObject`、template part、event handler、binding、subscription、cache 时,必须能说明释放或失效位置。
典型检查:
- `OnApplyTemplate` 重新应用时释放旧 part 绑定。
- detach、owner 变更、container recycle 时解绑事件和资源宿主。
- 非 Visual 对象使用动态资源时,需要明确资源宿主生命周期。
- owner-managed 非 Visual `AvaloniaObject` 需要 scoped resource host 时,默认遵循 [Scoped Resource Host 开发规范](../development/scoped-resource-host.md),不要复制手写 `IResourceHost` / `IThemeVariantHost` 样板代码。
- 修复内存保留问题时,按同类对象成组审计,不只修 dump 中看到的第一个类型。
参考:[Avalonia DynamicResource 内存泄露案例](../case-studies/avalonia-dynamic-resource-memory-leak-case-study.md)。
## 测试与验证
选择验证命令时按风险扩大范围:
- 纯共享数据结构:先跑对应 shared tests。
- Desktop 控件行为:跑对应 `AtomUI.Desktop.Controls.Tests`。
- DataGrid:跑 `AtomUI.Desktop.Controls.DataGrid.Tests`。
- Gallery 页面或 ViewModel:跑 `AtomUIGallery.Tests`。
- AOT、trim、发布配置、source generator 运行时注册:跑真实 NativeAOT publish。
- 每次收尾都运行 `git diff --check`。
测试运行产生的本地临时结果必须由仓库构建入口自动清理。不得在 `tests/**/TestResults`、`.artifacts/TestResults`
或工作树副本中长期保留 VSTest 结果、hang dump、crash dump、coverage 临时文件等占用存储的测试产物;需要诊断 dump
时必须将采集位置移出仓库,并在排障结束后主动清理。
### 回归测试范围(硬约束)
- 新增、修改或删除代码后,如需执行回归测试,默认只运行与改动代码直接相关的模块回归测试,以及验证直接影响所必需的相邻模块测试。
- 常规代码改动默认不执行全量回归测试,不得将全量回归测试作为常规默认步骤。
- 只有在用户明确要求,或执行 `version-release` skill 时,才执行全量回归测试。
- 验证结果必须明确记录实际执行的测试范围、命令和结果;未执行的全量回归测试不得表述为已完成。
不要在没有最新验证输出时声称“已修复”“测试通过”或“发布可用”。
## 文档更新
当一次改动形成可复用规则时,更新对应文档:
- 跨项目 AI 工作约束:本文档。
- AOT、trim、source generator:`aot-programming-guidelines.md`。
- Gallery 页面结构:`gallery-showcase-design-pattern.md`。
- Gallery AOT 发布:`gallery-aot-release-workflow.md`。
- 控件研发标准:`control-development-guidelines.md`。
- 模块架构:`docs/modules/**/overview.md`。
- 控件用户文档:`docs/controls/**`。
文档应记录“以后怎么做”和“为什么”,不要写成一次性修复记录。
长期架构文档和实现维护文档必须以 AtomUI 自身的公共契约、不变量和验证条件为准。不得把外部项目的
具体版本、tag、commit、本地参考仓库路径或源码行号写成 AtomUI 架构的事实来源。确需保留上游差异或
调查证据时,应放入带日期的迁移记录、发布记录或问题分析;长期文档只保留验证后的结论和重新验证条件。
## 代码改动边界
- 遵循当前模块已有风格、命名和文件组织。
- 不做与用户请求无关的格式化、重排、重命名或清理。
- 删除只因本次改动变得无用的代码;既有无关遗留先报告,不直接处理。
- 抽象只在能消除实际重复、降低共享复杂度或匹配既有模式时引入。
- 生成文件不要手改;改 generator 或输入源,并验证输出。
## 控件研发标准
控件 C# 实现、AXAML 主题、API 和主题契约变更必须遵循 [AtomUI 控件研发标准规范](../development/control-development-guidelines.md)。优化代码和修复 bug 时,如果涉及控件既有 API、主题契约或可观察行为变化,必须先获得用户明确授权。
## Changelog 与发布
Changelog 维护规则见 [changelog-guidelines.md](changelog-guidelines.md)。普通修复、功能和内部重构不默认修改 `CHANGELOG.md`,只有用户明确要求准备 changelog、release、版本发布,或变更包含必须提前暴露的兼容性信息时才整理。
发布相关改动必须检查对应脚本、workflow、项目属性和产物校验逻辑,不能只看普通 Debug build。