关于 using-dotnet
using-dotnet 是面向 Agent 的技能,在规划或实现前,将 .NET 和 C# 任务路由到相关指南。它强调按版本加载技能,并让方案复杂度与任务相称。
主要功能
- 01从提示和仓库文件检测 .NET 意图
- 02通过 dotnet-advisor 路由任务
- 03规定技能加载顺序和优先级
- 04倡导简单易读的实现
- 05小型工具优先采用文件型应用
适用场景
- 01开始处理 .NET 仓库中的任务
- 02为特定领域的 .NET 任务选择指南
- 03创建小型 .NET 脚本或工具
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ novotnyllc/ dotnet-artisan --skill using-dotnet安装后在 Claude Code 中输入/using-dotnet确认已加载。
附带文件agents/openai.yaml
详细介绍
using-dotnet
范围
- 在提出澄清问题、制订计划、执行命令或进行编辑之前,确立 .NET/C# 路由规范。
- 根据提示词和仓库信号(
.sln、.slnx、.csproj、global.json、.cs)检测 .NET 意图。 - 强制要求第一步通过
dotnet-advisor进行路由,并遵循基线加载顺序。 - 定义下游技能调用的优先级和严格性规则。
范围之外
- C# 实现细节和编码规范的具体要求 ->
dotnet-csharp - 深入的领域实现模式 ->
dotnet-api、dotnet-ui、dotnet-testing、dotnet-devops、dotnet-tooling、dotnet-debugging - 专家级深度审查工作流 ->
dotnet-security-reviewer、dotnet-performance-analyst、dotnet-testing-specialist
简单优先(KISS)
编写能解决问题的最简单代码。Agent 总是容易过度设计——引入的抽象、层次和间接性远超任务所需。
- 直接处理。 如果需要一个文件,就创建它——不要编写生成文件的代码。如果需要数据,就把它放在该放的位置——不要在运行时从内嵌字符串中拼装数据。当你发现自己在构建间接方案(生成器、模板、包装器)时,请停下来问:“我能不能直接处理?”
- 编写易读的代码,而非耍巧的代码。 使用普通的
if/else,而不是一连串三元表达式;使用foreach,而不是难以阅读的 LINQ 表达式;使用扁平的方法,而不是嵌套回调。清晰胜过紧凑。这并不意味着要避免现代 C#——使用最新的语言特性([..4]、列表模式、主构造函数、原始字符串字面量、集合表达式)。现代语法既简洁又易读。要避免的是复杂迂回的逻辑,而不是简洁的语法。 - 不要添加未要求的内容。 不要增加额外的配置选项,不要“顺便”重构,不要为不可能发生的情况预先添加错误处理,也不要给与当前任务无关的代码添加注释或 XML 文档。
- 架构应与范围匹配。 简单的 CRUD 不需要 DDD、MediatR、CQRS 或行为管道。20 行的处理程序不需要拆成 5 个文件。模式的复杂度应与问题相称。
- 每个抽象都要有其价值。 不要只为一个
OrderService创建IOrderService。不要为只发生一次的逻辑提取辅助方法。三行相似的代码并无不可——只有在 3 个以上调用位置出现真正的模式时才提取。 - 使用框架已提供的功能。
DbContext就是工作单元。DbSet<T>就是存储库。.NET 提供了TimeProvider、ILogger<T>、IHttpClientFactory、System.Text.Json。直接使用它们——不要包装、不要抽象,也不要为框架已能实现的功能添加 NuGet 包。 - 减少文件和层次。 在新项目或小型项目中,如果一两个文件就够了,就不要拆成 Controller + Service + Repository + DTO + Mapper + Interface。在现有代码库中,遵循既有模式。只有当缺少这些层次会导致代码难以理解时,才添加它们。
恰当的复杂度,就是正确解决当前问题所需的最低复杂度。
为什么路由很重要
.NET 技能包含特定版本(net8.0 与 net9.0、net10.0)的指导、编码规范和框架专属模式,而模型的训练数据中并没有这些信息。跳过路由,模型就可能自信地生成使用已弃用 API 的代码、遗漏框架专属模式,或给出忽略项目上下文的通用建议。
先进行路由再采取行动,可确保:
- 先加载与版本相关的指导(避免提供过时的 API 建议)
- 从一开始就应用编码规范(而不是事后补上)
- 将领域问题交由合适的专家处理(避免为专业问题提供通用建议)
路由的成本只是调用几项技能。跳过路由则可能导致返工、过时的建议或隐蔽的错误。
路由顺序
当请求可能涉及 .NET 或 C# 时,请先按以下顺序操作,再执行任何其他操作:
- 检测 .NET 意图 — 查找提示词关键词(C#、.NET、ASP.NET、EF Core、Blazor、MAUI、NuGet、csproj)或仓库信号(
.sln、.slnx、.csproj、global.json、.cs文件)。如果存在任一项,则继续。 - 在 .NET 仓库中,默认使用 .NET — 存在仓库信号时,对于“给我构建一个 Web 应用”“添加一个仪表板”“写一个脚本”或“创建一个电子表格”等含糊请求,应使用 .NET 解决方案(ASP.NET Core、Blazor、.NET 基于文件的应用、Open XML SDK),而不是默认使用 JavaScript/Python。用户选择 .NET 项目是有原因的。
- 检查 SDK 是否可用 — 如果
dotnet --version失败且未设置DOTNET_ROOT,请先安装 SDK 再继续。安装不到一分钟,且无需特殊权限。完整安装脚本参考请见dotnet-tooling的references/dotnet-sdk-install.md,也可使用以下单行命令:curl -sSL https://dot.net/v1/dotnet-install.sh | bash && export DOTNET_ROOT="$HOME/.dotnet" && export PATH="$PATH:$DOTNET_ROOT:$DOTNET_ROOT/tools"。不要将缺少 SDK 视为阻碍——安装后继续。 - 加载
dotnet-advisor— 如何操作请参阅下文“加载其他技能”。 - 遵循顾问的路由建议 — 按相同方式加载
dotnet-csharp基础技能,然后加载顾问选定的领域技能。 - 现在作出响应 — 在加载正确的上下文后,进行澄清、规划、探索或实现。
加载其他技能
name 是描述性文本,并非调用指令。Codex 会在注入路由器技能之前,从原始轮次输入中收集显式技能;不会重新扫描注入的文本以查找嵌套提及——因此,仅在此文件中提及技能名称并不会加载该技能。请如实说明你实际执行的操作;不要因为提到某个技能,就声称已调用它。
按以下顺序通过两种方式之一加载:
- 原生调用(主机支持时)。 在 Claude Code 中,使用带限定名称的
Skill工具,例如dotnet-artisan:dotnet-api。这种方式会保留技能的元数据、策略和依赖项,因此只要可用,就优先使用。 - 读取文件(主机不支持时)。 此插件中的每项技能都位于同级目录,因此目标文件始终是相对于此文件的
../<skill-name>/SKILL.md。读取该文件,并像读取注入内容一样遵循其中的指引。
使用相对路径是有意为之:无需查询目录即可解析,因此即使技能已安装并启用、但位于模型可见目录截断范围之外,也仍然有效——这种情况下,按名称搜索可能会悄无声息地找不到任何结果。
如果两种方式都不可行,请说明无法加载该技能,并在不使用其指引的情况下继续。不得将其指引当作已加载到上下文中来处理。
脚本和实用工具优先使用基于文件的应用
对于快速脚本、实用工具、原型和单文件工具,优先使用 .NET 10 基于文件的应用(dotnet run script.cs),而不是创建包含 .csproj 的完整项目。基于文件的应用:
- 只需要一个
.cs文件——无需项目文件、解决方案或样板代码 - 支持通过
#:package指令使用 NuGet 包 - 通过
#:sdk Microsoft.NET.Sdk.Web支持 ASP.NET Core - 默认支持原生 AOT 发布
- 可用作 Unix shebang(
#!/usr/bin/env dotnet)
当用户要求“写一个脚本”“做一个快速工具”“创建一个实用工具”或任何小型单用途程序时,除非任务明确需要多个源文件或测试项目,否则默认使用基于文件的应用。完整的指令和 CLI 参考请见 dotnet-api 的 references/file-based-apps.md。
// Example: a file-based ASP.NET Core API
#:sdk Microsoft.NET.Sdk.Web
var app = WebApplication.Create(args);
app.MapGet("/", () => "Hello from a single .cs file!");
app.Run();
// Example: a file-based CLI tool with a NuGet package
#:package Spectre.Console
using Spectre.Console;
AnsiConsole.MarkupLine("[green]Hello[/] from a file-based app!");
即使是“简单”问题和澄清请求,也适用此路由流程。加载技能的过程很轻量,有助于确保质量一致。
技能优先级
当多个技能都适用时,按以下顺序使用:
- 先使用流程技能:本技能,然后是
dotnet-advisor。 - 其次使用基线技能:对于任何代码路径,使用
dotnet-csharp。 - 第三使用领域技能:
dotnet-api、dotnet-ui、dotnet-testing、dotnet-devops、dotnet-tooling、dotnet-debugging。 - 第四使用专业 Agent:仅在路由后仍需深入分析时使用。
技能类型
严格(必须完全遵循):本技能、dotnet-advisor 以及基线优先顺序。
灵活(根据上下文调整):领域技能及其配套参考资料。
用户指令定义要做什么。本流程定义执行前如何路由和加载技能。