Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
172 changes: 172 additions & 0 deletions .github/copilot-instructions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,172 @@
# copilot-instructions.md (Bing.NetCore / framework)

> 适用范围:本仓库 `framework/`
> - `framework/src`:框架源码
> - `framework/tests`:测试项目(已按模块拆分,含 Unit + Integration + Shared Test Infrastructure)

本指引用于约束 GitHub Copilot / Copilot Chat / Codex 在本仓库生成代码与测试的方式,使输出 **可合并、可维护、可测试、与现有结构一致**。

---

## 1. 现有测试结构(必须遵守)

### 1.1 目录真实结构(以当前仓库为准)
- 单元测试(Unit Tests):`framework/tests/<Module>.Tests`
- 示例:`Bing.Core.Tests`、`Bing.Auditing.Tests`、`Bing.MultiTenancy.Tests`
- 集成测试(Integration Tests):`framework/tests/<Module>.Tests.Integration`
- 示例:`Bing.Caching.CSRedis.Tests.Integration`、`Bing.Dapper.MySql.Tests.Integration`
- 共享测试基建(Test Infrastructure / Shared)
- `Bing.Test.Shared`
- `Bing.TestShare`
- `Bing.TestShare.MySql`
- 其它:存在 `Bing.Tests`(聚合/兼容/历史用途),生成内容时需避免与现有职责冲突。

> 规则:新增测试项目必须优先沿用上述命名与分层,不要引入新的目录体系。

### 1.2 Unit vs Integration 的边界(强制)
- **Unit Test(默认)**
- 只测纯逻辑与边界行为
- 不依赖网络、真实 DB、真实缓存、真实文件系统
- 必须确定性、可重复运行、速度快
- **Integration Test(仅在必须时)**
- 仅用于验证:真实数据库/缓存/DI 组合/ASP.NET Core 管道/中间件链路
- 必须具备可重复运行能力:可本地跑、可 CI 跑
- 若依赖外部服务(MySql/PostgreSql/Redis),需提供可控的启动方式(优先容器化/测试环境变量配置),不得硬编码连接信息

---

## 2. 生成代码的通用原则

### 2.1 不引入破坏性变更
- 不随意修改 public API(类名、方法签名、异常类型、默认行为)。
- 如必须调整 API:
- 同步:单元测试/集成测试(按影响范围)
- 更新文档或注释(如该模块已有说明/README/使用示例)

### 2.2 模块依赖方向必须合理
- `Core/Abstractions` 不允许依赖 `AspNetCore` 或其它上层实现。
- 上层模块可依赖基础模块,但不能反向引用。
- 跨模块能力(异常、多租户、审计、事件总线、缓存等)通过抽象/接口/扩展点协作,避免硬耦合。

### 2.3 优先做“最小变更”
- 避免引入无意义格式化/大规模重命名导致 diff 失真。
- 改动必须聚焦目标,保持可 review。

---

## 3. 测试规范(你这个仓库的强约束)

### 3.1 测试项目引用规则
当为某个 `framework/src/<Module>` 增加或完善测试时:

- Unit Test 项目:`framework/tests/<Module>.Tests`
- 必须 `ProjectReference` 指向被测 `framework/src/<Module>/<Module>.csproj`
- 必须引用共享测试基建:优先使用仓库现有的 `Bing.Test.Shared` / `Bing.TestShare*`(不要新造轮子)

- Integration Test 项目:`framework/tests/<Module>.Tests.Integration`
- 除上述规则外,还需要明确:
- 测试运行前置条件(DB/Redis 等)
- 如何在 CI 运行(环境变量/容器/跳过策略)

> 禁止:为了让测试“看起来能跑”,在 Integration 里写 sleep、随机等待、依赖公网。

### 3.2 命名规范
- 测试方法名:**英文**,建议:`Method_State_Expected()`
- 测试注释:**中文**,每个测试必须写“测试目的”
- 结构:AAA(Arrange / Act / Assert)

