Skip to content

[Feat] Fully synchronized tool development / 完全同步的工具开发#15

Merged
SunYanbox merged 52 commits intomainfrom
feat/sync
Apr 27, 2026
Merged

[Feat] Fully synchronized tool development / 完全同步的工具开发#15
SunYanbox merged 52 commits intomainfrom
feat/sync

Conversation

@SunYanbox
Copy link
Copy Markdown
Owner

No description provided.

- 重构优化:优化跨平台换行一致性处理
  * 修改文件 .prettierrc.yml
  * endOfLine 参数由 lf 更改为 auto
- 新增功能:实现文件路径访问边界的安全控制逻辑
  * 新增 `src/workspace/path_validator.py` 定义 `PathValidator` 类构造函数接收 `workspace_root` 默认值为 `.`
  * 实现 `validate` 方法调用 `Path.resolve()` 解析路径并通过 `startswith(str(self.root)` 校验边界
  * 引入 `WorkspaceBoundaryError` 与 `PathNotFoundError` 自定义异常并在 `raise` 语句中指定错误信息
- 单元测试:补充核心功能的回归测试覆盖
  * 新增 `tests/workspace/test_path_validator.py` 继承 `unittest.TestCase` 配置 `setUp` 与 `tearDown` 环境
  * 实施 `test_escape_prevention` 验证 `../` 路径被拒绝以及 `test_symlink_escape` 检测符号链接逃逸
- 项目结构:初始化模块包结构支持导入
  * 补全 `src/__init__.py`, `src/workspace/__init__.py`, `tests/__init__.py`, `tests/workspace/__init__.py` 目录初始化文件
- 重构优化: 调整测试覆盖策略
  * 在 `path_validator.py` 的 `PermissionError` 抛出处添加 `# pragma: no cover` 标记
  * 明确该分支因需专门准备权限环境而不再纳入单元测试范围
- 新增功能: 开发 `ToolRegistry` 单例类,支持同步/异步函数注册、参数提取及结果压缩
  * 引入 `register` 装饰器和 `register_function` 方法,自动处理函数签名和文档提取
  * 实现 `_compress_result` 逻辑,根据配置截断超长字符串、列表和字典结果
  * 集成 `nest_asyncio` 以在现有事件循环中安全执行异步工具
  * 提供 `generate_markdown` 和 `get_tool_info` 用于工具文档生成与信息检索
- 修复问题: 添加配置验证与异常捕获机制
  * `_validate_config` 确保阈值参数不低于最小值并自动修正
  * `_validate_tool_info` 对过长名称或文档发出警告
  * `execute` 方法包裹异常,将错误信息格式化为返回字符串而非抛出
- 重构优化: 完善模块结构与依赖管理
  * 创建 `src/core/tool_registry.py` 核心模块并导出 `ToolInfo` 数据类
  * 在 `requirements.txt` 中添加 `nest-asyncio` 依赖以支持混合模式执行
- 新增功能: 实现 `ToolErrorResponse` 数据类用于标准化工具调用错误信息
  * 支持通过 `tool_name` 和 `errors` (str 或 Exception) 初始化
  * 异常对象自动转换为 `ClassName(message)` 格式存储于 `errors` 属性
  * 提供 `to_str()` 和 `__str__()` 方法返回 `<tool_name=..., errors=... />` 格式的字符串
- 文档更新: 补充 `ToolErrorResponse` 类的单元测试覆盖
  * 验证字符串与异常对象两种初始化场景
  * 测试空字符串、特殊字符及参数化多种错误类型输入
- 新增功能: 提供基于路径验证的文件读写与目录浏览工具
  * 新增 `Workspace` 类,集成 `PathValidator` 进行边界检查
  * 实现 `read_file` 方法,支持相对路径读取并捕获 `PathNotFoundError` 和 `WorkspaceBoundaryError`
  * 实现 `ls` 方法,列出指定目录下的文件和文件夹,返回格式化字符串列表
  * 实现 `glob` 方法,支持通配符模式匹配文件路径
  * 所有方法通过 `@_tool_registry.register()` 装饰器注册到工具中心
- 文档更新: 补充单元测试覆盖核心逻辑
  * 在 `tests/workspace/test_workspace.py` 中建立测试套件
  * 测试 `test_initialization` 验证初始化参数及 Git 仓库检测
  * 测试 `test_read_file_valid` 和 `test_read_file_not_found` 验证文件读取流程
  * 测试 `test_ls_current_directory` 和 `test_glob_pattern` 验证目录遍历与模式匹配
- 新增功能: 添加 `parse_func_call` 函数用于提取函数名称及参数
  * 支持从 `<func_call>` 标签包裹的 JSON 中解析 `func_name`, `args`, `kwargs`
  * 处理空参数列表和空参数字典的场景
- 修复问题: 增强输入验证与异常处理机制
  * 校验内容是否以 `<func_call>` 开头且以 `</func_call>` 结尾,否则抛出 ValueError
  * 捕获非法 JSON 格式并抛出 `json.JSONDecodeError`
