Files
go-tiny-claw/internal/tools/read_skill.go
aruo 3e91c7d0a1 v1.6 System Prompt 工程化 + 渐进式技能发现
重构 system prompt 为动态组装系统:PromptComposer 聚合核心身份、AGENTS.md
项目规范和 Skills 目录;新增 read_skill 工具实现技能按需加载;包重命名
internal/context -> internal/prompt 消除 stdlib 冲突。
2026-05-17 00:05:31 +08:00

60 lines
1.4 KiB
Go

package tools
import (
"context"
"encoding/json"
"fmt"
"go-tiny-claw/internal/prompt"
"go-tiny-claw/internal/schema"
)
type ReadSkillTool struct {
loader *prompt.SkillLoader
}
func NewReadSkillTool(workDir string) *ReadSkillTool {
return &ReadSkillTool{
loader: prompt.NewSkillLoader(workDir),
}
}
func (t *ReadSkillTool) Name() string {
return "read_skill"
}
func (t *ReadSkillTool) Definition() schema.ToolDefinition {
return schema.ToolDefinition{
Name: t.Name(),
Description: "按技能名称加载完整的技能指令。在开始任务前可先用 read_skill 获取该技能的详细执行指南。支持技能: git-workflow",
InputSchema: map[string]interface{}{
"type": "object",
"properties": map[string]interface{}{
"name": map[string]interface{}{
"type": "string",
"description": "要加载的技能名称,如 git-workflow",
},
},
"required": []string{"name"},
},
}
}
type readSkillArgs struct {
Name string `json:"name"`
}
func (t *ReadSkillTool) Execute(ctx context.Context, args json.RawMessage) (string, error) {
var input readSkillArgs
if err := json.Unmarshal(args, &input); err != nil {
return "", fmt.Errorf("参数解析失败: %w", err)
}
skill, err := t.loader.Load(input.Name)
if err != nil {
return "", err
}
return fmt.Sprintf("技能: %s\n描述: %s\n\n--- 技能正文 ---\n%s", skill.Name, skill.Description, skill.Body), nil
}