mcpField
U
using-dotnet

using-dotnet

github.com/novotnyllcAgent 工作流234110 次安装2 周前更新
代码仓库

关于 using-dotnet

using-dotnet 是面向 Agent 的技能,在规划或实现前,将 .NET 和 C# 任务路由到相关指南。它强调按版本加载技能,并让方案复杂度与任务相称。

主要功能

  1. 01从提示和仓库文件检测 .NET 意图
  2. 02通过 dotnet-advisor 路由任务
  3. 03规定技能加载顺序和优先级
  4. 04倡导简单易读的实现
  5. 05小型工具优先采用文件型应用

适用场景

  1. 01开始处理 .NET 仓库中的任务
  2. 02为特定领域的 .NET 任务选择指南
  3. 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# 时,请先按以下顺序操作,再执行任何其他操作:

  1. 检测 .NET 意图 — 查找提示词关键词(C#、.NET、ASP.NET、EF Core、Blazor、MAUI、NuGet、csproj)或仓库信号(.sln、.slnx、.csproj、global.json、.cs 文件)。如果存在任一项,则继续。
  2. 在 .NET 仓库中,默认使用 .NET — 存在仓库信号时,对于“给我构建一个 Web 应用”“添加一个仪表板”“写一个脚本”或“创建一个电子表格”等含糊请求,应使用 .NET 解决方案(ASP.NET Core、Blazor、.NET 基于文件的应用、Open XML SDK),而不是默认使用 JavaScript/Python。用户选择 .NET 项目是有原因的。
  3. 检查 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 视为阻碍——安装后继续。
  4. 加载 dotnet-advisor — 如何操作请参阅下文“加载其他技能”。
  5. 遵循顾问的路由建议 — 按相同方式加载 dotnet-csharp 基础技能,然后加载顾问选定的领域技能。
  6. 现在作出响应 — 在加载正确的上下文后,进行澄清、规划、探索或实现。

加载其他技能

name 是描述性文本,并非调用指令。Codex 会在注入路由器技能之前,从原始轮次输入中收集显式技能;不会重新扫描注入的文本以查找嵌套提及——因此,仅在此文件中提及技能名称并不会加载该技能。请如实说明你实际执行的操作;不要因为提到某个技能,就声称已调用它。

按以下顺序通过两种方式之一加载:

  1. 原生调用(主机支持时)。 在 Claude Code 中,使用带限定名称的 Skill 工具,例如 dotnet-artisan:dotnet-api。这种方式会保留技能的元数据、策略和依赖项,因此只要可用,就优先使用。
  2. 读取文件(主机不支持时)。 此插件中的每项技能都位于同级目录,因此目标文件始终是相对于此文件的 ../<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!");

即使是“简单”问题和澄清请求,也适用此路由流程。加载技能的过程很轻量,有助于确保质量一致。

技能优先级

当多个技能都适用时,按以下顺序使用:

  1. 先使用流程技能:本技能,然后是 dotnet-advisor。
  2. 其次使用基线技能:对于任何代码路径,使用 dotnet-csharp。
  3. 第三使用领域技能:dotnet-api、dotnet-ui、dotnet-testing、dotnet-devops、dotnet-tooling、dotnet-debugging。
  4. 第四使用专业 Agent:仅在路由后仍需深入分析时使用。

技能类型

严格(必须完全遵循):本技能、dotnet-advisor 以及基线优先顺序。

灵活(根据上下文调整):领域技能及其配套参考资料。

用户指令定义要做什么。本流程定义执行前如何路由和加载技能。

评论

支持 Markdown