- 新增功能: 引入 isolate_tool_registry 自动夹具
  * 在测试前后自动保存并重置 ToolRegistry._instance 为 None
  * 确保每个测试用例获得独立的 ToolRegistry 实例,避免状态污染
- 修复问题: 清理冗余的单例重置逻辑
  * 移除 test_validate_config 中手动操作 ToolRegistry._instance 的代码
  * 消除测试间依赖风险
- 新增功能: 引入系统剪贴板与键盘控制依赖
  * 在 requirements.txt 中新增 pyperclip 和 keyboard 库以支持自动复制结果及模拟按键操作
- 修复问题: 增强函数调用参数解析的健壮性
  * 修改 src/core/parse_func_call.py,将 result["args"] 和 result["kwargs"] 改为使用 .get() 方法并设置默认空列表或字典,防止因缺少字段抛出异常
- 重构优化: 改进工具注册机制与错误响应逻辑
  * 移除 src/workspace/workspace.py 中的全局 ToolRegistry 单例依赖,取消 @_tool_registry.register() 装饰器
  * 更新 src/core/tool_registry.py 中的 to_markdown 方法,改用 extract_params 动态提取参数信息
  * 修正 src/workspace/workspace.py 中 read_file、ls、glob 方法的错误处理,统一使用 self.read_file.__name__ 等动态获取方法名替代硬编码字符串
- 文档更新: 完善环境配置示例
  * 新增 .env.example 文件,包含 TOOL_MAX_DOC_LENGTH、MANUALAID_AUTO_VIEW 等 27 项配置项说明
- 测试调整: 优化单元测试隔离策略
  * 调整 tests/core/test_tool_registry.py 中 isolate_tool_registry 生成器的注释格式,确保语法正确
- 新增功能: 构建基于 Rich 的命令行交互界面
  * 在 `src/console/main.py` 中实现 REPL 循环,集成 `parse_input` 解析用户指令
  * 添加 `pick_folder` 函数用于通过 Tkinter 选择工作空间目录
  * 支持 `/copy`, `/view`, `/history`, `/tools` 等命令执行工具调用或管理结果
  * 引入 `interactive_viewer.py` 提供基于键盘 (↑/↓, Enter, Delete) 的交互式结果浏览功能
  * 实现 `result_manager.py` 管理结果历史、自动复制到剪贴板及过期清理逻辑
- 重构优化: 完善命令解析与工具注册机制
  * 在 `input_parser.py` 中定义 `CommandResult` 数据类,解析 `/copy <n>`, `/view_remove <n>` 等正则模式
  * 在 `main.py` 的 `init_workspace` 中自动注册 `workspace.glob`, `ls`, `read_file` 等核心工具
  * 增加 `_detect_language` 函数根据文件扩展名自动识别语法高亮语言
  * 配置 `pyproject.toml` 将 `manualaid` 注册为可执行脚本入口
- 新增功能: 引入第三方库以支持异步编程及剪贴板操作
  * 添加 `pytest-asyncio` 用于异步测试用例执行
  * 添加 `nest-asyncio` 解决事件循环冲突问题
  * 添加 `pyperclip` 实现跨平台剪贴板读写
  * 添加 `keyboard` 监听系统键盘事件
- 重构优化: 清理未使用的构建依赖并更新版本约束
  * 移除 `packaging==26.1` 依赖项
  * 在 `pyproject.toml` 的 `dependencies` 数组中补充新引入的包
- 修复问题: 修正测试用例以匹配当前实现逻辑
  * `test_in_wrapper`: 添加 `pytest.warns(UserWarning)` 上下文管理器,验证 `ToolRegistry.register` 在已存在名称时抛出警告
  * `test_workspace.py`: 将 `test_ls_non_dir` 和 `test_ls_outside_workspace` 中的断言从 `tool_name=read_file` 更新为 `tool_name=ls`,确保与实际返回的工具名称一致
- 新增功能: 扩展 Workspace 核心工具集
  * 新增 `read_file_lines` 方法,支持按行号范围读取文件内容并格式化输出行号
  * 新增 `search_content` 方法,基于正则表达式递归搜索文件内容,支持排除目录、大小写控制及多线程并发处理 (`ThreadPoolExecutor`)
  * 新增 `write` 方法,支持全局或指定行范围 (`start_line`, `end_line`) 的字符串替换,并提供详细的错误定位与操作指引
  * 引入私有方法 `_highlight_matches` 和 `_search_in_file` 用于结果高亮显示和单文件异步搜索逻辑
  * 将 `Workspace` 类改造为单例模式 (Singleton),通过重写 `__new__` 确保同一工作区路径仅存在一个实例
- 重构优化: 改进现有 API 文档与交互体验
  * 更新 `read_file` 文档,明确失败时返回错误描述而非抛出异常
  * 更新 `ls` 和 `glob` 文档,强调返回结果包含 `[Folder]`/`[File]` 类型标记
  * 优化所有公共方法的异常捕获逻辑,统一使用 `ToolErrorResponse` 返回结构化错误信息
