Skip to content

Feat: Add Skill System / 添加 Skill 系统#155

Merged
SunYanbox merged 10 commits into
developfrom
feat/skills
May 7, 2026
Merged

Feat: Add Skill System / 添加 Skill 系统#155
SunYanbox merged 10 commits into
developfrom
feat/skills

Conversation

@SunYanbox
Copy link
Copy Markdown
Owner

添加基于 Python texture 库的设置标签页 / Add Settings Tab Based on Python texture Library

添加 Skill 系统,放在设置标签页下;允许动态加载 SKILL / Add Skill System Under Settings Tab with Dynamic Loading of SKILLs

SunYanbox added 4 commits May 6, 2026 18:34
- 新增功能: 引入统一的文件排除与权限决策引擎
  * 新增 `ExclusionManager` 类,聚合默认性能排除、.gitignore 规则及用户自定义忽略项
  * 新增 `PermissionManager` 类,提供基于操作类型 (READ/WRITE/SEARCH) 的统一权限决策接口
  * 新增 `SensitiveFileError` 异常类,用于在路径校验阶段拦截敏感文件访问
  * 工具层集成:`ls_tool`, `glob_tool`, `regex_search_tool`, `exact_search_tool` 均接入 `exclusion_manager` 进行路径过滤
- 修复问题: 增强敏感文件保护机制
  * 在 `PathValidator` 中增加 `_raise_if_sensitive` 逻辑,直接禁止访问 `.env`, `*.pem`, `id_rsa` 等敏感文件
  * 在 `BaseTool` 的异常处理装饰器中捕获 `SensitiveFileError`,返回明确的拒绝访问提示
  * 将原本硬编码的 `DEFAULT_EXCLUDED_DIRS` 替换为动态加载的 `ExclusionManager` 实例
- 重构优化: 简化搜索与遍历逻辑
  * 移除 `workspace.py` 和各类 Search Tool 中重复的正则编译与排除逻辑
  * 使用 `merge_ignore_regexes` 方法统一合并默认规则与用户传入的 ignore 模式
  * 利用 `is_ignored_by_gitignore` 函数统一处理 .gitignore 规则的匹配与否定逻辑
- 文档更新: 补充模块设计说明
  * 添加 `ExclusionManager` 和 `PermissionManager` 的类级文档字符串,明确区分性能排除与安全排除场景
- 破坏性变更: 移除 `PermissionManager` 及其相关 API
  * 删除 `src/workspace/permissions.py` 文件
  * 移除 `Workspace` 类中的 `self.permission_manager` 属性及初始化逻辑
  * 调用方需直接依赖 `PathValidator` 进行敏感文件拦截,不再通过 `workspace.permission_manager.is_allowed()` 查询
- 重构优化: 整合敏感文件规则至 `ExclusionManager`
  * 将 `SENSITIVE_FILE_PATTERNS` 从硬编码移至 `ExclusionManager.SENSITIVE_FILE_PATTERNS`
  * `PathValidator` 引入 `ExclusionManager` 作为唯一敏感文件模式来源 (`re.compile(p) for p in ExclusionManager.SENSITIVE_FILE_PATTERNS`)
  * 更新正则表达式前缀以支持路径边界匹配 (添加 `(^|/)`)
- 代码清理: 移除冗余的排除检查逻辑
  * 在 `Workspace._search_content` 中移除基于 `should_exclude_dir` 的父目录遍历检查
  * 移除 `ExclusionManager` 中已废弃的 `_sensitive_file_res` 预编译缓存逻辑
  * 移除 `ExclusionManager` 中不再使用的 `is_sensitive_file` 和 `should_exclude_dir` 方法
- 文档更新: 补充 `gitignore_loader` 已知局限性说明
  * 明确标注不支持嵌套 `.gitignore`、行尾续行及字符类扩展语法
  * 记录否定模式优先级处理与真实 Git 的差异及设计理由
- 新增功能: 实现统一的配置管理器 (ConfigManager)
  * 引入 `src/core/config_manager.py` 单例类,支持环境变量、Skill 及通用配置的读取与持久化
  * 提供 `get`, `set`, `delete` 等核心 API 接口,支持通过 `DatabaseManager` 读写 SQLite 数据库
  * 实现 `apply_env_configs` 方法自动将配置同步至 `os.environ`
  * 定义 `DEFAULT_ENVS` 常量,包含 `TOOL_MAX_DOC_LENGTH`, `RESULT_EXPIRE_MINUTES` 等默认值
- 新增功能: 构建 Skill 发现与管理服务 (SkillManager)
  * 创建 `src/core/skill_manager.py` 单例类,支持从全局路径 (~/.claude/skills) 和项目路径 (.ManualAid/skills) 扫描技能
  * 集成 `src/models/skill.py` 数据模型,解析 SKILL.md 的 YAML frontmatter 提取名称和描述
  * 实现 `set_disabled` 和 `get_disabled_skills` 接口,支持禁用特定技能并持久化到数据库
  * 新增 `SkillTool` 工具 (`src/workspace/tools/skill_tool.py`),允许用户加载指定技能内容注入会话
