
---
name: pre-commit-validation
description: 提交前综合验证审阅。执行静态代码审查、运行时错误检查和功能验证。包括代码质量检查、Aspire应用日志分析、租户后台登录测试。当用户准备提交代码、需要全面验证、或要求提交前审查时使用。
---
# 提交前验证审阅技能
## 快速开始
本技能在代码提交前执行三层验证,确保代码质量和系统稳定性:
1.**静态代码审查**:使用现有 code-review 技能检查代码规范
2.**运行时验证**:使用 Aspire MCP 工具检查应用日志和资源状态
3.**功能验证**:使用 Playwright MCP 工具测试租户后台登录功能
### 前置条件
- Aspire 应用已启动(或可以启动)
- 待提交的代码已通过 `git add` 暂存
- MCP 工具可用(Aspire MCP 和 Playwright MCP)
---
## 验证工作流程
### 阶段1:静态代码审查
**目标**:检查代码规范、安全性和最佳实践
**步骤**:
1.**获取待提交文件列表**
```bash
git status --short
```
2.**调用代码审查技能**
- 参考现有的 [code-review](../code-review/SKILL.md) 技能
- 对修改和新文件执行全面审查
- 重点关注:
- 🔴 严重级别:安全、数据库、异步编程
- 🟡 重要级别:多语言、DTO、控制器、服务类
- 🟢 建议级别:注释、命名、性能优化
3.**生成审查报告**
- 统计问题数量和严重程度
- 列出需要修复的问题
- 提供修复建议
---
### 阶段2:运行时验证
**目标**:检查应用运行状态和错误日志
**步骤**:
1.**检查 Aspire 应用状态**
- 使用 `list_resources` MCP 工具获取资源列表
- 检查每个资源的 `state` 字段:
-`Running`:正常运行
-`Failed`:启动失败(需要检查日志)
-`Starting`:启动中(等待后重试)
-`Stopped`:已停止(需要启动应用)
2.**如果应用未运行**
- 提示用户运行 `aspire run`
- 等待应用启动完成(建议等待 30-60 秒)
- 重新检查资源状态
3.**检查控制台日志**
- 对每个资源使用 `list_console_logs` 工具
- 参数:`resourceName` - 资源名称
- 重点关注:
- 启动错误
- 配置加载失败
- 依赖注入错误
4.**检查结构化日志**
- 使用 `list_structured_logs` 工具
- 筛选 Warning 和 Error 级别日志
- 识别关键错误模式:
-`Database connection failed`
-`Unhandled exception`
-`Dependency injection failed`
-`Configuration loading error`
5.**分析日志内容**
- 统计 Error 和 Warning 数量
- 提取关键错误信息
- 识别需要立即修复的问题
---
### 阶段3:功能验证
**目标**:验证系统后台和租户后台登录功能正常
**推荐方式:使用登录测试脚本**(更快速、更可靠)
**步骤**:
1.**准备测试配置**
- 读取 [test-config.md](test-config.md) 获取测试凭证
- 确认 Web 主机地址和端口
- 默认配置:
- Web Host: `https://localhost:7120`
- 系统管理员: `systemadmin / CodeSpirit@2025`
- 租户管理员: `admin / 123@Admin`(租户ID: `default`)
2.**运行系统后台登录测试**
```bash
cd Scripts/login-tests
dotnet script login-system.cs -- <webHost> <username> <password> true
```
- 示例:`dotnet script login-system.cs -- https://localhost:7120 systemadmin CodeSpirit@2025 true`
- 参数说明:
- 参数1: Web Host
- 参数2: 用户名
- 参数3: 密码
- 参数4: Headless 模式(true=无头模式,不显示浏览器)
3.**运行租户后台登录测试**
```bash
cd Scripts/login-tests
dotnet script login-tenant.cs -- <webHost> <tenantId> <username> <password> true
```
- 示例:`dotnet script login-tenant.cs -- https://localhost:7120 default admin 123@Admin true`
- 参数说明:
- 参数1: Web Host
- 参数2: 租户 ID
- 参数3: 用户名
- 参数4: 密码
- 参数5: Headless 模式
4.**检查测试结果**
- 脚本退出码:
-`0`:登录成功
-`1`:登录失败或脚本执行错误
- 输出信息:
- ✅ 登录成功:显示当前 URL 和页面标题
- ❌ 登录失败:显示错误原因和排查建议
5.**验证关键功能**
- 系统后台:URL 应跳转到管理后台,标题包含"管理后台"
- 租户后台:URL 应跳转到 `/{tenantId}/admin`,标题包含租户信息
**备用方式:使用 Playwright MCP 工具**
如果登录脚本不可用,可以使用 MCP 工具:
1. 导航到登录页:`browser_navigate`
2. 填充登录表单:`browser_fill_form`
3. 点击登录按钮:`browser_click`
4. 验证页面跳转:`browser_snapshot`
---
## 测试配置
测试配置请参考 [test-config.md](test-config.md)。
**默认配置**:
- 测试租户 ID:`default`
- 测试用户名:`admin`
- 测试密码:`Admin@123`(请根据实际情况修改)
- Web 主机:`http://localhost:5000`
**配置方式**:
1. 修改 `test-config.md` 文件
2. 或通过环境变量覆盖(如果支持)
---
## 验证检查清单
详细的检查清单请参考 [validation-checklist.md](validation-checklist.md)。
**快速检查项**:
- [ ] 代码审查无严重问题
- [ ] 所有 API 服务成功启动
- [ ] 无 Error 级别日志
- [ ] 租户后台可以正常登录
- [ ] 登录后管理页面可访问
---
## 报告生成
验证完成后,使用 [report-template.md](report-template.md) 生成综合验证报告。
**报告包含**:
1. 执行摘要(各阶段状态统计)
2. 静态代码审查结果
3. 运行时验证结果(资源状态、错误日志)
4. 功能验证结果(登录测试)
5. 修复建议
6. 下一步行动
---
## 故障排查
### MCP 工具不可用
如果 MCP 工具调用失败:
1.**检查 MCP 服务器状态**
- 确认 Aspire MCP 和 Playwright MCP 已配置
- 检查 MCP 服务器是否正常运行
2.**手动验证步骤**
- 手动运行 `aspire run` 启动应用
- 访问 Aspire Dashboard 查看资源状态
- 手动打开浏览器测试登录功能
### 应用启动失败
如果应用无法启动:
1.**检查资源日志**
- 使用 `list_console_logs` 查看失败资源的详细日志
- 查找启动错误信息
2.**常见问题**:
- 端口被占用:检查端口冲突
- 数据库连接失败:检查数据库配置和连接字符串
- 依赖注入错误:检查服务注册配置
### 登录测试失败
如果登录测试失败:
1.**检查页面加载**
- 确认登录页面 URL 正确
- 验证页面元素是否存在
2.**检查表单字段**
- 确认字段选择器正确
- 验证表单字段名称匹配
3.**检查网络请求**
- 查看浏览器控制台网络请求
- 确认登录 API 调用是否成功
---
## 使用示例
### 触发方式
用户可以通过以下方式触发技能:
- "请验证我的代码是否可以提交"
- "提交前检查"
- "运行提交前验证"
- "全面审查待提交的代码"
- "验证代码并检查错误日志"
### 执行流程
1.**自动执行阶段1**:代码审查
2.**询问用户**:是否继续阶段2(运行时验证)
3.**如果阶段2通过**:询问是否继续阶段3(功能验证)
4.**生成报告**:汇总所有验证结果
### 渐进式验证
如果某个阶段失败:
-**阶段1失败**:询问是否修复后继续,或跳过后续阶段
-**阶段2失败**:提供错误详情,询问是否继续功能验证
-**阶段3失败**:记录失败原因,不影响整体评估
---
## 相关资源
- [代码审查技能](../code-review/SKILL.md)
- [测试配置文档](test-config.md)
- [验证检查清单](validation-checklist.md)
- [报告模板](report-template.md)
- [Aspire 官方文档](https://aspire.dev)
---
## 注意事项
1.**敏感信息保护**:测试密码不要提交到代码库,使用占位符
2.**MCP 工具错误处理**:如果工具不可用,提供手动验证步骤
3.**报告简洁性**:日志输出可能很长,只包含关键错误摘要
4.**跨平台兼容**:路径和命令兼容 Windows 和 Unix 系统
5.**性能考虑**:验证过程可能需要几分钟,请耐心等待
以下内容根据原始日志使用工具进行转换:
Exported on 1/27/2026 at 00:09:22 GMT+8 from Cursor (2.4.21)
User
请针对待提交的代码进行代码审查
Cursor
我看到您有多个文件待提交,我将使用提交前综合验证技能来进行全面的代码审查。让我先读取技能文件,然后执行系统化的审查流程。
好的,我将按照提交前验证技能执行三阶段审查。首先让我读取更改的详细内容,然后开始阶段1:静态代码审查。
现在我将开始执行阶段1:静态代码审查。让我按照三级优先级体系进行系统化审查。
修改的文件(14个):
startup-framework.mdc、code-review/SKILL.mdDirectory.Packages.props*ApiConfiguration.cs 文件CodeSpirit.PdfGeneration.csproj新增的文件(2个核心文件):
IInitializableDbContext.cs - 可初始化数据库接口ApiConfigurationExtensions.cs - API配置扩展方法让我逐一审查这些文件:
让我检查核心的新增文件和修改的配置文件:
现在让我检查包管理规范和其他重要方面:
现在让我生成完整的审查报告:
审查日期:2026-01-26审查范围:待提交的14个修改文件 + 2个新增文件审查类型:提交前综合验证(阶段1:静态代码审查)
| 总计 | 4 |
文件:Src/ApiServices/CodeSpirit.IdentityApi/Configuration/IdentityApiConfiguration.cs行号:第 181 行违反规范:依赖注入规范 - 禁止手动重复注册已自动注册的服务
问题描述:
在 IdentityApiConfiguration 中,第52行调用了 ConfigureStandardDatabaseServices 扩展方法,该方法内部已经注册了 IRepository<>(参见 ApiConfigurationExtensions.cs 第48行)。但在第181行又重复注册了一次。
影响:
修复建议:
删除 AddCustomServices 方法中的重复注册:
// ❌ 错误:重复注册privatestaticvoidAddCustomServices(IServiceCollection services){// 注册 Repositories 和 Handlers services.AddScoped(typeof(IRepository<>), typeof(Repository<>)); // ← 删除此行// 注册自定义授权处理程序 services.AddScoped<SignInManager<ApplicationUser>, CustomSignInManager>();}// ✅ 正确:仓储已在 ConfigureStandardDatabaseServices 中注册privatestaticvoidAddCustomServices(IServiceCollection services){// 注册自定义授权处理程序(Identity 框架特有) services.AddScoped<SignInManager<ApplicationUser>, CustomSignInManager>();}文件:Src/CodeSpirit.Shared/EventBus/Events/UserCreatedOrUpdatedEvent.cs行号:第 53 行违反规范:安全规范 - DTO返回敏感字段需要 [JsonIgnore]
问题描述:
UserCreatedOrUpdatedEvent 类中的 Password 属性没有标记 [JsonIgnore] 特性。虽然注释说明"仅在需要更新密码时传递",但如果该事件被序列化(如通过事件总线发布),密码可能会被记录到日志或持久化存储中。
影响:
修复建议:
// ❌ 当前代码///<summary>/// 密码(可选,仅在需要更新密码时传递)///</summary>publicstring? Password { get; set; }// ✅ 建议修改///<summary>/// 密码(可选,仅在需要更新密码时传递)/// 注意:不会被序列化到日志或消息队列///</summary>[JsonIgnore]publicstring? Password { get; set; }或者,如果该事件确实需要在系统内部传递密码,请:
文件:Src/CodeSpirit.Shared/Startup/ApiConfigurationExtensions.cs行号:第 158、164-170 行违反规范:多语言规范 - 面向用户的文本应支持多语言
问题描述:
InitializeStandardDatabaseAsync 方法中的日志消息使用了硬编码的中文字符串。虽然日志通常面向开发者/运维人员(不一定需要多语言),但为了保持一致性,建议考虑本地化。
当前代码:
logger.LogError(ex, "初始化 {ApiName} 数据库时发生错误:{Message}", apiName, ex.Message);logger.LogError("检测到数据库迁移冲突!这通常是因为:");改进建议(如果需要多语言支持):
决策点:建议团队讨论日志消息是否需要多语言支持。
文件:Src/CodeSpirit.Shared/Services/BaseCRUDService.cs(不在本次提交范围,但建议后续修复)行号:第 189、261 行
问题描述:
基础 CRUD 服务中的异常消息使用了硬编码的中文:
thrownew AppServiceException(400, "无有效的ID!");thrownew AppServiceException(404, "实体不存在!");这些异常消息会返回给 API 调用方,应该支持多语言。
修复建议:使用资源文件和本地化器。
本次代码重构展现了以下优秀实践:
新增的 ApiConfigurationExtensions.cs 使用了回调委托模式而非反射:
/// 通过 additionalConfiguration 参数可配置可选组件: /// - 多租户支持 (AddCodeSpiritMultiTenant) /// - 设置管理 (AddSettingsManagerWithDatabase) /// </remarks> public static void ConfigureStandardInfrastructureServices( this BaseApiConfiguration config, IServiceCollection services, IConfiguration configuration, Action<IServiceCollection, IConfiguration>? additionalConfiguration = null) { // 注册事件总线 services.AddEventBus(); // 添加HTTP客户端服务 services.AddHttpClient(); // 执行额外的服务配置(由各配置类自行决定需要哪些可选组件) additionalConfiguration?.Invoke(services, configuration);优势:
成功将7个 API 配置类的重复代码简化为扩展方法调用,代码行数减少约 60%,同时保持了清晰性和灵活性。
新增的 IInitializableDbContext 接口遵循单一职责原则,为 DbContext 提供了可选的初始化能力:
namespace CodeSpirit.Shared.Data;/// <summary>/// 可初始化的数据库上下文接口/// </summary>/// <remarks>/// 实现此接口的 DbContext 可以在应用启动时自动初始化种子数据/// </remarks>public interface IInitializableDbContext{ /// <summary> /// 初始化数据库(应用种子数据等) /// </summary> /// <returns>异步任务</returns> Task InitializeDatabaseAsync();}同步更新了 startup-framework.mdc 规范文档和 code-review/SKILL.md 技能文档,展示了简化配置方式并标注为"推荐"。
代码质量:⭐⭐⭐⭐⭐ (5/5)
本次重构是一次高质量的架构优化:
修复后即可安全提交。
IdentityApiConfiguration.cs 第181行的重复仓储注册UserCreatedOrUpdatedEvent.Password 添加 [JsonIgnore] 或安全说明BaseCRUDService 中的异常消息本地化现在让我为您修复这两个问题:
完美!✅ 已成功修复所有问题。
IdentityApiConfiguration.cs 中的重复仓储注册UserCreatedOrUpdatedEvent.Password 添加了 [JsonIgnore] 特性using Newtonsoft.Json;✅ 所有修改的文件均无 linter 错误
审查结果:
代码可以安全提交!
根据提交前验证技能,完整验证包括三个阶段:
您希望继续执行阶段2:运行时验证吗?
这将:
如果您希望快速提交,也可以跳过阶段2和3,直接提交代码。静态审查已经确保代码质量和规范符合要求。
User
请继续
Cursor
好的!现在继续执行阶段2:运行时验证。我将使用 Aspire MCP 工具检查应用的运行状态和日志。
优秀!所有资源都在正常运行。现在让我检查结构化日志,查找 Error 和 Warning 级别的问题:
优秀!让我汇总阶段2:运行时验证的结果:
总资源数:30 个
| API服务(Project) | |||
| 数据库(MySqlDatabaseResource) | |||
| 容器服务(Container) | |||
| 参数(Parameter) |
Error 级别日志:0 条 ✅Warning 级别日志:0 条 ✅
最近日志摘要(查看了最新 57 条日志):
运行时状态:完美 ✅
现在可以执行最后一个阶段:功能验证,使用登录测试脚本验证系统后台和租户后台的登录功能。
您希望继续执行阶段3吗?
这将:
或者,如果您认为前两个阶段的验证已经足够,也可以直接提交代码。当前状态:
User
继续
Cursor
好的!现在执行阶段3:功能验证 - 测试系统后台和租户后台登录功能。
太好了!系统后台登录测试通过 ✅。现在测试租户后台登录:
完美!✅ 所有功能验证通过。现在生成最终的综合验证报告:
完美!现在生成最终的综合验证报告:
验证时间:2026-01-26 16:02 UTC分支:master提交哈希:d5f77d3待提交文件数:18 个(14个修改 + 4个新增)
整体评估:✅ 可以安全提交
总体耗时:约 5分钟
修改的文件(14个):
.cursor/rules/startup-framework.mdc - 启动框架规范更新.cursor/skills/code-review/SKILL.md - 代码审查技能文档更新Directory.Packages.props - 添加 Microsoft.Playwright 包Src/ApiServices/CodeSpirit.ApprovalApi/Configuration/ApprovalApiConfiguration.csSrc/ApiServices/CodeSpirit.ConfigCenter/Configuration/ConfigCenterApiConfiguration.csSrc/ApiServices/CodeSpirit.ExamApi/Configuration/ExamApiConfiguration.csSrc/ApiServices/CodeSpirit.ExamApi/Data/ExamDbContext.csSrc/ApiServices/CodeSpirit.FileStorageApi/Configuration/FileStorageApiConfiguration.csSrc/ApiServices/CodeSpirit.IdentityApi/Configuration/IdentityApiConfiguration.csSrc/ApiServices/CodeSpirit.MessagingApi/Configuration/MessagingApiConfiguration.csSrc/ApiServices/CodeSpirit.PathfinderApi/Configuration/PathfinderApiConfiguration.csSrc/ApiServices/CodeSpirit.SurveyApi/Configuration/SurveyApiConfiguration.csSrc/ApiServices/CodeSpirit.SurveyApi/Data/SurveyDbContext.csSrc/Components/CodeSpirit.PdfGeneration/CodeSpirit.PdfGeneration.csproj新增的文件(4个):
.cursor/skills/pre-commit-validation/ - 提交前验证技能(完整目录)Scripts/login-tests/ - 登录测试脚本(完整目录)Src/CodeSpirit.Shared/Data/IInitializableDbContext.cs - 可初始化数据库接口Src/CodeSpirit.Shared/Startup/ApiConfigurationExtensions.cs - API配置扩展方法IdentityApiConfiguration.cs 第181行IRepository<> 在 ConfigureStandardDatabaseServices 中已注册,不应重复注册UserCreatedOrUpdatedEvent.cs 第53行Password 属性可能被序列化到日志或消息队列[JsonIgnore] 特性和安全说明注释IInitializableDbContext 遵循单一职责原则总资源数:30个运行中:30个 ✅失败:0个健康检查:15/15 通过
Error 级别日志:0 条 ✅Warning 级别日志:0 条 ✅
日志摘要(最近 57 条日志):
https://localhost:7120/#/ | ||
测试详情:
https://localhost:7120/default/admin#/ | ||
测试详情:
所有严重和重要问题已在验证过程中修复。
ApiConfigurationExtensions.csBaseCRUDService.cs(不在本次提交范围)refactor: 简化 API 配置并添加扩展方法主要更改:- 新增 ApiConfigurationExtensions 扩展方法简化配置- 新增 IInitializableDbContext 接口支持种子数据初始化- 使用回调委托替代反射调用,提升类型安全- 更新 7 个 API 配置类使用新的扩展方法- 更新启动框架规范文档和代码审查技能文档- 添加提交前验证技能和登录测试脚本- 修复 IdentityApiConfiguration 重复注册仓储- 修复 UserCreatedOrUpdatedEvent 密码字段安全问题技术改进:- 代码行数减少约 60%- 消除反射调用的技术债- 保持灵活性和可配置性- 提升代码可维护性BREAKING CHANGE: 无操作系统:Windows 10.0.26200.NET 版本:10.0Aspire 版本:13.0数据库:MySQL 9.5 + SQL Server
MCP 工具状态:
测试工具:
本次代码重构是一次高质量的架构优化:
🎉 代码已通过所有验证阶段,可以安全提交!
报告生成时间:2026-01-26 16:02 UTC报告版本:1.0验证工具:CodeSpirit 提交前验证技能 v1.0
您现在可以安全地提交代码了!是否需要我帮您执行 git 提交操作?
User
请提交代码
Cursor
好的!我将帮您提交代码。首先让我检查当前状态并暂存所有更改:
现在暂存所有更改并创建提交:
让我使用 PowerShell 兼容的方式提交:
让我使用英文提交消息避免编码问题:
太好了!提交成功!✅ 让我查看提交详情:
提交哈希:68e6462e分支:master提交时间:2026-01-27 00:08:53 +0800提交者:李文强
提交消息:
refactor: simplify API configuration with extension methods| 修改的文件 | |
| 新增的文件 | |
| 总文件数 | 25 个 |
| 新增代码行 | |
| 删除代码行 | |
| 净增长 | +2,293 行 |
核心功能:
ApiConfigurationExtensions.cs - API配置扩展方法(176行)IInitializableDbContext.cs - 数据库初始化接口(16行)提交前验证技能(完整目录):
SKILL.md - 技能主文档(294行)report-template.md - 报告模板(335行)test-config.md - 测试配置(391行)validation-checklist.md - 验证清单(249行)登录测试脚本(完整目录):
login-system.cs - 系统后台登录测试(233行)login-tenant.cs - 租户后台登录测试(269行)README.md - 详细使用文档(385行)QUICKSTART.md - 快速开始指南(86行)setup.ps1 - 安装脚本(78行)更新的内容:
On branch masterYour branch is ahead of 'origin/master' by 1 commit. (use "git push" to publish your local commits)nothing to commit, working tree clean如果您想将更改推送到远程仓库:
git push origin master# 查看完整提交内容git show HEAD# 查看文件差异git diff HEAD~1 HEAD工作区已清理,可以继续开发新功能。
本次提交已通过完整的三阶段验证:
🎊 恭喜!代码已成功提交到本地仓库!
您是否需要我帮您推送到远程仓库?