- 新增功能: 实现基于 Command/Handler 模式的模块化架构
  * 引入 `REPL` 类作为统一入口,解耦主流程逻辑
  * 新增 `CommandRegistry` 管理所有控制台命令注册与分发
  * 拆分 `CommandHandler` 和 `ToolHandler` 分别处理指令与工具调用
  * 创建 `src/console/commands` 模块包含 `HelpCommand`, `QuitCommand`, `ToolsCommand` 等具体命令实现
- 重构优化: 提取通用工具函数至独立模块
  * 将 `_format_tool_params`, `_detect_language`, `_create_result_title` 移至 `OutputFormatter` 类 (`src/console/ui/formatters.py`)
  * 将文件扩展名映射提取为 `EXTENSION_TO_LANGUAGE` 常量 (`src/constants/files.py`)
  * 将帮助信息提取为 `HELP_MESSAGE` 常量 (`src/constants/commands.py`)
  * 移除 `src/console/main.py` 中冗余的辅助函数定义
- 修复问题: 增强路径验证与写入逻辑
  * `PathValidator.validate` 增加 `create_file_if_not_exist` 参数支持自动创建文件
  * `Workspace.write` 方法签名更新为支持 `int | None` 类型,优化行范围切片逻辑
  * 修正 `write` 方法中多行字符串拼接及列表重组逻辑
- 文档更新: 补充测试用例注释
  * 在 `test_tool_registry.py` 中为警告测试添加空行以符合代码风格
- 重构优化: 移除硬编码的常量依赖并统一命令注册机制
  * 删除 `src/constants/commands.py` 中的 `HELP_MESSAGE` 常量定义
  * 将 `HelpCommand` 从 `system_commands.py` 迁移至 `repl.py` 并注入 `CommandRegistry` 依赖
  * 修改 `CommandRegistry.list_commands` 返回类型,由元组列表改为 `list[Command]` 对象列表
  * 在 `REPL.__init__` 中动态注册 `HelpCommand` 实例,替代原有的静态导入和直接打印逻辑
- 文档更新: 增强 LLM 工具调用提示词的规范性和约束性
  * 在 `workspace_commands.py` 的 `generate_workspace_prompt` 函数中新增 JSON 格式转义规则说明(双引号、反斜杠、换行符)
  * 添加 `SYSTEM CONSTRAINTS` 章节,明确禁止模型幻觉及强制要求停止生成文本的逻辑
- 新增功能: 实现多级 JSON 解析回退机制
  * 引入 `_robust_json_parse` 函数,优先尝试标准 `json.loads`,失败后降级使用 `ast.literal_eval` 支持单引号
  * 新增 `_fix_unescaped_quotes` 状态机算法,自动修复字符串内未转义的双引号和换行符
  * 重构 `parse_func_call` 主逻辑,在整体解析失败时自动切换至 `_manual_extract` 正则提取方案
  * 增加类型校验逻辑,确保 `func_name` 为字符串,非列表/字典类型的 `args`/`kwargs` 强制转为空容器
- 修复问题: 解决非法 JSON 导致的解析崩溃与参数误判
  * 修复 `_extract_json_array` 和 `_extract_json_object` 中的括号匹配逻辑,忽略字符串内部的符号干扰
  * 添加 `_fallback_parse` 极简解析器,处理完全无效的数组格式并返回空列表而非抛出异常
  * 修正 `func_name` 正则提取模式,支持转义双引号序列 `(?:[^"\\]|\\.)`
- 文档更新: 补充全面的单元测试覆盖边界场景
  * 在 `tests/core/test_parse_func_call.py` 中新增测试用例,覆盖 Unicode、嵌套结构、长输入及深度递归场景
  * 验证单引号、混合引号风格及字符串内特殊字符(如 `\n`, `\"`, `\\`)的正确解析
  * 确认缺失字段时的默认行为(`args` 默认为空列表,`kwargs` 默认为空字典)
- 修复问题: 提升控制台错误信息的可观测性
  * 修改 `src/console/handlers/tool_handler.py` 中的异常捕获逻辑,输出详细的 JSON 解码错误位置 (`json_err.pos`)
  * 在错误日志中包含问题上下文快照(前后 60 字符),便于快速定位格式错误
- 新增功能: 扩展结果管理器自动复制行为
  * `result_manager.copy_to_clipboard()` 现在对所有入口生效,不再排除 `tool_prompt` 和 `workspace_prompt`
  * `workspace_commands.py` 中 `add_tool_prompt` 和 `add_workspace_prompt` 方法调用 `context.result_manager.add()` 将提示注册到结果集
- 修复问题: 统一控制台自动复制通知显示
  * `tool_handler.py` 移除对 `func_name` 前缀的 `startswith` 检查,直接判断 `self.result_manager.AUTO_COPY`
  * `command_handler.py` 新增 `if self.result_manager.AUTO_COPY` 分支以在命令执行后打印 `(Auto-copied to clipboard)` 提示
- 新增功能: 集成 argparse 模块添加 -p/--path 参数,允许直接指定启动路径以跳过文件夹选择对话框
  * 在 main() 函数中初始化 ArgumentParser 并解析 args.path
  * 调用 init_workspace(args.path) 传入用户指定的路径字符串
- 修复问题: 增强 init_workspace 函数的输入验证逻辑,确保路径有效性
  * 当 start_path 存在时,使用 Path.resolve() 解析绝对路径
  * 检查路径是否存在 (exists) 及是否为目录 (is_dir),失败时打印红色错误信息并退出
  * 将 Workspace 实例化时的路径参数显式转换为 str 类型
@SunYanbox
Copy link
Copy Markdown
Owner Author

I forget check / 忘记检查格式了

- 新增功能: 引入动态命令注册机制
  * 移除 `input_parser.py` 中硬编码的命令列表 (如 `/help`, `/tools`)
  * 将 `parse_input` 函数签名修改为接收 `CommandRegistry` 实例
  * 通过 `cmd_register.list_commands()` 和 `maybe_cmd.aliases` 动态匹配用户输入
- 重构优化: 统一命令解析数据结构
  * 定义新的 `CommandParseResult` dataclass,替换旧的 `CommandResult`
  * 更新 `CommandContext.parsed_input` 类型注解以适配新结构
  * 迁移所有 handler (`tool_handler.py`, `command_handler.py`) 以使用新结果对象
  * 调整 `system_commands.py` 中的参数提取逻辑,从 `func_kwargs` 改为直接解析 `source` 字符串
- 修复问题: 增强 JSON 解析健壮性与兼容性
  * 优化 `parse_func_call.py` 中的 `_fix_unescaped_quotes` 状态机,正确处理转义序列
  * 引入 `ast.literal_eval` 作为回退方案,支持单引号等非标准 JSON 格式
  * 修复 `_extract_json_array` 和 `_extract_json_object` 中的括号/大括号匹配逻辑
  * 更新所有相关测试用例 `tests/core/test_parse_func_call.py` 以覆盖边缘情况
- 破坏性变更: API 接口与数据模型变更
  * `input_parser.parse_input` 新增必需参数 `cmd_register: CommandRegistry`,调用方需传递实例
  * `CommandContext.parsed_input` 类型由 `Any` 变更为 `CommandParseResult`
  * 旧版 `CommandResult` 类已废弃,所有引用需迁移至 `CommandParseResult`
  * `workspace_commands.py` 中 `prompt` 和 `workspace` 命令的 `aliases` 列表前缀增加了 `/`
- 新增功能: 引入 Rich Console 集成
  * `ResultManager` 类新增 `console` 属性以支持富文本输出
  * `main.py` 初始化时注入 `result_manager.console` 实例
  * 自动复制提示根据 `console` 是否存在动态切换 `rich.print` 或标准 `print`
- 修复问题: 统一复制通知的触发位置
  * 移除 `tool_handler.py` 中基于 `AUTO_COPY` 标志位的重复通知代码
  * 移除 `command_handler.py` 中基于 `AUTO_COPY` 标志位的重复通知代码
  * 将通知逻辑集中迁移至 `result_manager.add()` 方法内部执行
- 重构优化: 简化命令处理流程
  * 删除 `workspace_commands.py` 中手动调用 `context.result_manager.add()` 的逻辑
  * 改用 `add_to_viewer()` 直接处理结果展示,减少耦合
@SunYanbox SunYanbox linked an issue Apr 21, 2026 that may be closed by this pull request
- 新增功能: 实现跨平台新窗口启动逻辑
  * 在 `src/console/commands/registry.py` 中注册 `NewWindowCommand`
  * 创建 `src/console/commands/launch_commands.py` 文件定义 `NewWindowCommand` 类及 `_get_launch_command` 辅助函数
  * 添加工作区路径解析与存在性校验逻辑
- 修复问题: 修正控制台输出字符串格式化错误
  * 将 `scripts/fix_fullwidth.py` 中的 `console.print` 模板改为 f-string 语法 (`f"{len(files_dict)}"`)
- 重构优化: 改进工具信息处理流程以支持更清晰的输出结构
  * 将 `info.to_doc()` 的调用结果从直接追加改为先收集到 `docs` 列表
  * 使用 `'\n\n'.join(docs)` 格式化工具文档内容后统一追加至 `prompt_parts`
- 修复问题: 修正参数文档闭合标签前的换行符缺失导致格式错误
  * 在 `param_doc` 追加 `</params>` 前增加 `\n`,确保 `<required_params>` 和 `<optional_params>` 块后存在正确换行
