重构 system prompt 为动态组装系统:PromptComposer 聚合核心身份、AGENTS.md 项目规范和 Skills 目录;新增 read_skill 工具实现技能按需加载;包重命名 internal/context -> internal/prompt 消除 stdlib 冲突。
60 lines
1.4 KiB
Go
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
|
|
}
|