- 新增功能: 扩展 TUI 设置界面
  * 在 `tui_console.py` 中新增 "Settings" 标签页,整合 `SettingsTab`
  * 实现 `EnvConfigTab` 用于编辑预定义环境变量,支持从 `.env` 文件加载/保存差异配置
  * 实现 `SkillConfigTab` 展示技能列表,支持启用/禁用操作及查看详情
  * 修改 `main.py` 启动流程,初始化 `ConfigManager` 和 `SkillManager` 并在应用启动时执行环境配置应用和技能发现
- 文档更新: 依赖项与数据库结构升级
  * 在 `requirements.txt` 中添加 `pyyaml` 依赖以支持 YAML 解析
  * 扩展 `database_manager.py`,新增 `config` 表结构存储键值对配置
  * 为 `config` 表添加迁移逻辑 (Phase 6),确保旧版本数据库兼容
- 新增功能: 实现技能启用/禁用状态管理与持久化
  * `SkillManager` 新增 `get_enabled()` 和 `get_disabled()` 方法,用于从数据库获取技能状态
  * `workspace_cmd.py` 新增 `_generate_skill_prompt_section()` 函数,动态生成 `<available_skills>` XML 块
  * `skill_config_tab.py` 新增“启用选中”和“禁用选中”按钮逻辑,支持通过 `set_disabled()` 方法更新持久化状态
  * 系统提示组装流程中增加技能段落的生成与注册,通过 `register_extension_hook` 注入技能信息

- 修复问题: 修正 UI 显示状态与数据库不一致的缺陷
  * `skill_config_tab.py` 在刷新表格时改用 `get_disabled()` 集合判断状态,确保列表显示的启用/禁用标记(✓/✗)与数据库持久化数据严格同步
  * 移除对 `skill.enabled` 属性的直接依赖,统一使用禁用集合进行状态校验

- 重构优化: 简化接口参数类型定义
  * `database_manager.py` 将 `set_disabled_skills` 方法的参数类型从 `*names: str` 调整为 `names` (支持 set, list, tuple),内部自动转换为集合处理
@SunYanbox
Copy link
Copy Markdown
Owner Author

SunYanbox commented May 7, 2026

Will merge after #151

将在 #151 合并之后合并

SunYanbox added 4 commits May 7, 2026 17:39
- 新增功能: 在文件扩展名白名单中添加Godot相关后缀
  * 添加 `.godot` 和 `.gd` 支持
  * 添加 `.gd.uid` 和 `.tscn` 支持
- 新增功能: 在 binary_detector.py 的 FILE_EXTENSIONS 集合中增加对特定编译产物和数据库文件的识别
  * 添加 .pdb (程序数据库) 后缀
  * 添加 .pyd (Python 动态链接库) 后缀
  * 添加 .o (目标文件) 后缀
- 新增功能: 集成二进制文件检测机制
  * 在 `regex_search_tool.py` 和 `exact_search_tool.py` 中导入 `src.utils.binary_detector.is_binary_file`
  * 在遍历文件列表时增加 `is_binary_file(file_path)` 判断,自动跳过二进制文件
- 重构优化: 增强文件路径筛选与排除逻辑
  * 修改 `files_to_search` 生成逻辑,将简单的 `rglob` 转换为包含条件过滤的列表推导式
  * 引入 `self._exclusion_manager.should_exclude_path(p)` 方法,支持自定义路径排除规则
  * 确保仅处理 `p.is_file()` 且未被排除的有效文件
…xclusion

Feat/enhance path validation exclusion
SunYanbox added 2 commits May 7, 2026 18:42
- 新增功能: 实现扩展钩子的重置机制
  * 新增 `clear_extension_hooks` 函数用于清空已注册的钩子列表
  * 在 `generate_system_prompt` 流程末尾调用 `clear_extension_hooks()`
- 重构优化: 将扩展钩子存储私有化
  * 将全局变量 `EXTENSION_HOOKS` 重命名为 `__EXTENSION_HOOKS`
  * 更新 `register_extension_hook` 和 `generate_extensions_section` 内部逻辑以使用私有变量
- 新增功能: 实现 Shell 命令的提交、审核及执行闭环
  * 新增 `src/workspace/tools/shell_tool.py`,集成 `ShellTool` 类,调用时创建 `PENDING_AUDIT` 状态记录
  * 新增 `src/console/ui/widgets/shell_result_tab.py` (`ShellResultTab`),展示已完成的 Shell 命令及其输出,支持展开详情和一键复制
  * 数据库层面新增 `shell_audit` 表,包含 `command`, `description`, `audit_status`, `output`, `exit_code` 等字段
  * `database_manager.py` 增加 `record_shell_command`, `update_shell_audit`, `get_shell_pending_audits`, `get_shell_completed` 等数据访问方法
- 修复问题: 完善审核流程以支持 Shell 命令操作
  * `src/core/audit_committer.py` 新增 `commit_shell` 方法,处理批准后的 `subprocess.run` 执行逻辑,包含超时控制 (300s) 和输出截断 (10000 chars)
  * `src/console/ui/widgets/audit_tab.py` 重构渲染逻辑,在文件变更列表前优先展示待审核的 Shell 命令,添加 "批准" 和 "拒绝" 按钮处理事件
  * `tui_console.py` 和 `repl.py` 完成 `ShellResultTab` 的注册、依赖注入及刷新逻辑绑定
@SunYanbox SunYanbox merged commit 5361623 into develop May 7, 2026
3 checks passed
@SunYanbox SunYanbox deleted the feat/skills branch May 7, 2026 12:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment