<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>开发指南 on AGW</title><link>https://agw-docs.pages.dev/zh/docs/development/</link><description>Recent content in 开发指南 on AGW</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Fri, 25 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://agw-docs.pages.dev/zh/docs/development/index.xml" rel="self" type="application/rss+xml"/><item><title>开发环境与运行</title><link>https://agw-docs.pages.dev/zh/docs/development/setup/</link><pubDate>Fri, 25 Sep 2026 00:00:00 +0000</pubDate><guid>https://agw-docs.pages.dev/zh/docs/development/setup/</guid><description>&lt;p&gt;前提：.NET 10 SDK、Node.js 24、pnpm 12.5.1（版本由 &lt;code&gt;src/clients/package.json&lt;/code&gt; 的 &lt;code&gt;packageManager&lt;/code&gt; 指定）和 Git。只有构建容器镜像时才需要 Docker Buildx。以下应用命令在 AGW 仓库执行，文档站本身不依赖这些工具链。&lt;/p&gt;</description></item><item><title>架构与模块边界</title><link>https://agw-docs.pages.dev/zh/docs/development/architecture/</link><pubDate>Fri, 25 Sep 2026 00:00:00 +0000</pubDate><guid>https://agw-docs.pages.dev/zh/docs/development/architecture/</guid><description>&lt;p&gt;本页帮助开发者判断一项改动应放在哪个模块、哪一层。AGW 按业务拆分代码，例如 Agents、Projects 和 Jobs；它们可以共享一个部署进程和数据库，但各自负责自己的数据和操作。&lt;/p&gt;</description></item><item><title>API 与执行协议</title><link>https://agw-docs.pages.dev/zh/docs/development/api/</link><pubDate>Fri, 25 Sep 2026 00:00:00 +0000</pubDate><guid>https://agw-docs.pages.dev/zh/docs/development/api/</guid><description>&lt;p&gt;AGW 的管理操作和任务执行使用不同接口。创建或查询配置使用普通 HTTP JSON API；持续接收 Agent 回复和状态使用 SignalR 执行连接；对接其他 Agent 系统时可以使用 A2A。&lt;/p&gt;&#10;&lt;p&gt;接入前，先准备可访问的开发 Server 和有效的认证身份，例如 API Key 或浏览器登录会话。具体参数以运行实例的 OpenAPI 及所属模块 &lt;code&gt;Contracts&lt;/code&gt; 中的类型定义为准，避免照抄与运行版本不一致的请求。&lt;/p&gt;</description></item><item><title>扩展 Tools 与 Integrations</title><link>https://agw-docs.pages.dev/zh/docs/development/extensions/</link><pubDate>Fri, 25 Sep 2026 00:00:00 +0000</pubDate><guid>https://agw-docs.pages.dev/zh/docs/development/extensions/</guid><description>&lt;p&gt;扩展前先确定要增加什么：一个具体操作可以写成 Tool，一组任务说明和专属工具可以通过 Skill 提供，需要用户连接外部账号的能力则适合 Integration。&lt;/p&gt;&#10;&lt;p&gt;先阅读&lt;a href="https://agw-docs.pages.dev/zh/docs/development/architecture/"&gt;模块边界&lt;/a&gt;，确认能力由哪个模块负责。本页说明放置代码、注册能力和验证调用的顺序；具体声明写法可参考文末的工具示例。&lt;/p&gt;&#10;&lt;h2 id="工具扩展路径"&gt;工具扩展路径&#10;&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;手写的 &lt;code&gt;IAgwTool&lt;/code&gt;、&lt;code&gt;IContextualTool&lt;/code&gt; 和 &lt;code&gt;IToolBlock&lt;/code&gt; 实现放在 &lt;code&gt;Agw.Tools&lt;/code&gt;，全局目录只扫描这个程序集中的手写工具。业务工具放在所属模块的 &lt;code&gt;Application/Tools&lt;/code&gt;，以 Attribute 容器声明或通过 Skill 提供，DTO 放 &lt;code&gt;Contracts/Tools&lt;/code&gt;。&lt;/li&gt;&#10;&lt;li&gt;引用 &lt;code&gt;Agw.Tools.Abstractions&lt;/code&gt;，需要 Attribute 声明时将 &lt;code&gt;Agw.Tools.Generators&lt;/code&gt; 作为 Analyzer 引用。&lt;/li&gt;&#10;&lt;li&gt;显式声明权限、参数说明和返回类型。独立工具及使用 Attribute 声明的工具容器不能保存会话状态；状态放在 Provider、会话对象或所属存储中。&lt;/li&gt;&#10;&lt;li&gt;在所属模块注册所需服务与生成声明。选择通过 Skill 提供，或显式加入全局目录。&lt;/li&gt;&#10;&lt;li&gt;验证工具发现、参数、权限、项目绑定和错误映射。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;生成器输出元数据、JSON Schema 和直接调用委托。不要加入运行时反射扫描兜底。Skill 工具有两个来源：&lt;code&gt;IAgentSkillRegistration.Tools&lt;/code&gt; 提供手写的 &lt;code&gt;IProjectScopedAgwTool&lt;/code&gt; 实例，&lt;code&gt;ToolTypes&lt;/code&gt; 提供 Attribute 容器类型（由 &lt;code&gt;IAgwToolSet&amp;lt;T&amp;gt;&lt;/code&gt; 生成）。它们在执行时绑定 Project，不因注册生成模块就自动进入全局目录。&lt;/p&gt;</description></item><item><title>测试与贡献约定</title><link>https://agw-docs.pages.dev/zh/docs/development/testing/</link><pubDate>Fri, 25 Sep 2026 00:00:00 +0000</pubDate><guid>https://agw-docs.pages.dev/zh/docs/development/testing/</guid><description>&lt;p&gt;前提：依赖已安装。修改前阅读根目录 &lt;code&gt;AGENTS.md&lt;/code&gt; 和 &lt;code&gt;docs/human/&lt;/code&gt; 中的相关规则，保留无关的本地改动。&lt;/p&gt;&#10;&lt;h2 id="后端检查"&gt;后端检查&#10;&lt;/h2&gt;&#10;&lt;p&gt;从仓库根运行：&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-d16a102e-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="bash" data-td-line-count="3"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-d16a102e-fence-0-viewport" data-td-code-viewport&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dotnet build Agw.slnx&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dotnet &lt;span class="nb"&gt;test&lt;/span&gt; Agw.slnx&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dotnet csharpier check .&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;测试项目使用 xUnit v3，并通过根目录 &lt;code&gt;global.json&lt;/code&gt; 使用 Microsoft.Testing.Platform 运行。定位问题时先运行相关测试，例如 &lt;code&gt;dotnet test tests/Agw.Files.Tests&lt;/code&gt;。单元和组合测试使用真实实现和纯选项辅助方法，不使用 mock 或 fake 实现。构造 &lt;code&gt;CodexAIAgent&lt;/code&gt; 或 &lt;code&gt;ClaudeCodeAIAgent&lt;/code&gt; 时会探测 CLI，这类测试作为真实 CLI 测试运行，需要显式启用并确认可执行文件可用，不放进默认测试套件。&lt;/p&gt;</description></item></channel></rss>