- 重构优化: 将 `src/constants/tools_docs.py` 中的工具描述迁移至各 Tool 类的 docstring
  * `LsTool`: 移除 `LS_TOOL` 引用,在 `ls` 方法中定义文档
  * `ReadTool`: 移除 `READ_TOOL` 引用,在 `read` 方法中添加 `max_lines` 和 `encoding` 参数说明
  * `WriteTool`: 移除 `Write_TOOL` 引用,在 `write` 方法中明确覆盖写入的警告信息
  * `GlobTool`: 移除 `Glob_TOOL` 引用,在 `glob` 方法中补充 `pattern`, `folder_path`, `max_ret` 参数及返回值说明
  * `ReadLinesTool`: 移除 `ReadLines_TOOL` 引用,在 `read_lines` 方法中细化行号范围与上下文逻辑
  * `RegexSearchTool`: 移除 `REGEX_SEARCH_TOOL` 引用,更新 `regex_search` 方法文档以包含文件过滤和忽略路径细节
  * `ExactSearchTool`: 移除 `EXACT_SEARCH_TOOL` 引用,更新 `exact_search` 方法文档强调大小写敏感与全词匹配特性
- 破坏性变更: 删除 `src/constants/tools_docs.py` 文件
  * 受影响范围:任何直接导入 `LS_TOOL`, `READ_TOOL`, `Glob_TOOL` 等常量的外部代码将失效
  * 迁移建议:请检查依赖项,若需获取工具描述,请直接访问对应 `*Tool` 类的方法 docstring (如 `LsTool.ls.__doc__`)
- 新增功能: 基于 Textual 构建全新 TUI 界面
  * `REPL` 类从 Rich 命令行循环重构为继承自 `textual.app.App` 的图形应用
  * 新增 `_TuiConsole` 适配器,将 `RichLog` 封装为兼容旧代码的 `Console` 接口
  * 引入多行输入缓冲区 `_multiline_buffer` 支持跨行 `<func_call>` 标签处理
- 修复问题: 统一输出机制与错误提示语言
  * 移除所有 `rich.console.Console` 依赖,替换为标准 `print()` 或适配后的 `tui_console.print()`
  * 将硬编码的英文错误提示(如 "Path does not exist")翻译为中文(如 "路径不存在")
  * 修正 `CommandHandler` 和 `ToolHandler` 中的类型注解,将 `console` 参数泛化为 `Any`
- 重构优化: 简化初始化流程与依赖管理
  * 删除 `main.py` 中全局 `console` 实例及显式传入逻辑,改为在 `on_mount` 生命周期中动态创建
  * 更新 `requirements.txt`,移除 `rich` 依赖并添加 `textual`
  * 重写 `REPL` 的 UI 布局,使用 CSS 定义标题栏、输出区和底部输入框结构
  * 将帮助信息生成函数 `generate_help` 重构为 `_generate_help_text` 返回 Rich Markup 字符串
- 新增功能: 实现基于 Tkinter 的独立线程粘贴窗口及文本引用缓存
  * 引入 `PasteReference` 类管理长文本,通过 `collapsed` 方法将超长文本替换为 UUID 引用标记
  * 新增 `PasteWindow` 单例类,在独立线程中运行 `tk.Tk` 事件循环以支持非阻塞大文本编辑
  * 在 `Repl` 界面添加 `big-paste-btn` 按钮及 `alt+v` 快捷键绑定 `action_paste_big_text`
  * 修改 `_do_submit` 逻辑,调用 `paste_refence.expand` 还原引用并清理缓存
  * 集成 `show_paste_window` 便捷函数处理回调,自动检测文本长度决定是否启用压缩
- 重构优化: 调整控制台 UI 布局样式以适应新组件
  * 更新 CSS 规则,调整 `#input-container`、`#button-area` 及 `#submit-btn` 的宽度与边距
  * 将提交按钮区域嵌套至 `Vertical(id="button-area")` 容器中,保持布局一致性
- 重构优化: 调整引用匹配逻辑并移除冗余功能
  * `PasteReference` 的初始化参数 `threshold` 从 240 调整为 120
  * `expand` 方法返回值类型由 `str | None` 改为 `str`,不再返回 None
  * 引入正则表达式 `r'\[(func_call|paste)_([a-f0-9]{8})\]'` 精确匹配引用标记
  * 仅处理实际存在于 `_paste_cache` 中的引用,并在展开后自动删除对应条目
- 修复问题: 修复额外的快捷键导致粘贴异常的问题
  * 移除 `<Control-v>` 绑定的 `_paste_from_clipboard` 事件处理函数
  * 移除 `<Control-c>` 绑定的 `_copy_to_clipboard` 事件处理函数
  * 删除 `_paste_from_clipboard` 方法的完整实现代码
- 新增功能: 引入独立的路径解析与文件创建方法
  * 新增 `resolve_path` 方法,仅执行安全边界验证而不检查文件存在性,适用于准备创建新文件的场景
  * 新增 `create_file_with_parents` 方法,支持在工作区内自动创建父目录并写入文件内容
- 修复问题: 优化现有验证工具的参数结构与错误处理
  * 移除 `validate` 方法的 `create_file_if_not_exist` 参数,将文件创建逻辑剥离至新方法
  * 更新 `WriteTool` 中的调用逻辑,先通过 `resolve_path` 校验路径安全性,再调用 `create_file_with_parents` 执行写入
  * 增强 `WriteTool` 对目标路径的校验,在写入前明确判断是否为目录并返回友好的错误提示