示例:
```csharp
/// <summary>
/// 测试目的:当租户标识缺失时,解析器应返回 null,避免抛异常影响上游管道。
/// </summary>
[Fact]
public void Resolve_WhenTenantIdMissing_ShouldReturnNull()
{
// Arrange
...

// Act
...

// Assert
...
}
```

### 3.3 Mock 边界(重点)
- 只 Mock 外部依赖:时间、Guid、随机数、IO、HTTP、数据库、缓存、日志等。
- 不 Mock 被测模块内部实现细节(避免“验证调用次数”替代“验证行为结果”)。
- 日志测试:通常只验证“不抛异常/路径正确/包含关键字段(若有结构化事件)”,不要断言完整文本。

---

## 4. 针对你当前模块的“优先补测策略”

### P0(必须先补齐)
- `Bing.Core.Tests`
- 基础工具类、Guard/参数校验、扩展方法、序列化/转换、线程安全与边界
- `Bing.MultiTenancy.Tests`
- 租户解析优先级、TenantScope/上下文传播、fallback 行为
- `Bing.AspNetCore.Mvc.Tests` / `Bing.Aop.AspectCore.Tests`(如涉及关键管道/拦截)
- 中间件/过滤器/拦截器的关键行为(可用少量集成测试兜底)
- `Bing.Logging.Tests` / `Bing.Logging.Serilog.Tests`
- logger provider 组合、结构化字段是否被正确输出(避免测具体文本)
- `Bing.EventBus.Tests`
- 发布/订阅基本语义、异常传播、重试策略(若有)

### P1(增强)
- `Bing.Auditing.Tests`
- 审计字段填充策略、忽略规则、边界数据
- `Bing.AutoMapper.Tests`
- profile 注册、映射配置验证、关键映射行为(避免测 AutoMapper 内部)

### P2(最后)
- 多 DB / 多缓存的集成链路补齐与稳定性增强
- `Bing.Dapper.*.Tests.Integration`
- `Bing.Caching.*.Tests.Integration`
- 重点:连接配置、隔离(schema/db)、清理策略、并发稳定性

---

## 5. Copilot 输出要求(强制工作流)

当你让 Copilot “完善某模块/补单测/修 bug”时,必须按以下步骤输出:

1) **变更计划**
- 修改/新增文件路径列表
- 影响的模块与依赖
- 是否需要 Integration Test(为什么)
2) **用例矩阵**
- Given/When/Then(至少:正常 + 边界 + 负例)
- Mock 边界说明
3) **落地代码**
- 可编译通过、可运行的测试代码
- 如新增项目:给出 `.csproj` 关键引用片段

> 禁止:直接生成大量代码却不说明测试意图与用例覆盖范围。

---

## 6. CI/可执行性约束(提交验收)

每次 PR 必须满足:
1. `dotnet build` 通过
2. `dotnet test` 通过(Unit Tests 必须全绿)
3. 新增/修改行为必须包含对应测试
4. Integration Tests 如需跳过必须有明确条件(例如 `RUN_INTEGRATION_TESTS=true`),并在说明中写清楚

---

## 7. 常用 Prompt 模板(按你仓库结构)

### 7.1 针对某模块补齐 Unit Tests(默认)
“请为 `framework/src/<Module>` 补齐 P0 单元测试,写到 `framework/tests/<Module>.Tests`。先列 public API,再给用例矩阵(Given/When/Then),再输出可运行的 xUnit 测试代码,并复用 `Bing.Test.Shared / Bing.TestShare*` 的现有能力,不要新造测试基建。”

### 7.2 针对某数据库实现补齐 Integration Tests
“请为 `framework/src/Bing.Dapper.<Db>` 补齐集成测试,写到 `framework/tests/Bing.Dapper.<Db>.Tests.Integration`。说明依赖(DB/连接配置/容器化建议),并提供可重复运行的初始化与清理策略,避免 sleep 与非确定性。”

