Solon v4.0.2

talents - SkillTalent 对接海量 Claude Agent Skills

</> markdown
2026年6月11日 下午10:50:05

在 Solon AI 生态中,SkillTalent 是一个基于 Pool-Manager(挂载池管理)模型的 CLI 综合技能组件。它深度对齐了 Claude Code 的执行协议,使您可以直接复用海量的开源 AI 技能插件,快速打造一个类似于 Claude Code CLI 的智能终端应用。

SkillTalent 由三个核心 Talent 组成,可以独立使用或组合使用:

  • TerminalTalent:充当 Agent 的"手"和"眼",负责文件操作(ls, read, write, edit)和命令执行(bash)。
  • SkillTalent:负责解析挂载池中的 SKILL.md,为 Agent 提供领域专家的指令指引。
  • TodoTalent:提供复杂任务的拆解、进度跟踪及计划修订能力。

相关依赖包:solon-ai-skill-cli

1、什么是 SkillTalent?能干什么?

SkillTalent 是一个 AI 技能管理器。它基于底层的 MountManager(挂载池管理器),自动扫描挂载目录中包含 SKILL.md 的子目录,将其识别为一个个独立的技能单元,并为 Agent 提供发现、搜索和加载能力。

它能干什么?

  • 技能发现:自动扫描挂载池中的技能目录(含 SKILL.md 的目录),提取名称和描述,构建技能索引。
  • 三阶段自适应模式:根据技能数量自动切换交互模式 —— 少量时展示完整摘要,中等规模仅展示路径索引,大量时强制搜索定位。
  • 技能检索:支持多关键字搜索,快速在海量技能库中找到匹配项。
  • 技能加载:读取指定技能的 SKILL.md 详细说明书,同时列出该技能目录下的可用文件及逻辑路径映射。
  • 热刷新:支持增量刷新指定挂载点或全量刷新所有挂载点的技能列表。

三阶段自适应模式

SkillTalent 内置了两个阈值参数(listThresholdsearchThreshold),根据当前技能库规模自动选择最优的交互策略:

技能数量运行模式可用工具Agent 行为指引
listThreshold(默认 30)摘要发现skillread, skillrefresh直接展示技能名称和描述,Agent 可判断后调用 skillread 深入阅读
searchThreshold(默认 100)路径导航skillread, skilllist, skillrefresh仅展示技能路径索引(无描述),Agent 需推断功能后读取,不确定时可搜索
> searchThreshold动态发现全部工具(含 skillsearch禁止猜测路径,Agent 必须先用 skillsearch 检索关键字,确认后再读取

这种设计确保了在少量技能时不暴露多余工具干扰 Agent,在大量技能时又提供了足够的检索能力。

2、快速开始

第一步:准备技能包

在使用 SkillTalent 之前,您需要下载一批符合 Claude Code 规范的技能插件。这些插件目录中通常包含一个 SKILL.md 文件,用于描述工具的用法。

第二步:创建挂载管理器

MountManager 是整个技能体系的基础设施。它负责管理工作区路径、注册挂载点,并将逻辑路径(如 @skills)解析为物理路径。

// 创建挂载管理器,指定工作区目录
MountManager mountManager = new MountManager("/WORK/my_project");

// 注册技能挂载点(类型为 SKILLS)
// 支持路径语法:"./"(工作区相对)、"~/"(用户目录相对)、绝对路径
mountManager.register(MountDir.builder()
        .alias("@skills")
        .type(MountType.SKILLS)
        .path("/path/to/opencode-skills")
        .build());

第三步:集成到 Agent

通过 TerminalTalentSkillTalent 组装完整的 CLI 能力,并配置 ReActAgent

// 创建 TerminalTalent(提供 ls, read, write, edit, bash 等文件和命令工具)
TerminalTalent terminalTalent = new TerminalTalent(mountManager);
terminalTalent.setSandboxEnabled(true); // 默认已启用沙盒模式

// 创建 SkillTalent(提供技能发现、搜索和加载工具)
SkillTalent skillTalent = new SkillTalent(mountManager);

// 创建 TodoTalent(提供任务进度跟踪)
TodoTalent todoTalent = new TodoTalent();

ReActAgent agent = ReActAgent.of(LlmUtil.getChatModel())
        .name("SolonCodeAgent")
        .defaultTalentAdd(terminalTalent)  // 注入终端能力
        .defaultTalentAdd(skillTalent)     // 注入技能管理能力
        .defaultTalentAdd(todoTalent)      // 注入任务追踪能力
        .maxTurns(30)
        .autoRethink(true)
        .build();

// 发起任务:Agent 会自动 ls 目录,阅读代码,并根据需要调用 bash 执行指令
agent.prompt("帮我把当前目录下的所有 .wav 文件转换成 .mp3");

3、标准工具映射说明

TerminalTalent 内置工具

Agent 会根据上下文自动选择以下工具:

工具说明
ls列出目录内容。支持递归 Tree 结构展示(最多 3 层深度),支持逻辑路径(如 @pool)。自动过滤 .gitnode_modulestarget 等干扰目录。
read分页读取文件内容。自动识别编码,支持 offsetlimit 参数分页。单次读取受 128KB 物理长度保护,超限时提示续读参数。会自动检测并拒绝二进制文件。
grep递归搜索内容,返回 路径:行号:内容 格式。支持正则表达式匹配。搜索结果同样受 128KB 限制保护。
glob按通配符模式(如 **/*.java)搜索文件。最多返回 500 个匹配结果。
write创建新文件或覆盖现有文件。自动创建父目录。
edit精准文本替换工具。支持单次调用执行多处编辑(传入 edits 数组)。具有原子性:所有编辑预校验通过才会写入,否则全部回滚。要求 old_str 在文件中唯一。支持 replace_all 模式批量替换。
bash执行非交互式 Shell 指令。支持多行脚本。自动将 @pool 路径转为环境变量。内置安全校验:禁止 kill 宿主进程、禁止 exit、禁止 rm -rf /。支持自定义超时时间(默认 120 秒)。

TerminalTalent 异步会话工具(可选启用)

通过 terminalTalent.setBashAsyncEnabled(true) 启用后,额外提供以下工具,用于处理长时间运行的命令:

工具说明
bash_start启动 shell 命令会话。若命令在 yield_time_ms(默认 1 秒)内未完成,会返回 session_id 供后续操作。支持 hard_timeout_ms(默认 120 秒)硬超时兜底。
bash_wait继续等待仍在运行的命令会话,返回自上次读取后的新增输出。
bash_stdin向运行中的命令会话写入 stdin 文本。
bash_stop终止运行中的命令会话及其子进程树。

SkillTalent 内置工具

工具说明
skilllist列出所有挂载点中的可用技能清单(含名称和描述)。当技能数量超过 searchThreshold 时禁止全量列出。
skillsearch在所有挂载点中搜索技能关键字。支持空格分隔多个词,匹配名称和描述。最多返回 15 条结果。
skillread读取指定技能的详细说明书(SKILL.md 内容)及目录下的可用文件列表(含逻辑路径映射)。
skillrefresh重新扫描所有挂载点,更新技能列表。返回刷新后的技能总数。

TodoTalent 内置工具

工具说明
todoread读取当前任务清单(Markdown 格式)。清单为空时返回提示。
todowrite写入任务列表(新建、更新或重构)。接收完整的 Markdown 格式清单,支持 ## 标题分组和 checkbox 标记(- [ ] 待办、- [/] 进行中、- [x] 已完成)。

4、挂载管理体系

MountManager 核心概念

MountManager 是 SkillTalent 的基础设施,管理着逻辑路径到物理路径的映射关系:

概念说明
工作区(WorkDir)Agent 的主目录,支持读写。使用相对路径访问。
挂载点(MountDir)@ 开头的逻辑路径别名,映射到一个真实的物理目录。每个挂载点具有 aliastype(SKILLS/AGENTS)、pathwriteableenabled 等属性。
技能目录(SkillDir)挂载点下包含 SKILL.md 文件的子目录,被视为一个独立的技能单元。
路径语法./ 表示工作区相对路径,~/ 表示用户主目录相对路径,@xxx 表示挂载点逻辑路径。

多技能池挂载

支持注册多个不同类型的挂载点,实现资源隔离:

MountManager mountManager = new MountManager("/WORK/my_project");

// 技能类挂载(只读)
mountManager.register(MountDir.builder()
        .alias("@media")
        .type(MountType.SKILLS)
        .path("/path/to/ffmpeg-skills")
        .build());

// 另一个技能挂载
mountManager.register(MountDir.builder()
        .alias("@ops")
        .type(MountType.SKILLS)
        .path("/path/to/deploy-scripts")
        .build());

// 代理类挂载
mountManager.register(MountDir.builder()
        .alias("@agents")
        .type(MountType.AGENTS)
        .path("/path/to/agent-configs")
        .build());

Agent 在执行时,可以通过逻辑路径(如 @media/extract_audio.sh)安全地访问这些资源。

挂载点操作

// 移除挂载(同时清理关联的技能缓存)
mountManager.remove("@ops");

// 增量刷新指定挂载点
mountManager.refresh("@media");

// 全量刷新所有挂载点
mountManager.refresh();

// 查询挂载下的技能列表
List<SkillDir> skills = mountManager.getSkillsByMount("@media");

// 路径解析
Path realPath = mountManager.resolve(workDir, "@media/scripts/convert.sh");

TerminalTalentProxy 精细化工具控制

如果不需要暴露 TerminalTalent 的全部工具,可以使用 TerminalTalentProxy 进行按需筛选:

TerminalTalent terminalTalent = new TerminalTalent(mountManager);

// 创建代理,仅暴露指定工具
TerminalTalentProxy proxy = new TerminalTalentProxy(terminalTalent);
proxy.addTools("read", "grep", "glob", "ls");

// 将代理注册到 Agent(而非原始 TerminalTalent)
agent.defaultTalentAdd(proxy);

5、沙盒模式

沙盒模式是 TerminalTalent 的核心安全机制,默认启用。启用后,Agent 的所有文件和命令操作都受到严格约束。

沙盒层级

TerminalTalent 提供了从轻量到严格的逐级安全防护:

层级配置说明
Java 层最小自保护默认生效禁止 kill 宿主进程、禁止 exit、禁止 rm -rf /。仅限相对路径或逻辑路径访问。
用户主目录控制sandboxAllowUserHome控制是否允许 ~ 路径访问(默认允许)。关闭后 Agent 无法访问用户主目录。
OS 内核级强制隔离sandboxSystemRestrict启用后通过 Seatbelt(macOS)/ bwrap(Linux)实现内核级沙盒。关闭后仅保留 Java 层保护,可减少对构建工具的误伤(默认关闭)。
文件系统策略SandboxRuntimeConfig支持配置读写白名单、读写拒绝规则,实现细粒度的目录访问控制。

沙盒关键行为

  • 路径约束:沙盒模式下只能使用相对路径(如 src/app.java)或逻辑路径(如 @skills/tool.sh),严禁使用绝对路径。
  • 符号链接防护:会解析真实路径,防止通过符号链接越界。
  • 强制拒绝清单:即使在开放模式下,也禁止写入 .gitconfig.bashrc.mcp.json 等敏感配置文件及 .git/hooks.vscode.idea 等敏感目录。
  • 自动忽略目录lsgrepglob 等工具会自动忽略 .gitnode_modulestargetbuild.idea 等干扰目录。
// 基础沙盒配置
terminalTalent.setSandboxEnabled(true);
terminalTalent.setSandboxAllowUserHome(false); // 禁止 ~ 路径

// 高级沙盒配置(OS 内核级隔离 + 文件系统策略)
terminalTalent.setSandboxSystemRestrict(true);
terminalTalent.setSandboxConfig(SandboxRuntimeConfig.builder()
        .filesystem(FilesystemConfig.builder()
                .allowWrite(Arrays.asList("./src", "./config"))
                .denyRead(Arrays.asList("./secrets"))
                .build())
        .build());

6、TerminalTalent 环境自适应

TerminalTalent 在初始化时会自动探测运行环境并适配:

  • Shell 类型:自动识别 Unix Shell(bash/sh)、Windows CMD、Windows PowerShell,使用对应的命令执行方式和环境变量语法($VAR / %VAR% / $env:VAR)。
  • 运行时探测:自动探测系统中的 Python(python3/python)和 Node.js(node/nodejs)命令,并作为 $PYTHON$NODE 环境变量注入到 bash 执行环境中。
  • 跨平台路径处理:自动处理 Windows 和 Unix 的路径分隔符差异。