- 重构优化: 统一路径安全边界检查逻辑
  * 提取公共的边界守卫逻辑到 `resolve_path`,消除 `validate` 方法中的重复代码
  * 确保所有路径操作均复用统一的越界检测机制 (`WorkspaceBoundaryError`)
- 新增功能: 在 `ClsCommand` 中增加对 Textual 应用实例的支持,通过 `context.app.refresh()` 刷新 UI 界面并重新显示帮助文本
- 重构优化: 将 `ClsCommand` 从 `system_commands.py` 迁移至 `repl.py`,使其能够访问 `CommandRegistry` 实例以动态获取命令列表
- 修复问题: 更新 `CommandContext` 和 `CommandHandler` 类定义,添加 `app: App | None` 字段用于传递 Textual 应用实例
- 破坏性变更: 移除全局注册的 `ClsCommand` 实例,不再通过 `src.console.commands.system_commands` 导入,需确保调用方正确注入 `command_registry`
- 新增功能: 引入环境检测与动态命令构建机制
  * 新增 `is_frozen()` 函数用于检测 PyInstaller 打包状态
  * 新增 `get_executable_path()` 和 `get_script_path()` 分别处理 exe 路径与脚本路径
  * 重构 `_get_base_command()` 根据运行环境自动选择 `[executable]` 或 `[executable, script]` 参数组合
- 修复问题: 优化跨平台终端启动兼容性
  * 替换 `subprocess.run(["which", ...])` 为更标准的 `shutil.which()` 检查终端模拟器
  * 更新 Windows 启动逻辑,明确 `start` 命令需配合 `shell=True` 执行
  * 增强 Linux/Unix 回退方案,使用 `nohup` 在后台运行而非直接阻塞
- 重构优化: 提升错误处理与用户反馈体验
  * 修改 `main.py` 入口,将原 `src.console.main:main` 重命名为 `_main` 并添加包装函数
  * 更新 `pyproject.toml` 中 `requires-python` 至 `>=3.14` 及脚本入口指向 `main:main`
  * 增加启动模式日志输出 (开发环境/打包环境) 及详细的启动命令展示
  * 改进失败时的帮助提示,动态生成针对当前环境的 `manual_cmd` 供用户手动调试
- 新增功能: 实现 `StatTool` 类以获取文件或目录详细信息
  * 集成 `stat_tool.py` 至 `tool_registry.py` 注册列表
  * 提供 `stat` 方法,支持路径验证与异常处理 (`PathNotFoundError`, `WorkspaceBoundaryError`)
  * 输出包含大小 (自动单位转换)、行数、创建/修改/访问时间
  * 解析并格式化权限信息 (符号位如 `-rwxr-xr--` 及八进制数值)
  * 识别文件类型 (目录/文件/链接等) 并显示所有者 UID/GID 及硬链接数
  * 针对目录额外统计子项数量,针对符号链接显示目标路径
- 修复问题: 修正启动命令日志中的字符串引号格式不一致
  * 将 `launch_commands.py` 中单引号包裹的转义字符 `\n` 统一改为双引号
  * 调整 `Panel` 标题参数中的引号风格以保持代码一致性
- 新增功能: 实现跨语言符号定义与引用定位
  * 新增 `SymbolRefTool` 类,继承自 `BaseTool`
  * 新增 `_generate_patterns` 函数,支持 Python、JavaScript/TypeScript、Markdown 及通用语言的搜索模式生成
  * 新增 `_search_pattern` 函数,执行正则匹配并提取上下文行 (默认2行)
  * 新增 `_detect_language` 函数,通过文件特征自动识别项目主要编程语言
  * 新增 `symbol_ref` 方法,作为工具入口,支持 `include_definitions`, `include_references`, `limit` 等参数控制
- 重构优化: 更新工具注册逻辑
  * 在 `src/core/tool_registry.py` 中导入 `SymbolRefTool`
  * 将 `SymbolRefTool` 加入工具实例化循环列表
- 新增功能: 增强上下文行匹配内容的可视化包裹标记
  * 在 `regex_search_tool.py` 中引入 `re.compile(pattern)` 和 `finditer` 逻辑
  * 实现从后往前遍历 `matches_positions` 以精确插入 `>>>` 和 `<<<` 标记
  * 处理 `marked_content` 生成,确保仅对实际匹配部分进行高亮而非整行
- 新增功能: 引入 SessionManager 单例类管理工作区会话生命周期
  * 通过 `SessionManager.__new__` 和 `_instances` 字典实现基于工作区路径的单例模式
  * 实现 `create_session` 生成符合 `YYYYMMDD-HHMMSS-{uuid}` 格式的会话 ID 并初始化目录结构
  * 集成 `.ManualAid` 目录常量定义 (`MANUALAID_DIR`, `SESSIONS_DIR`, `PATCHES_DIR`) 用于隔离会话数据
