Use when asked about harness9 architecture, module design, or how components interact — explains the system design
日本語の概要は準備中です。原文の説明を表示しています。
Use when writing or reviewing Go code — explains harness9 project coding conventions and patterns
インストールする前に、エージェントに与えられる指示の中身を確認できます。
| 类别 | 规范 | 示例 |
|---|---|---|
| 包名 | 小写、单单词、无下划线 | engine、provider、schema |
| 导出类型/函数 | PascalCase | AgentEngine、NewRegistry |
| 未导出类型/函数 | camelCase | mainLoop、runLoop |
| 接口名 | 以 -er 后缀为惯例 | Provider、Registry、BaseTool |
| 常量 | PascalCase(导出)或 camelCase(未导出),不使用全大写 | RoleSystem、maxLogOutputLen |
| 配置选项函数 | With 前缀 | WithMaxTurns、WithToolTimeout |
error 返回值,禁止 _ 忽略fmt.Errorf("context: %w", err) 包装错误,保留错误链// ✅ 正确
result, err := doSomething()
if err != nil {
return fmt.Errorf("do something: %w", err)
}
// ❌ 错误
result, _ := doSomething()
命名规范:New + 类型名
func NewReadFileTool(workDir string) *ReadFileTool {
return &ReadFileTool{workDir: filepath.Clean(workDir)}
}
接口定义在使用者侧,而非实现者侧。
// ✅ 正确:Registry 接口定义在 tools 包(使用者侧)
// internal/tools/registry.go
type Registry interface {
Register(tool BaseTool) error
GetAvailableTools() []schema.ToolDefinition
Execute(ctx context.Context, call schema.ToolCall) schema.ToolResult
}
// ❌ 错误:不要在实现所在的包中定义接口
并发工具执行使用预分配切片 + 索引写入,确保结果顺序:
// Go 1.22+ 中 for range 每次迭代已自动创建新绑定,无需手动传参捕获。
// 本项目使用 Go 1.25,以下写法是正确的:
results := make([]schema.ToolResult, len(toolCalls))
var wg sync.WaitGroup
for i, tc := range toolCalls {
wg.Add(1)
go func() {
defer wg.Done()
toolCtx, cancel := context.WithTimeout(ctx, e.toolTimeout)
defer cancel()
results[i] = e.registry.Execute(toolCtx, tc)
}()
}
wg.Wait()
internal/tools/ 下创建 xxx.go,实现 BaseTool 接口safePath() 校验所有文件路径参数internal/tools/xxx_test.go 中添加表驱动测试cmd/harness9/main.go 中注册工具type MyTool struct {
workDir string
}
func (t *MyTool) Name() string { return "my_tool" }
func (t *MyTool) Definition() schema.ToolDefinition { /* JSON Schema */ }
func (t *MyTool) Execute(ctx context.Context, args json.RawMessage) (string, error) { /* ... */ }
testing 包,不引入第三方断言库go test ./...func TestXxx(t *testing.T) {
cases := []struct {
name string
input string
want string
}{
{"normal", "foo", "bar"},
{"empty", "", ""},
}
for _, tc := range cases {
t.Run(tc.name, func(t *testing.T) {
got := Xxx(tc.input)
if got != tc.want {
t.Errorf("got %q, want %q", got, tc.want)
}
})
}
}
提交前必须通过:
gofmt -l . # 无输出表示格式正确
go vet ./... # 无 warning
go test ./... # 全部通过
まだレビューはありません。使ってみた感想をお寄せください。
概要と使いどころ
Use when asked about harness9 architecture, module design, or how components interact — explains the system design
日本語の概要は準備中です。原文の説明を表示しています。
Feature auto-development — clarify requirements, generate spec, dispatch dev sub-agent to implement and merge into current branch
日本語の概要は準備中です。原文の説明を表示しています。
Use when the user invokes /commit or asks to commit changes, after a code review has been completed and the changes are confirmed ready to stage and commit to git.
日本語の概要は準備中です。原文の説明を表示しています。
Use when the user invokes /cr, requests a code review, or before committing to verify correctness, security, and quality of new or modified code in the working tree.
日本語の概要は準備中です。原文の説明を表示しています。
Use when debugging Go errors, test failures, or unexpected behavior — step-by-step diagnosis approach
日本語の概要は準備中です。原文の説明を表示しています。
Use when the user invokes /pr or asks to push changes and open a pull request, after commits are ready to be pushed to a remote branch and merged into the main branch.
日本語の概要は準備中です。原文の説明を表示しています。