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 }