应文浩wenhao.ying@xiaobao100.com e25ac591a7 init easy-code
2026-04-06 07:24:24 +08:00

12 KiB
Raw Blame History

解决方案结构说明

关联文档:总体概述

本文档描述 FreeCode .NET 解决方案的项目划分方式、各项目职责和相互依赖关系,帮助开发者快速定位代码归属和贡献边界。


1. FreeCode.sln 概览

解决方案包含 17 个源码项目9 个测试项目,合计 26 个项目。整体采用垂直切分策略:每个项目对应一个关注点,通过接口而非直接引用来解耦。

FreeCode.sln
├── 源码项目 (17)
│   ├── FreeCode                  # 主可执行入口
│   ├── FreeCode.Core             # 核心接口与模型
│   ├── FreeCode.Engine           # 查询引擎
│   ├── FreeCode.Tools            # 工具实现
│   ├── FreeCode.Commands         # 命令实现
│   ├── FreeCode.ApiProviders     # LLM API 适配
│   ├── FreeCode.Mcp              # MCP 协议
│   ├── FreeCode.Lsp              # LSP 集成
│   ├── FreeCode.Bridge           # IDE 桥接
│   ├── FreeCode.Services         # 业务服务
│   ├── FreeCode.Tasks            # 后台任务
│   ├── FreeCode.Skills           # 技能系统
│   ├── FreeCode.Plugins          # 插件系统
│   ├── FreeCode.Features         # 特性开关
│   ├── FreeCode.State            # 状态管理
│   └── FreeCode.TerminalUI       # 终端 UI 组件
└── 测试项目 (9)
    ├── FreeCode.Core.Tests
    ├── FreeCode.Engine.Tests
    ├── FreeCode.Tools.Tests
    ├── FreeCode.Commands.Tests
    ├── FreeCode.ApiProviders.Tests
    ├── FreeCode.Mcp.Tests
    ├── FreeCode.Services.Tests
    ├── FreeCode.Tasks.Tests
    └── FreeCode.Integration.Tests

2. 各项目职责说明

项目名 职责 关键类型 依赖项目
FreeCode 主可执行 Console App入口点、DI 容器组装、命令行解析 Program, RootCommand, Startup 全部项目
FreeCode.Core 核心接口与模型25+ 接口、20+ 模型,无外部依赖,是整个解决方案的契约层 ITool, ICommand, IApiProvider, ChatMessage, ToolResult, AppConfig
FreeCode.Engine QueryEngine 协调消息流与工具调用PromptBuilder 构建系统提示词 QueryEngine, PromptBuilder, ToolDispatcher, ConversationHistory Core
FreeCode.Tools 50+ 工具实现按子目录分组FileSystem、Shell、Agent、Web、Mcp、UserInteraction、PlanMode、Swarms、Worktree BashTool, ReadFileTool, GlobTool, GrepTool, AgentTool, BrowserTool, McpTool, PlanModeTool, WorktreeTool Core, Services, Mcp
FreeCode.Commands 70+ 斜杠命令实现,每个命令对应一个类 ClearCommand, CompactCommand, ReviewWorkCommand, InitDeepCommand, RalphLoopCommand Core, Engine, State, Skills
FreeCode.ApiProviders 5 个 LLM 提供商适配Anthropic、OpenAI、Gemini、GitHub Copilot、Bedrock ClaudeProvider, OpenAiProvider, GeminiProvider, CopilotProvider, BedrockProvider Core
FreeCode.Mcp MCP 协议客户端与服务端,传输层实现,工具适配器 McpClient, McpServer, StdioTransport, SseTransport, McpToolWrapper Core
FreeCode.Lsp LSP 客户端集成,支持 goto-definition、find-references、diagnostics、rename LspClient, LspDiagnosticsProvider, LspWorkspaceManager Core
FreeCode.Bridge IDE 桥接层,与 VS Code / JetBrains 等 IDE 扩展通信 BridgeServer, BridgeMessage, IdeEventHandler Core, Services
FreeCode.Services 业务服务层:文件系统抽象、配置管理、权限管理、搜索服务 FileService, ConfigService, PermissionService, RipgrepService, AstGrepService Core
FreeCode.Tasks 后台任务管理任务队列、任务状态跟踪、MCP 监控任务、Workflow 任务 BackgroundTaskManager, TaskQueue, MonitorMcpTask, LocalWorkflowTask Core, Services
FreeCode.Skills 技能系统:技能加载、索引、搜索和执行 SkillLoader, SkillIndex, SkillSearchService, SkillExecutor Core, Services
FreeCode.Plugins 插件系统:通过 AssemblyLoadContext 动态加载插件,插件发现和生命周期管理 PluginLoader, PluginHost, PluginRegistry Core
FreeCode.Features 特性开关系统,控制实验性功能的启用状态,支持编译期和运行期两种模式 FeatureFlags, FeatureRegistry, IFeatureFlag Core
FreeCode.State 应用状态管理,线程安全的状态读写,状态订阅 AppStateStore, ConversationState, SessionState Core
FreeCode.TerminalUI Terminal.Gui v2 组件封装REPL 界面、输出渲染、进度显示 ReplView, OutputPane, StatusBar, ThemeManager Core, State

