重构 system prompt 为动态组装系统:PromptComposer 聚合核心身份、AGENTS.md 项目规范和 Skills 目录;新增 read_skill 工具实现技能按需加载;包重命名 internal/context -> internal/prompt 消除 stdlib 冲突。
68 lines
2.5 KiB
Go
68 lines
2.5 KiB
Go
package prompt
|
||
|
||
import (
|
||
"os"
|
||
"path/filepath"
|
||
"strings"
|
||
|
||
"go-tiny-claw/internal/schema"
|
||
)
|
||
|
||
// PromptComposer 负责根据工作区环境动态生成 System Prompt
|
||
type PromptComposer struct {
|
||
workDir string
|
||
skillLoader *SkillLoader
|
||
}
|
||
|
||
func NewPromptComposer(workDir string) *PromptComposer {
|
||
return &PromptComposer{
|
||
workDir: workDir,
|
||
skillLoader: NewSkillLoader(workDir),
|
||
}
|
||
}
|
||
|
||
// Build 组装并返回一条完整的 RoleSystem 消息
|
||
func (c *PromptComposer) Build() schema.Message {
|
||
var promptBuilder strings.Builder
|
||
|
||
// 1. 极简内核 (Minimal Core)
|
||
promptBuilder.WriteString(`# 核心身份
|
||
你名叫 go-tiny-claw,一个由驾驭工程驱动的骨灰级研发助手。
|
||
你具备极简主义哲学,拒绝废话。你能通过系统提供的内置工具,创建、读取、修改和执行工作区中的代码。
|
||
|
||
# 核心纪律 (CRITICAL)
|
||
1. 如需检查文件是否存在,请使用 bash 的 ls 或 test -f,而不是对目录使用 read_file。
|
||
2. 创建新文件时,务必使用 write_file,并同时提供 path 和 content 参数。
|
||
3. 编辑文件前务必先读取现有文件,以理解上下文。
|
||
4. 无论何时你需要写代码或创建文件,都要直接使用 write_file 工具。
|
||
5. 遇到工具执行报错时,仔细阅读 stderr,尝试自己修正命令并重试。
|
||
6. 始终用中文回复,以便传达你的进展和想法。
|
||
`)
|
||
|
||
// 2. 外部化状态:加载项目专属规范 (AGENTS.md)
|
||
agentsMDPath := filepath.Join(c.workDir, "AGENTS.md")
|
||
content, err := os.ReadFile(agentsMDPath)
|
||
if err == nil {
|
||
promptBuilder.WriteString("\n# 项目专属指南 (来自 AGENTS.md)\n")
|
||
promptBuilder.WriteString("以下是当前工作区特有的架构规范与注意事项,你的行为必须绝对符合以下要求:\n")
|
||
promptBuilder.WriteString("```markdown\n")
|
||
promptBuilder.WriteString(string(content))
|
||
promptBuilder.WriteString("\n```\n")
|
||
}
|
||
|
||
// 3. 渐进式技能发现:仅注入目录(名称 + 触发条件),正文按需加载
|
||
skills := c.skillLoader.List()
|
||
if len(skills) > 0 {
|
||
promptBuilder.WriteString("\n# 可用专业技能\n")
|
||
promptBuilder.WriteString("你在以下场景可以调用 read_skill 加载完整的技能指令:\n\n")
|
||
for _, s := range skills {
|
||
promptBuilder.WriteString("- **" + s.Name + "**:" + s.Description + "\n")
|
||
}
|
||
promptBuilder.WriteString("\n当任务匹配上述技能的描述时,请先调用 read_skill 加载完整的执行指南,再严格按照指南操作。\n")
|
||
}
|
||
|
||
return schema.Message{
|
||
Role: schema.RoleSystem,
|
||
Content: promptBuilder.String(),
|
||
}
|
||
} |