### 7.3 仅做问题审计(不改代码)
“只扫描 `framework/src` + `framework/tests`,列出:测试覆盖缺口、P0 风险、依赖方向问题、API 不一致点,并给出可执行 PR 列表(每个 PR 的文件路径与验收标准)。”

---
52 changes: 52 additions & 0 deletions .github/skills/chinese-comments/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
---
name: chinese-comments
description: 为 C#/.NET 项目自动补全规范的中文 XML 注释。
---

# 中文注释规范

在生成或修改 C#/.NET 项目代码时,请自动补全中文 XML 注释。

## 必须补全的对象

- Controller 与 Action
- class / interface / enum / record / struct / delegate / event
- public / protected / internal / private 方法
- 构造函数
- DTO / Entity / Options
- public / protected / internal / private 属性
- 字段、常量、缓存键

## 注释要求

1. 使用简体中文。
2. 注释应描述业务含义,不要只翻译名称。
3. public、protected、internal、private 方法必须补全 `<summary>`、`<param>`、`<returns>`。
4. 枚举类型和枚举成员都要补全注释。
5. DTO、实体、控制器、应用服务必须优先补全注释。
6. 重要 private 字段和常量建议补充注释。
7. 保持代码格式化,不要破坏原有逻辑。
8. 如果发现已有注释质量较差,请优化为更准确的中文注释。
9. 对于复杂的业务逻辑,建议在方法体内添加必要的注释,解释关键步骤和算法。
10. 对于公共 API,建议在注释中包含示例代码或使用场景,以便其他开发者理解和使用。
11. 对于涉及到性能优化的代码段,建议在注释中说明优化的原因和预期效果。
12. 对于涉及到异常处理的代码段,建议在注释中说明可能抛出的异常类型及其处理方式。
13. 对于涉及到多线程或异步操作的代码段,建议在注释中说明线程安全性和异步行为的注意事项。
14. 对于涉及到外部依赖或第三方库的代码段,建议在注释中说明依赖的版本和使用方式。
15. 对于涉及到配置项或环境变量的代码段,建议在注释中说明配置的作用和默认值。
16. 对于涉及到安全性或权限控制的代码段,建议在注释中说明安全策略和权限要求。
17. 对于涉及到数据验证或输入校验的代码段,建议在注释中说明验证规则和错误处理方式。
18. 对于涉及到日志记录或监控的代码段,建议在注释中说明日志级别和监控指标。
19. 对于返回 `Task` 的返回值,则无需补充 `<returns>` 注释。

## 风格要求

- 简洁、专业、准确
- 符合企业级 .NET 项目风格
- 与 ABP / DDD / CQRS 场景兼容
- 优先体现业务用途,而非字面翻译

## 执行要求

当发现缺失注释时,请顺手补齐;
当发现已有注释质量较差时,请优化为更准确的中文注释。
169 changes: 169 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@
# Agent 全局执行规范

本文件用于约束 Copilot、Codex、Gemini、Claude 等 AI 工具在当前项目中的执行方式。

## 默认行为

- 默认使用简体中文回答。
- 生成代码时,优先补充必要的中文注释。
- 所有命令、脚本、文件读写、日志导出、Markdown 生成,都必须优先考虑 Windows + VS Code + PowerShell 环境下的中文乱码问题。
- 默认编码统一使用 UTF-8。

## UTF-8 规则(强制)

- 所有文本文件读取必须显式指定 `UTF-8`。
- 所有文本文件写入必须显式指定 `UTF-8`。
- 禁止使用 PowerShell 默认编码直接写入源码、Markdown、XML、Gradle、Kotlin、Java、YAML、JSON、Properties 文件。
- 优先使用 Python 进行文件读写:

```python
from pathlib import Path

text = Path("input.txt").read_text(encoding="utf-8")
Path("output.txt").write_text(text, encoding="utf-8")
```

