diff --git a/AGENT_RULES.local.md b/AGENT_RULES.local.md new file mode 100644 index 0000000..2456676 --- /dev/null +++ b/AGENT_RULES.local.md @@ -0,0 +1,104 @@ +# AGENT_RULES.local + +目的:记录 tsl-devkit 项目私有规则,优先级高于 `AGENT_RULES.md`。 + +## 架构参考 + +理解项目结构前,必须阅读 `memory-bank/architecture.md`,重点关注: + +- Core / Manager / Provider / Language / Bridge 分层边界 +- LSP 请求从 `Dispatcher` 到 Provider 的调用链 +- Tree-sitter + AST + Semantic 的分析链路 +- C++23 Modules 与构建约束 + +涉及协议与能力面时,还需同步阅读: + +- `memory-bank/project-brief.md` +- `memory-bank/tech-stack.md` + +## 代码/架构约束 + +- 禁止无需求变更 LSP 协议对外行为:`method` 字符串、协议字段命名、响应结构保持兼容 +- 禁止破坏现有分层:Provider 不直接承载 Manager/Language 的底层实现细节 +- 换行符必须遵循 `.gitattributes` 规则,以该文件中的配置为准 +- 禁止提交构建产物和临时文件:`lsp-server/build/**`、运行日志、临时脚本输出 +- `docs/standards/playbook/` 为 vendored 快照;更新优先使用 subtree + 同步脚本,不做无依据手改 + +## Tree-sitter / AST 变更规则 + +新增或修改语法/解析链路时: + +1. 优先修改语法源和解析逻辑(如 `grammar.js`、AST 反序列化逻辑) +2. `lsp-server/src/tree-sitter/` 与 `lsp-server/test/test_tree_sitter/src/` 下同名 parser/scanner 文件必须保持一致 +3. 修改 AST 节点结构时,同步更新 `types/deserializer/debug_printer/test` 路径 +4. 对行为变更补最小复现测试(优先 `test_ast --self-test` 或对应目录单测) +5. 汇报中必须写清“语法层问题 / AST 层问题 / 语义层问题”归因 + +## 项目特有提示词 + +执行以下任务时必须先读取对应提示词: + +| 任务类型 | 提示词路径 | +| --- | --- | +| 需求澄清 | `docs/prompts/coding/clarify.md` | +| 代码复盘/评审总结 | `docs/prompts/coding/review.md` | +| 代理行为/工作模式 | `docs/prompts/system/agent-behavior.md` | +| 生成新提示词 | `docs/prompts/meta/prompt-generator.md` | + +## 测试与验证规则 + +- 执行测试前,若构建目录不可用,先按“标准构建命令”完成依赖安装与编译 +- AST/解析改动至少执行: + - `ctest --test-dir lsp-server/build/clang-linux/Release -R test_ast_unit --output-on-failure` + - `ctest --test-dir lsp-server/build/clang-linux/Release -R test_ast_script --output-on-failure` +- Provider/协议改动至少执行: + - `ctest --test-dir lsp-server/build/clang-linux/Release -R test_provider --output-on-failure` + - `ctest --test-dir lsp-server/build/clang-linux/Release -R test_lsp_json --output-on-failure` +- 语义/符号改动至少执行: + - `ctest --test-dir lsp-server/build/clang-linux/Release -R test_semantic --output-on-failure` + - `ctest --test-dir lsp-server/build/clang-linux/Release -R test_symbol --output-on-failure` +- 若存在已知失败项,必须在汇报中标注失败文件、最小复现结果、是否与本次改动相关 + +## 标准构建命令(Linux / Clang) + +默认构建目录:`lsp-server/build/clang-linux/Release` + +```bash +# 1) 安装依赖(Conan) +CONAN_HOME=/tmp/conan-home conan install lsp-server \ + -pr:h=lsp-server/conan/profiles/linux-x86_64-clang \ + -pr:b=lsp-server/conan/profiles/linux-x86_64-clang \ + -of lsp-server/build/clang-linux/Release \ + --build=missing + +# 2) 配置(CMake + Ninja) +cmake -S lsp-server -B lsp-server/build/clang-linux/Release -G Ninja \ + -DCMAKE_TOOLCHAIN_FILE=$PWD/lsp-server/build/clang-linux/Release/generators/conan_toolchain.cmake \ + -DBUILD_TESTS=ON + +# 3) 编译 +cmake --build lsp-server/build/clang-linux/Release +``` + +常用目标编译: + +```bash +cmake --build lsp-server/build/clang-linux/Release --target tsl-server +cmake --build lsp-server/build/clang-linux/Release --target test_ast +``` + +## Git 提交规则 + +- 提交首行必须使用 `:emoji: type(scope): subject` 格式 +- `emoji` 与 `type` 映射以 `docs/standards/playbook/docs/common/commit_message.md` 为准 +- `subject` 使用英文(建议现在时/祈使句,不加句号) +- 不允许中文提交标题;中文说明放在 commit body + +## 紧急处理 + +- 构建/测试环境异常(例如 Conan 缓存、CMake 缓存、路径映射问题)优先记录可复现命令与原始报错 +- 若遇到跨环境阻塞,按 `AGENT_RULES.md` 的 `blocked: env:<环境>:` 规范记录并继续主循环 + +--- + +**最后更新**:2026-03-05 diff --git a/lsp-server/conanfile.txt b/lsp-server/conanfile.txt index c80878d..bd92893 100644 --- a/lsp-server/conanfile.txt +++ b/lsp-server/conanfile.txt @@ -1,5 +1,5 @@ [requires] -glaze/6.4.0 +glaze/7.0.2 spdlog/1.17.0 fmt/12.1.0 taskflow/3.10.0 diff --git a/lsp-server/src/language/ast/types.cppm b/lsp-server/src/language/ast/types.cppm index 8fc21a8..77c4a64 100644 --- a/lsp-server/src/language/ast/types.cppm +++ b/lsp-server/src/language/ast/types.cppm @@ -1210,7 +1210,7 @@ export namespace lsp::language::ast std::string name; std::vector> parameters; std::optional return_type; - bool is_overload; + bool is_overload = false; }; class FunctionDefinition : public Statement @@ -1369,7 +1369,7 @@ export namespace lsp::language::ast void Accept(ASTVisitor& visitor) override { visitor.VisitConditionalBlock(*this); } public: - ConditionalCompilationType type; + ConditionalCompilationType type = ConditionalCompilationType::kIfDef; std::string name; Location location; std::vector consequence; @@ -1383,7 +1383,7 @@ export namespace lsp::language::ast void Accept(ASTVisitor& visitor) override { visitor.VisitConditionalDirective(*this); } public: - ConditionalCompilationType type; + ConditionalCompilationType type = ConditionalCompilationType::kDefine; std::string name; Location location; }; diff --git a/lsp-server/test/test_ast/CMakeLists.txt b/lsp-server/test/test_ast/CMakeLists.txt index 96a7cdf..4d59a06 100644 --- a/lsp-server/test/test_ast/CMakeLists.txt +++ b/lsp-server/test/test_ast/CMakeLists.txt @@ -66,6 +66,8 @@ target_compile_options( $<$:-O3>) if(BUILD_TESTS) + add_test(NAME test_ast_unit + COMMAND $ --self-test) add_test(NAME test_ast_script COMMAND ${CMAKE_COMMAND} -E env TEST_AST_OVERRIDE=$ diff --git a/memory-bank/architecture.md b/memory-bank/architecture.md index 71cda04..95442fd 100644 --- a/memory-bank/architecture.md +++ b/memory-bank/architecture.md @@ -12,7 +12,17 @@ graph TB subgraph Core["Core"] direction LR - S["Server"] ~~~ D["Dispatcher"] ~~~ A["AsyncExecutor"] + S["Server"] ~~~ D["Dispatcher"] + end + + subgraph Scheduler["Scheduler"] + direction LR + A["AsyncExecutor"] + end + + subgraph Codec["Codec"] + direction LR + C1["Facade"] ~~~ C2["Transformer"] end subgraph Provider["Provider"] @@ -35,10 +45,13 @@ graph TB B1["Glaze"] ~~~ B2["Tree-sitter"] ~~~ B3["Taskflow"] ~~~ B4["spdlog"] end - Core --> Provider & Manager + Core --> Provider & Manager & Scheduler + Core --> Codec Provider --> Manager & Language Manager --> Language & Bridge Language --> Bridge + Scheduler --> Bridge + Codec --> Bridge end ``` @@ -52,6 +65,25 @@ graph TB - `src/core/server.cppm` - 服务器主循环,stdio 读写 - `src/core/dispatcher.cppm` - 请求分发器,路由到对应 Provider +- `src/core/bootstrap.cppm` - 服务器启动初始化 + +### Scheduler - 异步调度 + +**职责**:管理异步任务的执行、取消和生命周期 + +**关键文件**: + +- `src/scheduler/async_executor.cppm` - 异步任务执行器,基于 Taskflow 实现 + +### Codec - 编解码 + +**职责**:封装 JSON 序列化/反序列化,提供统一的 LSP 消息编解码接口 + +**关键文件**: + +- `src/codec/facade.cppm` - 序列化门面,`Serialize` / `Deserialize` 统一入口 +- `src/codec/transformer.cppm` - LSPAny 类型转换 +- `src/codec/common.cppm` - 公共类型 ### Manager - 状态管理 @@ -63,6 +95,7 @@ graph TB - `src/manager/parser.cppm` - 解析管理,维护语法树缓存 - `src/manager/symbol.cppm` - 符号管理,维护符号索引 - `src/manager/event_bus.cppm` - 事件总线,模块间解耦通信 +- `src/manager/events.cppm` - 事件类型定义 - `src/manager/manager_hub.cppm` - 管理器集线器,统一访问入口 ### Provider - LSP 功能提供者 @@ -80,6 +113,10 @@ graph TB - `src/provider/call_hierarchy/` - 调用层次 - `src/provider/type_hierarchy/` - 类型层次 - `src/provider/workspace_symbol/` - 工作区符号搜索 +- `src/provider/initialize/`, `src/provider/initialized/`, `src/provider/shutdown/`, `src/provider/exit/` - 生命周期管理 +- `src/provider/cancel_request/` - 请求取消 +- `src/provider/workspace/`, `src/provider/window/`, `src/provider/client/` - 协议通道管理 +- `src/provider/trace/`, `src/provider/telemetry/` - 追踪与遥测 ### Language - 语言分析 @@ -149,4 +186,4 @@ graph TB --- -**最后更新**:2026-02-02 +**最后更新**:2026-03-04