- 修复问题: 完善工具调用与文件读取的审计追踪能力
  * 通过 `append_tool_call` 和 `get_tool_calls` 管理 `tool_calls.jsonl` 日志追加与读取
  * 利用 `update_read_record` 和 `get_read_record` 维护 `read_records.json` 中的文件元数据 (mtime, sha256)
- 重构优化: 建立 Patch 文件与统计数据的持久化存储流程
  * 提供 `save_patch` 和 `load_patch` 接口处理 `call_id` 对应的 `.patch` 文件读写
  * 实现 `update_session_stats` 更新 `session.json` 中的工具调用统计数据
  * 增加 `list_sessions` 方法支持按时间倒序遍历历史会话摘要
- 文档更新: 补充完整的单元测试覆盖核心逻辑
  * 编写 `test_session_manager.py` 覆盖单例验证、目录创建、会话状态流转及异常处理
  * 针对工具调用、读取记录、Patch 管理及统计更新等模块添加专项测试用例
- 修复问题: 解决可能存在的HTML实体字符导致界面显示异常
  * 将转义的双引号实体 `&quot;` 还原为标准双引号 `"`
- 破坏性变更: 移除 `parse_func_call` 函数的位置参数 (`args`) 返回,统一仅返回函数名和关键字参数字典 (`kwargs`)。所有调用该函数的模块(如 `tool_handler.py`)必须更新以适配新的返回值结构。
- 新增功能: 在 `base_tool.py` 中引入 `convert_param_type` 辅助函数及 `BaseTool.convert_args` 方法,实现根据类型注解自动将字符串参数转换为 int、float、bool、list、dict 等目标类型。
- 修复问题: 简化 `parse_func_call` 逻辑,废弃复杂的 JSON 修复与手动提取回退机制,改为基于 XML 标签 `<func_name>` 和 `<param>` 的纯正则解析模式。
- 文档更新: 修改 `prompts.py` 中的工具调用格式示例,从 JSON 格式变更为结构化 XML 格式,明确展示 `<func_name>` 和 `<param>` 标签用法。
- 新增功能: 引入多线程并发搜索机制
  * 移除 `contextlib` 导入,新增 `ThreadPoolExecutor` 和 `as_completed` 实现异步任务管理
  * 重构 `_search_pattern` 为 `_search_single_pattern`,调用 `workspace.search_content` 替代原生文件遍历
  * 新增 `_search_patterns_concurrent` 函数,使用线程池并行执行多个正则模式的搜索任务
  * 添加 `_get_file_pattern_by_language` 函数,根据语言自动匹配文件后缀 (如 `*.py`, `*.ts`)
  * 在 `SymbolRefTool.run` 方法中增加 `file_pattern` 参数,支持自定义文件过滤模式
  * 默认排除目录 `DEFAULT_EXCLUDED_DIRS` 已定义,包含 `.git`, `__pycache__` 等标准路径
- 修复问题: 增强结果解析的健壮性
  * 修改 `_format_results` 逻辑,使用 `.get()` 安全获取 `type`、`match_type` 和 `context` 字段,防止键缺失报错
  * 简化上下文展示逻辑,适配 `workspace.search_content` 返回的格式化字符串结构
- 文档更新: 改进控制台帮助信息格式
  * 重写 `repl.py` 中的工具调用示例,将单行 XML 改为多行缩进格式,提升可读性
- 重构优化: 增强代码类型安全性与可读性
  * `read_tool.py` 中 `read` 函数的 `max_lines` 参数增加 `int` 类型提示
  * `read_tool.py` 中 `read` 函数的 `encoding` 参数增加 `str` 类型提示
  * `read_lines_tool.py` 中 `read_lines` 函数的 `start`, `end`, `context` 参数显式声明为 `int` 类型
  * `read_lines_tool.py` 中 `read_lines` 函数的 `encoding` 参数增加 `str` 类型提示
- 重构优化: 将分散在 `src/console` 和 `src/core` 的类统一迁移至 `src.models` 模块
  * 新增 `Command`, `CommandContext`, `CommandResult`, `CommandParseResult` 等数据类定义
  * 移动 `ToolErrorResponse` 和 `ResultEntry` 至 `src.models` 目录
  * 删除 `src/console/commands/base.py`, `src/core/parse_func_call.py`, `src/core/tool_error_response.py`
- 新增功能: 增强命令行解析能力与系统命令支持
  * 扩展 `parse_input` 函数以支持多工具调用 (`funcs` 列表) 及非标准 XML 格式解析
  * 添加 `launcher.py` 模块封装跨平台 (Windows/macOS/Linux) 的新窗口启动逻辑
- 破坏性变更: 调整核心数据结构与 API 签名
  * `CommandParseResult` 字段变更:移除 `raw_input`, `func_name`, `func_args`, `func_kwargs`; 新增 `is_func`, `cmd_kwargs`, `funcs`
  * `CommandContext` 结构变更:移除 `app` 依赖,新增 `command_registry` 字段用于命令分发
  * `parse_input` 签名变更:新增 `warns: list[str]` 参数用于返回解析警告信息
  * `parse_func_call` 签名变更:新增 `warns: list[str]` 参数并集成至 `input_parser.py`