- 在 shell 命令中修改中文内容时,避免直接内联中文大段文本;优先使用 Python 组装字符串后以 UTF-8 写入。
- 终端出现 `????` 时,不要直接判断文件已损坏;应优先用编辑器或 `unicode_escape` 检查文件真实内容。

## PowerShell 编码规则

在生成 PowerShell 脚本时,必须优先设置控制台编码:

```powershell
[Console]::InputEncoding = [System.Text.UTF8Encoding]::new($false)
[Console]::OutputEncoding = [System.Text.UTF8Encoding]::new($false)
$OutputEncoding = [System.Text.UTF8Encoding]::new($false)
```

写入文件时必须显式指定编码:

```powershell
Set-Content -Path $path -Value $content -Encoding utf8
Add-Content -Path $path -Value $content -Encoding utf8
Out-File -FilePath $path -Encoding utf8
Export-Csv -Path $path -Encoding utf8 -NoTypeInformation
```

禁止在未确认编码的情况下,直接使用:

```powershell
"中文内容" > file.md
"中文内容" >> file.md
```

## Python 编码规则

生成 Python 脚本时,所有文本文件读写必须显式指定编码:

```python
from pathlib import Path

content = Path("input.txt").read_text(encoding="utf-8")
Path("output.txt").write_text(content, encoding="utf-8")
```

禁止使用不带 `encoding` 的文件读写:

```python
open("input.txt").read()
open("output.txt", "w").write("内容")
```

## .NET / C# 编码规则

生成 .NET / C# 文件读写代码时,必须显式指定 UTF-8:

```csharp
using System.Text;

var text = File.ReadAllText(path, Encoding.UTF8);
File.WriteAllText(path, text, Encoding.UTF8);
```

控制台程序如需输出中文,优先设置:

```csharp
Console.InputEncoding = Encoding.UTF8;
Console.OutputEncoding = Encoding.UTF8;
```

## Node.js 编码规则

生成 Node.js / TypeScript 文件读写代码时,必须显式指定 `utf8`:

```ts
import { readFileSync, writeFileSync } from "node:fs";

const text = readFileSync("input.txt", "utf8");
writeFileSync("output.txt", text, "utf8");
```

## 文件类型规则

以下文件必须按 UTF-8 处理:

- `.cs`
- `.csproj`
- `.sln`
- `.props`
- `.targets`
- `.json`
- `.yaml`
- `.yml`
- `.xml`
- `.md`
- `.sql`
- `.ps1`
- `.bat`
- `.cmd`
- `.js`
- `.ts`
- `.vue`
- `.java`
- `.kt`
- `.gradle`
- `.properties`

## 乱码排查规则

如果用户反馈乱码,优先按以下顺序排查:

1. VS Code 当前文件编码是否为 UTF-8。
2. PowerShell Profile 是否设置 UTF-8。
3. `[Console]::OutputEncoding` 是否为 UTF-8。
4. `$OutputEncoding` 是否为 UTF-8。
5. `chcp` 是否为 `65001`。
6. 文件写入命令是否显式指定 `-Encoding utf8`。
7. Python / Node.js / .NET 是否显式指定 UTF-8。
8. 是否由旧文件本身就是 GBK / ANSI 编码导致。

## 禁止行为

- 禁止默认依赖 Windows ANSI / GBK 编码。
- 禁止在未确认编码时批量替换中文内容。
- 禁止使用未指定编码的文件迁移脚本。
- 禁止生成可能导致中文变成 `????` 的命令。
- 禁止把终端显示乱码直接等同于文件内容损坏。

## 推荐处理方式

当需要批量修改文件内容时,优先生成 Python 脚本,并使用:

```python
from pathlib import Path

path = Path("target-file.md")
text = path.read_text(encoding="utf-8")
text = text.replace("旧内容", "新内容")
path.write_text(text, encoding="utf-8")
```

当需要验证文件真实内容时,可以使用:

```python
from pathlib import Path

text = Path("target-file.md").read_text(encoding="utf-8")
print(text.encode("unicode_escape").decode("ascii"))
```
Loading