3. 项目依赖关系图

                        ┌─────────────────┐
                        │   FreeCode.Core  │
                        │  (接口 + 模型)   │
                        └────────┬────────┘
                                 │ 被所有项目引用
           ┌─────────────────────┼──────────────────────────┐
           │                     │                          │
    ┌──────▼──────┐    ┌─────────▼─────────┐    ┌──────────▼────────┐
    │FreeCode.    │    │FreeCode.ApiProviders│   │FreeCode.Services  │
    │Features     │    │(LLM 适配层)        │    │(文件/搜索/配置)   │
    └──────┬──────┘    └─────────┬─────────┘    └──────────┬────────┘
           │                     │                          │
    ┌──────▼──────┐    ┌─────────▼─────────┐    ┌──────────▼────────┐
    │FreeCode.    │    │  FreeCode.Engine   │    │  FreeCode.Mcp     │
    │State        │    │  (QueryEngine)     │    │  (MCP 协议)       │
    └──────┬──────┘    └─────────┬─────────┘    └──────────┬────────┘
           │                     │                          │
    ┌──────▼─────────────────────▼──────────────────────────▼────────┐
    │                       FreeCode.Tools                            │
    │               (50+ 工具, 依赖 Services + Mcp)                   │
    └──────────────────────────┬─────────────────────────────────────┘
                               │
          ┌────────────────────┼────────────────────┐
          │                    │                    │
   ┌──────▼──────┐    ┌────────▼───────┐   ┌───────▼────────┐
   │FreeCode.    │    │FreeCode.Skills  │   │FreeCode.Tasks  │
   │Commands     │    │(技能系统)       │   │(后台任务)      │
   └──────┬──────┘    └────────┬───────┘   └───────┬────────┘
          │                    │                    │
          └────────────────────┼────────────────────┘
                               │
                    ┌──────────▼─────────┐
                    │  FreeCode.TerminalUI│
                    │  (Terminal.Gui 组件)│
                    └──────────┬─────────┘
                               │
               ┌───────────────▼────────────────┐
               │         FreeCode (主入口)        │
               │  DI 组装 + CLI + 程序生命周期    │
               └────────────────────────────────┘

   独立模块 (通过接口与主流程交互):
   ┌──────────────┐  ┌──────────────┐  ┌──────────────┐
   │FreeCode.Lsp  │  │FreeCode.Bridge│  │FreeCode.Plugins│
   │(LSP 客户端)  │  │(IDE 桥接)    │  │(动态插件)    │
   └──────────────┘  └──────────────┘  └──────────────┘

4. Directory.Build.props 共享配置

所有项目共享一个根级别的 Directory.Build.props,统一配置编译选项,避免在每个 .csproj 中重复:

<Project>
  <PropertyGroup>
    <!-- 语言版本 -->
    <LangVersion>13.0</LangVersion>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>

    <!-- 目标框架 -->
    <TargetFramework>net10.0</TargetFramework>

    <!-- AOT 编译 (仅主项目覆盖为 true) -->
    <PublishAot>false</PublishAot>
    <PublishTrimmed>false</PublishTrimmed>
    <IsAotCompatible>true</IsAotCompatible>

    <!-- 警告即错误 -->
    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
    <WarningsAsErrors />
    <NoWarn>CS1591</NoWarn>

    <!-- 分析器 -->
    <EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>
    <AnalysisLevel>latest-recommended</AnalysisLevel>

    <!-- 版本管理 -->
    <Version>0.1.0</Version>
    <AssemblyVersion>0.1.0.0</AssemblyVersion>
  </PropertyGroup>

  <!-- 测试项目特定设置 -->
  <PropertyGroup Condition="$(MSBuildProjectName.EndsWith('.Tests'))">
    <IsTestProject>true</IsTestProject>
    <IsAotCompatible>false</IsAotCompatible>
  </PropertyGroup>
</Project>

主项目 FreeCode.csproj 在此基础上覆盖 AOT 相关设置:

<PropertyGroup>
  <OutputType>Exe</OutputType>
  <PublishAot>true</PublishAot>
  <PublishTrimmed>true</PublishTrimmed>
  <InvariantGlobalization>true</InvariantGlobalization>
  <StripSymbols>true</StripSymbols>
</PropertyGroup>

5. 测试项目结构

9 个测试项目覆盖核心业务逻辑,遵循一对一映射原则(一个源码项目对应一个测试项目),加一个集成测试项目。

测试项目 对应源码项目 测试重点
FreeCode.Core.Tests FreeCode.Core 模型验证、接口约定、序列化正确性
FreeCode.Engine.Tests FreeCode.Engine QueryEngine 消息流、工具调度逻辑、PromptBuilder 输出
FreeCode.Tools.Tests FreeCode.Tools 各工具的单元行为,沙箱文件系统,进程调用 mock
FreeCode.Commands.Tests FreeCode.Commands 命令解析、执行逻辑、输出格式
FreeCode.ApiProviders.Tests FreeCode.ApiProviders 请求构建、响应解析、错误处理、流式解析
FreeCode.Mcp.Tests FreeCode.Mcp JSON-RPC 消息编解码、传输层、客户端生命周期
FreeCode.Services.Tests FreeCode.Services 文件服务、配置加载、权限检查、搜索结果解析
FreeCode.Tasks.Tests FreeCode.Tasks 任务队列背压、取消、状态转换
FreeCode.Integration.Tests 全部项目 端到端命令执行,真实 API可选通过环境变量控制

测试框架统一使用 xUnit 2.x + FluentAssertions 6.x + Moq 4.x。集成测试通过 [Trait("Category", "Integration")] 标注,默认 CI 跳过,本地按需运行:

dotnet test --filter "Category!=Integration"
dotnet test --filter "Category=Integration"  # 需要设置 ANTHROPIC_API_KEY