- 文档更新: 规范代码组织与导入路径
  * 重命名 `src/console/commands/registry.py` 为 `command_registry.py`
  * 重命名 `src/console/interactive_viewer.py` 为 `src/console/ui/interactive_viewer.py`
  * 全局替换旧版导入路径为新版 `src.models` 路径
- 删除代码: 移除 src/core/session_manager.py 文件,该文件负责管理会话生命周期、工具调用日志及 Patch 文件存储。
- 删除测试: 移除 tests/core/test_session_manager.py 文件,该文件包含对 SessionManager 单例模式、目录结构、会话状态及读写功能的完整覆盖。
- 影响范围: 暂无任何依赖 `SessionManager` 类的方法
- 重构优化: 将多行条件判断合并为三元表达式
  * 修改 `collapsed` 方法中 `<func_call>` 标签检测后的 `ref_id` 赋值逻辑
  * 移除冗余的 `if-else` 分支结构,统一使用 `f"[func_call_{ref_id}]" if ... else f"[paste_{ref_id}]"` 形式
- 新增功能: 统一剪切板复制机制
  * 新建 `src/core/copy2clip.py` 模块封装 `copy_to_clipboard` 函数
  * 引入 `pyperclip` 优先库,失败时自动降级调用系统命令 (`clip`, `pbcopy`, `xclip`)
- 修复问题: 移除硬编码的命令行匹配逻辑
  * 从 `src/core/input_parser.py` 中移除 `COPY_PATTERN` 和 `VIEW_REMOVE_PATTERN` 正则匹配
  * 在 `src/console/result_manager.py` 中移除 `_copy_fallback` 方法,改为调用新模块
  * 使用 `shlex.split` 替代简单的字符串分割以支持带参数的命令解析
- 重构优化: 增强命令参数处理能力
  * `src/models/commands/command.py` 增加 `argparse` 属性及 `parse` 方法支持标准参数解析
  * `src/workspace/tools/base_tool.py` 新增 `to_func_call` 方法生成工具调用 XML 格式
  * `src/console/commands/result_commands.py` 重构 `CopyCommand` 支持 `-i/--index` 和 `-t/--tool` 参数
- 破坏性变更: 废弃交互式视图相关命令
  * `ViewCommand`, `ViewClearCommand`, `ViewRemoveCommand` 被标记为 `@warnings.deprecated`
  * 这些命令不再执行实际的 UI 交互逻辑,仅返回“已弃用”消息
- 重构优化: 将 `system_commands.py`、`result_commands.py` 和 `workspace_commands.py` 拆分为独立的功能目录 (`systems`, `results`, `workspaces`)
  * 移动 `QuitCommand`, `ToolsCommand`, `ToolDetailCommand`, `ClsCommand`, `HelpCommand` 至 `src/console/commands/systems/`
  * 移动 `CopyCommand` 至 `src/console/commands/results/copy_cmd.py`,并将 `HistoryCommand` 提取为独立文件
  * 移动 `WorkspaceCommand` 至 `src/console/commands/workspaces/workspace_cmd.py`
  * 将 `generate_help_text` 函数抽取至 `src/utils/generate_help_text.py` 供全局复用
- 修复问题: 修正 `cls_cmd.py` 和 `help_cmd.py` 中对 `generate_help_text` 的导入路径错误
- 破坏性变更: 删除已弃用的 `ViewCommand`, `ViewClearCommand`, `ViewRemoveCommand` 及相关逻辑
  * 受影响的范围:`command_registry.py` 中不再注册上述视图类,用户无法通过 `/view`, `/view_clear`, `/view_remove` 调用这些功能
- 重构优化: 改进工作区上下文生成逻辑
  * 将 `_generate_workspace_metadata` 函数的返回格式从 XML 标签行拼接改为结构化的 `<workspace_info>` 块,包含 `root_path`, `is_git_repo`, `platform`, `date` 字段
  * 新增关于文件路径相对性及工具调用上下文的说明文本
- 文档更新: 统一并增强系统提示词定义
  * 将 `WORKSPACE_CONSTRAINTS` 重命名为 `SYSTEM_CONSTRAINTS` 并在 `src/constants/prompts.py` 中更新其内容
  * 在 `src/console/commands/workspaces/workspace_cmd.py` 中将导入的常量由 `WORKSPACE_CONSTRAINTS` 替换为 `SYSTEM_CONSTRAINTS`
  * 扩展提示词内容,增加 `WORKFLOW GUIDELINES` 部分,明确工具依赖、停止等待机制及多步骤任务处理策略
- 修复导入路径问题
@SunYanbox SunYanbox merged commit c5a51ed into main Apr 27, 2026
3 checks passed
@SunYanbox SunYanbox deleted the feat/sync branch April 27, 2026 02:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment