Skip to content

yaoice/goclaude

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

29 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

GoClaude

基于 DDD 四层架构的 Golang 终端 AI 编程助手

Go License Architecture

多 Provider 流式对话 · 工具调用 · MCP 扩展 · Skills · Subagent
Agent Teams · Memory · Hook · 沙箱权限控制

GoClaude 能力地图

图 1 · 能力地图 一张图概览 GoClaude 的核心能力域


GoClaude多 Provider 流式对话、工具调用、MCP 扩展、Skills、Subagent、Agent Teams、Memory、Hook 与沙箱权限控制 收束到同一个终端运行时,适合在本地项目里完成编码、审查、重构与自动化任务。

📖 阅读路线

你想了解什么? 推荐阅读
5 分钟跑起来 快速开始安装与构建
看整体能力 功能特性架构与运行机制
接入外部能力 配置说明MCP 连接外部工具
组织复杂任务 Subagent 子任务执行Agent Teams 协作
查命令与模型 CLI 命令速查支持的模型

📑 目录

点击展开完整目录

💡 项目简介

GoClaude 是一个运行在终端中的 AI 编程助手。它通过 Query Engine 管理多轮消息循环,让模型在需要时自主调用工具、加载 Skill、连接 MCP 服务器或派生 Subagent,并把执行结果回填到上下文继续推理。

适用场景

场景 典型工作流
日常编码辅助 在 REPL 中讨论代码、生成实现、解释报错
代码审查与重构 读取项目代码 → 给出方案 → 执行编辑 → 验证结果
自动化任务 通过 run 命令让 AI 自主调用工具完成一次性任务
多 Agent 协作 Leader 拆分任务,多个 Worker 并行执行并回流结果
私有模型接入 通过 Provider Base URL 对接内部代理或私有模型服务

⚡ 功能特性

核心能力

能力域 说明
模型接入 Anthropic(SSE 流式)、DeepSeek(OpenAI 兼容)、Kimi(OpenAI 兼容)、AWS Bedrock、GCP Vertex AI
工具系统 file_read / file_write / file_editbashglobgrepagentskillmcpteam 等内置工具
MCP 协议 stdio / HTTP / SSE / WebSocket 四种传输,支持 JSON-RPC 动态工具注册
Skills 系统 多来源按需加载,条件激活,可扩展自定义专业能力
多 Agent 协作 Coordinator + Worker 团队模式,支持消息传递、任务分配与结果汇总
权限与沙箱 default / acceptEdits / plan / bypass 四种模式;Linux bwrap,macOS sandbox-exec
REPL / TUI 行编辑、Markdown 渲染、语法高亮、Tab 补全、对话显示、/remember 记忆审查
上下文管理 Token 预算、自动压缩、Memory 注入、Hook 生命周期扩展

模块状态

模块 状态 说明
查询引擎 消息循环、流式处理、Token 预算、自动压缩
工具系统 注册表、并发执行器、权限检查
MCP 协议 stdio / HTTP / SSE / WebSocket 传输,JSON-RPC 客户端
Skills / Subagent 多来源加载、注册表、条件激活、隔离执行
Agent Teams Coordinator + Worker 模式、消息传递、任务分配
Hook / Memory 事件钩子、上下文注入、跨会话记忆
Plugin 系统 市场发现、安装/启用/禁用/卸载、贡献装配(commands/agents/skills/hooks/MCP)
TUI / Slash 命令 bubbletea REPL、消息渲染、命令面板、/<skill>/<command> 直达
配置 / 权限 / 沙箱 分层配置、权限模式、路径与网络限制

🖥️ 系统环境要求

必需依赖:

类型 依赖 说明
必需 Go ≥ 1.22.0 编译与运行
必需 Git ≥ 2.0 版本信息注入

可选依赖:

工具 用途
golangci-lint Lint 静态检查
ripgrep (rg) grep 加速,未安装时退化为纯 Go 实现
bwrap Linux 沙箱支持(macOS 使用内置 sandbox-exec
expect / python3 E2E 测试与 MCP echo server 示例

平台支持:

操作系统 架构 状态
Linux amd64 / arm64 ✅ 全功能支持
macOS amd64 / arm64 ✅ 全功能支持
Windows amd64 🔨 编译通过,部分功能待验证

🚀 快速开始

# 1. 克隆仓库
git clone https://github.com/yaoice/goclaude.git
cd goclaude

# 2. 安装依赖
make deps

# 3. 构建
make build

# 4. 配置 API Key
cp .env.example .env
# 编辑 .env,填入你的 API Key

# 5. 环境检查
./bin/goclaude doctor

# 6. 启动交互式 REPL
./bin/goclaude

提示 — 如遇问题,运行 goclaude doctor 可快速诊断环境配置。


🔧 安装与构建

从源码构建

git clone https://github.com/yaoice/goclaude.git
cd goclaude

# 下载依赖
make deps

# 构建(输出到 ./bin/goclaude)
make build

交叉编译

make build-linux-amd64       # Linux amd64
make build-linux-arm64       # Linux arm64
make build-darwin-amd64      # macOS amd64
make build-darwin-arm64      # macOS arm64 (Apple Silicon)
make build-windows-amd64     # Windows amd64
make build-all               # 所有平台

产物输出到 ./bin/<os>_<arch>/goclaude(Windows 为 goclaude.exe)。

安装到系统路径

make install                 # 安装到 $GOPATH/bin
#
sudo cp ./bin/goclaude /usr/local/bin/

一键开发流程

# 格式化 → 静态检查 → Lint → 测试 → 构建
make all

配置 API Key

GoClaude 通过环境变量读取 API Key。创建 .env 文件(参考 .env.example):

# .env
DEEPSEEK_API_KEY=sk-your-deepseek-api-key
# ANTHROPIC_API_KEY=sk-ant-your-anthropic-api-key
# KIMI_API_KEY=sk-your-kimi-api-key

环境变量加载优先级(从高到低):

优先级 来源 说明
0 进程环境变量 export / shell 注入,最高优先
1 --env-file <path> CLI 显式指定,可重复使用
2 ./.env.local 本地开发覆盖(建议加入 .gitignore
3 ./.env 当前目录
4 父目录 .env 向上查找到的最近 .env 文件
5 ~/.claude/.env 用户全局

诊断命令goclaude doctor 可检查实际加载的 .env 文件路径与变量名。


⚙️ 配置说明

配置层级

GoClaude 支持多层配置合并。运行时先完成 .envsettings.json 与 YAML 配置加载,再注入 AppConfig,由 CLI / REPL 装配到 Query Engine、Tool Executor、MCP、Hook 与沙箱模块。

配置、权限与 Hook 流程
图 2 · 配置 / 权限 / Hook 流程 从配置加载到运行时装配的完整链路

优先级 来源 路径 说明
1 CLI 参数 --max-turns--no-mcp 一次性临时覆盖,最高优先
2 项目级配置 <project>/.goclaude.yaml 团队共享或项目特定
3 用户级配置 ~/.goclaude/config.yaml 个人偏好
4 内置默认 configs/default.yaml 与二进制一同发布

默认配置

configs/default.yaml
api:
  provider: deepseek                  # AI Provider:deepseek | anthropic
  model: deepseek-chat                # 默认模型
  max_tokens: 32768                   # 单次最大输出
  temperature: 1.0                    # 采样温度 (0.0 ~ 2.0)
  stream: true                        # 流式响应

engine:
  max_turns: 100                      # 单次查询最大工具循环数
  token_budget: 200000                # 上下文 Token 预算上限
  auto_compact: true                  # 自动压缩

tools:
  max_concurrency: 10                 # 只读工具最大并发数
  timeout: 120s                       # 工具默认超时

mcp:
  enabled: true                       # 自动连接 MCP 服务器
  connect_timeout: 30s
  request_timeout: 60s

permissions:
  mode: bypass                        # default | acceptEdits | plan | bypass
  auto_approve_read: true             # 只读工具自动放行

sandbox:
  enabled: true
  filesystem_write:
    allow: ["./", "~/.goclaude/tmp"]
    deny: ["~/.ssh", "~/.aws"]
  network:
    disable_network: false

项目级配置示例

# .goclaude.yaml
api:
  provider: anthropic
  model: claude-sonnet-4-20250514
  temperature: 0.7

engine:
  max_turns: 50

permissions:
  mode: acceptEdits                    # 自动放行编辑,无需逐次确认

自定义 Provider Base URL

# ~/.goclaude/config.yaml
providers:
  deepseek:
    base_url: https://your-proxy.example.com
  kimi:
    base_url: https://api.moonshot.cn/v1
    timeout: 300s
    max_retries: 3

🎯 使用示例:REPL 基础

1. 启动 REPL

./bin/goclaude
╭─────────────────────────────────────╮
│  GoClaude v0.1.0  (deepseek-chat)   │
│  Type /help for commands, Ctrl+D    │
│  to exit                            │
╰─────────────────────────────────────╯

>

2. CLI 单轮模式

# 快速问答
./bin/goclaude chat "用一句话解释 DDD"

# 指定模型
./bin/goclaude chat -p deepseek -m deepseek-reasoner "写一个快速排序"

# 自主工具调用
./bin/goclaude run "帮我列出 src 目录下的 .go 文件并计数"

3. 环境诊断

./bin/goclaude doctor
# ✓ Go 1.22
# ✓ Git 2.39
# ✗ bwrap 未安装(沙箱降级为直接执行)
# ✓ DEEPSEEK_API_KEY 已配置
# ✓ ripgrep 13.0

🧩 实战:Skill — 定义专业能力

Skill 是一组由 Markdown 描述的专业提示,可被 LLM 在合适场景下按需加载。

定义 Skill

创建 .claude/skills/api-reviewer/SKILL.md

---
name: api-reviewer
description: Review REST API design and suggest improvements
whenToUse: When the user asks for API review or design feedback
---

You are an API design reviewer. When reviewing API code:
- Follow REST best practices (resource naming, HTTP verbs, status codes)
- Check error handling and idempotency
- Suggest pagination, filtering, and sorting strategies
- Point out security concerns (auth, rate limit, input validation)

条件激活

通过 frontmatter 声明 whenToUse,模型在匹配该描述时会主动调用 Skill 工具加载正文。配合 SkillService 的条件路径(globs / paths),可在文件被读取时自动注入到上下文。

终端中触发 Skill

方式一:自然语言触发

> 请审查我刚写的 API 设计

⚙ 调用工具: Skill
  name: api-reviewer

Skill: api-reviewer
You are an API design reviewer. When reviewing API code...

方式二:Slash 命令查看

> /skills

╭─ Skills ─────────────────────────────╮
│                                       │
│  api-reviewer     审查 REST API 设计  │
│  go-code-style    强制 Go 代码规范    │
│                                       │
│  [Enter] 查看  [Esc] 退出             │
╰───────────────────────────────────────╯

> /skills api-reviewer

╭─ Skill: api-reviewer ────────────────╮
│ 来源: .goclaude/skills/api-reviewer/  │
│ 激活: 按需(when_to_use 匹配时)      │
│ 工具: file_read, file_edit, grep      │
│                                       │
│ === Prompt Body ===                   │
│ You are an API design reviewer...     │
╰───────────────────────────────────────╯

方式三:/<skill名称> 直接执行

直接在 REPL 输入 /<skill名称> [参数] 触发对应 Skill(对齐 Claude 完整语义):

> /api-reviewer 帮我审查 internal/handler/auth.go

▌ skill: api-reviewer
You are an API design reviewer. When reviewing API code...
(正文连同参数注入主对话,模型据此继续推理)
  • 非 fork(默认):渲染 Skill 正文(含 ${CLAUDE_SKILL_DIR}$ARGS 等占位符替换)后注入主对话。
  • context: fork:在独立子 Agent 上下文中执行(可由 frontmatter agent: 指定子 Agent,缺省 general-purpose),仅回显子 Agent 的最终输出:
> /deep-refactor 重构 payment 模块

◇ skill (fork): deep-refactor  →  agent general-purpose
(子 Agent 在隔离上下文执行,结束后回显结果)
  • 尊重 frontmatter:user-invocable: false 的 Skill 不可手动触发;命令分发优先级为 内建命令 > 自定义 Command > Skill

Skill 加载目录优先级

优先级 路径 说明
最高 ~/.goclaude/skills/ 用户全局
~/.claude/skills/ legacy 兜底
逐级向上 .goclaude/skills/ 项目级(从 CWD 向上 16 层)
最低 逐级向上 .claude/skills/ 项目级 legacy 兜底

🔌 实战:MCP — 连接外部工具

MCP(Model Context Protocol)让 GoClaude 接入 stdio / HTTP / SSE / WebSocket 四种外部工具服务器,工具可像内置工具一样被模型调用。

配置 MCP 服务器

创建 .goclaude/.mcp.json

{
  "mcpServers": {
    "postgres": {
      "type": "stdio",
      "command": "mcp-postgres",
      "args": ["--config", "/etc/mcp/pg.yaml"]
    },
    "github": {
      "type": "http",
      "url": "https://mcp.github.com/v1",
      "headers": { "Authorization": "Bearer ${GITHUB_TOKEN}" }
    },
    "realtime": {
      "type": "sse",
      "url": "https://stream.example.com/sse"
    }
  }
}

终端中触发 MCP 工具

查看连接状态:

> /mcp

╭─ MCP 服务器 ─────────────────────────╮
│                                       │
│  postgres     ✓ connected            │
│  github       ✓ connected            │
│  custom-api   ✗ disconnected         │
│      Error: connection refused       │
│                                       │
│  [Enter] 查看工具  [Esc] 退出         │
╰───────────────────────────────────────╯

列出 MCP 工具:

> 列出所有可用的 MCP 工具

可用 MCP 工具:
  - mcp__postgres__query         执行 SQL 查询
  - mcp__postgres__list_tables
  - mcp__github__search_repos
  - mcp__github__create_issue

自然语言触发 MCP 工具:

> 查询 users 表最近注册的 10 个用户

⚙ 调用工具: mcp__postgres__query
  query: SELECT id, email, created_at FROM users ORDER BY created_at DESC LIMIT 10

result: [
  {"id": 142, "email": "[email protected]", "created_at": "2026-06-09"},
  ...
]

🤖 实战:Subagent — 派生子 Agent 执行子任务

Subagent 在独立上下文里执行单个子任务,返回结果后由主 Agent 继续。

定义自定义 Subagent

创建 .claude/agents/echo-bot.md

---
name: echo-bot
description: When you want a tiny isolated agent that simply echoes back a payload prefixed with [ECHO]
tools: []
model: deepseek-chat
---

You are a minimal echo agent. Whatever input you receive, reply with one line:
  [ECHO] <the user's input verbatim>
Do not call any tools. Do not add commentary. Just the line above.

终端中触发 Subagent

自然语言触发:

> 用 echo-bot 复述这段话:hello world

⚙ 调用工具: Agent
  subagent_type: echo-bot
  prompt: hello world

[ECHO] hello world

CLI 管理:

./bin/goclaude agents list          # 列出所有 Agent
./bin/goclaude agents show echo-bot # 查看某个 Agent 详情

Agent 加载目录

优先级 路径 说明
最高 ~/.goclaude/agents/ 用户全局
~/.claude/agents/ legacy 兜底
逐级向上 .goclaude/agents/ 项目级(从 CWD 向上 16 层)
最低 逐级向上 .claude/agents/ 项目级 legacy 兜底

👥 实战:Agent Teams — 多 Agent 团队协作

启用 --agent-teams 后,GoClaude 切换到 Coordinator + Worker 模式:Leader Agent 可将复杂任务拆解分配给多个 Worker,并行执行、自动汇总。

启动团队模式

./bin/goclaude --agent-teams
╭─────────────────────────────────────╮
│  GoClaude v0.1.0  [Team Mode]       │
│  Agent-Teams: enabled               │
╰─────────────────────────────────────╯

>

自然语言触发团队协作

> 我需要为一个新项目搭建完整的后端骨架:
> 1. 初始化 Go 模块和项目结构
> 2. 实现用户注册和登录 API
> 3. 添加 JWT 认证中间件
> 请用 team 模式并行处理这些任务

⚙ 调用工具: team_create
  name: backend-init

⚙ 调用工具: create_task
  team: backend-init
  assignee: worker-1
  task: 初始化 Go 模块,创建 cmd/server/main.go、internal/ 目录结构

⚙ 调用工具: create_task
  team: backend-init
  assignee: worker-2
  task: 实现 /api/register 和 /api/login 端点

⚙ 调用工具: create_task
  team: backend-init
  assignee: worker-3
  task: 实现 JWT 中间件

[worker-1] ✓ 完成: 已创建 go.mod、cmd/server/main.go、internal/ 骨架
  → main.go 启动监听 :8080
  → go.sum 已生成

[worker-2] ✓ 完成: 已实现 auth handler
  → POST /api/register: bcrypt hash + 写入 users 表
  → POST /api/login: 密码校验 + 签发 JWT

[worker-3] ✓ 完成: JWT 中间件就绪
  → 从 Authorization: Bearer <token> 提取
  → 验证签名和过期时间
  → 注入 user_id 到 context

⚙ 调用工具: send_message (broadcast)
  content: 所有任务完成。请确认代码合并无误。

所有三个模块已并行完成。文件清单:
  cmd/server/main.go        — HTTP 入口
  internal/handler/auth.go  — 注册/登录 API
  internal/middleware/jwt.go — JWT 认证中间件
  go.mod / go.sum            — 依赖管理

[tokens: 312 in / 8,421 out | cost: $0.0580 | team: backend-init | workers: 3]

CLI 团队管理

./bin/goclaude team create my-team                           # 创建团队
./bin/goclaude team list                                     # 列出所有团队
./bin/goclaude team join my-team worker-1                    # Agent 加入团队
./bin/goclaude team send worker-1 "请处理 auth 模块的单元测试"  # 发送消息
./bin/goclaude team inbox worker-1                           # 查看收件箱
./bin/goclaude team delete my-team --force                   # 强制删除

团队消息流

Agent Teams 协作流程
图 3 · Agent Teams 协作流程 Leader 拆分任务、Worker 并行执行、Mailbox 回流汇总

核心闭环:Leader 创建团队并拆分任务 → Worker 并行执行后通过 Mailbox 回传进展 → Leader 每轮自动读取 inbox → 将关键输出注入上下文 → 生成汇总、复核或二次分配。


📏 实战:Rules — 行为约束规则

Rules 是一组持久化的行为指令,GoClaude 启动时自动加载并注入到 System Prompt,全程影响 AI 的决策。

创建 Rules

项目级 Rules(自动加载)

创建 .goclaude/rules/coding-standards.md

# Code Standards

## 命名规范
- 使用驼峰命名(camelCase),导出标识符首字母大写
- 避免缩写,除非广泛公认(URL、JSON、API)
- 测试函数命名:Test<Func>_<场景>_<期望>

## 错误处理
- 永远不要忽略 error:不要使用 `_`
- 使用 `fmt.Errorf("...: %w", err)` 包装错误,保留调用链
- 公开 API 的错误信息不要包含内部实现细节

## 测试
- 每个导出函数必须有单元测试
- 使用 testify/assert 进行断言
- 表格驱动测试优先

## 安全
- 禁止在代码中硬编码密钥、密码、Token
- 所有外部输入必须校验
- SQL 查询必须使用参数化

用户级 Rules(全局生效)

创建 ~/.goclaude/rules/preferences.md

## 语言偏好
- 始终用中文回复
- 代码注释用英文

## 格式偏好
- 优先使用 table-driven tests
- 错误消息用小写开头,不加句号

Rules 加载路径

GoClaude 按以下顺序加载并合并 rules(后加载的追加,不覆盖):

顺序 路径 说明
1 ~/.goclaude/rules/ 用户全局(先加载,基础层)
2 <project>/.goclaude/rules/ 项目级(后加载,叠加层)

Rules 效果验证

> 写一个用户登录的函数

// 注意:以下输出已受到 rules 约束

package auth

import (
    "errors"
    "fmt"
)

var ErrInvalidCredentials = errors.New("invalid credentials")
var ErrUserNotFound = errors.New("user not found")

// Login authenticates a user with the given credentials.
// Returns a session token on success.
//
// Security: passwords are compared using constant-time comparison.
func Login(username, password string) (string, error) {
    // 函数名使用驼峰 ✓
    // 错误消息小写不加句号 ✓
    // 注释用英文 ✓
    ...
}

// 没有硬编码密钥 ✓
// 没有忽略 error ✓

🧠 实战:Memory — 持久化上下文

GoClaude 自动管理一个跨会话的记忆系统。AI 在对话中会将项目关键信息持久化到用户数据目录,下次新会话中自动加载。

Note

Memory 不在项目根目录下——它存储在 ~/.goclaude/projects/<sanitized-path>/memory/ 中,按项目路径隔离,不会进入你的 Git 仓库

Memory 目录结构

~/.goclaude/projects/
└── <sanitized-cwd>/               # 项目路径的 sanitized 版本
    └── memory/
        ├── MEMORY.md               # 入口索引(≤200 行,≤25KB)
        └── *.md                    # AI 创建的分片记忆文件

如需自定义路径,可通过 settings.json 中的 autoMemoryDirectory 字段覆盖。

Memory 自动写入

AI 在对话过程中会自主调用 update_memory 工具:

> 我们这个项目的数据库用的是 PostgreSQL 15,部署在 Docker 容器里,
> 连接字符串在环境变量 DATABASE_URL 里。监听端口固定 5432。

好的,我已了解项目配置。让我把这些信息记录下来。

⚙ 调用工具: update_memory
  action: create
  title: "Project Database Configuration"
  content: |-
    数据库: PostgreSQL 15
    部署方式: Docker 容器
    连接字符串: 环境变量 DATABASE_URL
    端口: 5432

[tokens: 28 in / 145 out | cost: $0.0011]

Memory 自动查询

下次新会话中,GoClaude 启动时自动将 MEMORY.md 内容注入 System Prompt:

> 帮我写一个数据库迁移脚本

[启动时已加载 MEMORY.md]
根据项目配置,你在使用 PostgreSQL 15。这是我为你生成的迁移脚本...

⚙ 调用工具: file_write
  path: migrations/001_init.sql

MEMORY.md 内容示例

## Project Database Configuration
- 数据库: PostgreSQL 15
- 部署方式: Docker 容器
- 连接字符串: 环境变量 DATABASE_URL
- 端口: 5432

## Code Conventions
- 分支命名: feature/*, bugfix/*, release/*
- PR 需要至少 1 个 review approval
- 使用 squash merge

手动触发 Memory

方式 说明
自然语言 直接在对话中告诉 AI「记住:...」,AI 调用工具更新记忆目录
/remember 命令 AI 扫描全部记忆层,生成结构化清理报告
直接编辑文件 编辑 ~/.goclaude/projects/<sanitized-cwd>/memory/MEMORY.md,下次启动时重新加载

长期记忆(可选)

默认使用 MEMORY.md;如需更强的全文检索和项目级知识管理,可启用长期记忆:

# ~/.goclaude/config.yaml
long_term_memory:
  enabled: true
  db_path: ~/.goclaude/memory.db
  capacity:
    max_entries: 10000
    max_age_days: 180

启动后 GoClaude 会自动:

  1. 在每次工具调用、Agent 切换时把关键观察写入 SQLite FTS5 索引
  2. 在下次会话开始时把 <long-term-memory> 块注入首条 user message
  3. 通过 Hook 生命周期自动清理过期条目

Memory 设计原则

原则 说明
私密性 存在用户级目录,不会进入 Git 仓库
可移植 跨机器迁移只需拷贝 ~/.goclaude/ 目录
可审查 所有写入都可追溯到具体的对话轮次
可清理 /remember 命令提供可视化的审查与整理

🪝 实战:Hook — 事件拦截与上下文注入

Hook 是一组在特定事件触发时执行的命令或脚本,支持拦截、注入、通知和清理四大能力。

事件类型

GoClaude 提供 7 种内置事件,覆盖完整生命周期:

事件 触发时机 典型用途
SessionStart REPL / CLI 启动 加载环境、初始化状态
SessionEnd REPL / CLI 退出 清理临时资源、上报统计
UserPromptSubmit 用户提交 prompt 前缀处理、敏感词过滤
PreToolUse 工具调用前 参数校验、权限审计
PostToolUse 工具调用后 自动格式化、日志归档
SubagentStart Subagent 启动 注入上下文、规则
SubagentStop Subagent 结束 结果记录、通知

Hook 配置

hooks:
  enabled: true
  async_timeout_ms: 30000
  progress_interval_ms: 1000

  hooks_config:
    matchers:
      # ── 会话生命周期 ──
      - event: SessionStart
        hook_name: session-init
        command: "echo '=== Session started at $(date) ==='"

      - event: SessionEnd
        hook_name: session-cleanup
        command: "python3 ~/.goclaude/hooks/cleanup.py --session=${SESSION_ID}"

      # ── PreToolUse 拦截 bash ──
      - event: PreToolUse
        tool_name: bash
        hook_name: pre-bash-audit
        command: "python3 ~/.goclaude/hooks/bash_audit.py"
        timeout: 10000

      # ── PostToolUse 格式化 ──
      - event: PostToolUse
        tool_name: file_write
        hook_name: auto-gofmt
        command: "gofmt -w {{.file_path}}"
        timeout: 5000

      # ── SubagentStart 注入上下文 ──
      - event: SubagentStart
        hook_name: subagent-context
        command: "cat ~/.goclaude/subagent_rules.md"

      # ── UserPromptSubmit 前缀处理 ──
      - event: UserPromptSubmit
        hook_name: auto-prefix
        command: "echo '请用 Go 惯用模式实现,使用中文回复'"

Tip

Hook 命令通过 stdin 接收 JSON 格式的上下文信息(sessionId, agentType, toolName 等),stdout 输出 JSON 响应。详细协议参见 hook.Contexthook.Result 类型。

配置合并与执行流程

配置、权限与 Hook 流程
图 4 · Hook 配置合并与执行 多来源配置合并后驱动事件钩子触发

合并策略:标量 → 覆盖 | 数组 → concat + dedup | 对象 → 深度合并

Handler 执行保证

保证 说明
顺序执行 同一事件的 handler 按注册顺序依次运行
Context 累积 多个 handler 的 AdditionalContexts 合并注入
Block 短路 任一 handler 返回 Block: true,立即停止后续 handler
错误隔离 单个 handler panic 或返回 error 不影响其他 handler
线程安全 sync.RWMutex 保护 Registry,支持并发 subagent 读取

🧷 实战:自定义 Command — /<command名称> 直接触发

自定义 Command 是一组由 Markdown 描述的 prompt 模板,可在 REPL 中通过 /<命令名> [参数] 直接触发,渲染后作为用户输入发给模型。

定义 Command

创建 .goclaude/commands/deploy.md(也兼容 ~/.claude/commands/.claude/commands/):

---
description: 执行部署流程并生成发布说明
argument-hint: "[环境]"
aliases: ["dp", "ship"]
arguments: env
---
请为 $env 环境执行部署检查清单,并基于改动生成发布说明。原始参数:$ARGUMENTS
  • 文件名即命令名;子目录映射为 命名空间:命令(如 commands/git/commit.md/git:commit)。
  • aliases 声明别名,/dp/ship 等价于 /deploy,别名同样进入 Tab 补全与 /help
  • 参数占位符:$name(命名参数)、$ARGUMENTS[N]$N$ARGUMENTS(整段);无占位符且有参数时自动追加 ARGUMENTS: <args>

终端中触发

> /deploy staging

执行部署:staging
(渲染后的正文作为 user prompt 注入对话)

Command 加载目录

优先级 路径 来源
<cwd>/.goclaude/commands/.claude/commands/ project
~/.goclaude/commands/~/.claude/commands/ user
最低 已启用插件贡献的 commands/ 目录 plugin

🧱 实战:Plugin — 插件全生命周期管理

Plugin 复刻 Claude 的插件机制:一个插件可同时贡献 commands / agents / skills / hooks / MCP servers,通过**插件市场(marketplace)**发现与安装,支持启用/禁用与卸载,状态持久化在 ~/.goclaude/plugins/

插件结构

my-plugin/
├── .claude-plugin/
│   └── plugin.json          # 清单:name / version / description / 贡献路径
├── commands/                # 贡献的 slash 命令(*.md)
├── agents/                  # 贡献的 subagent(*.md)
├── skills/<name>/SKILL.md   # 贡献的 skill
├── hooks/hooks.json         # 贡献的命令式 hook
└── .mcp.json                # 贡献的 MCP 服务器

plugin.json 示例(贡献路径均可省略,缺省按上述约定目录):

{
  "name": "my-plugin",
  "version": "0.1.0",
  "description": "示例插件",
  "author": "you",
  "commands": "./commands",
  "agents": "./agents",
  "skills": "./skills",
  "hooks": "./hooks/hooks.json",
  "mcpServers": "./.mcp.json"
}

插件市场

市场根目录含 .claude-plugin/marketplace.json

{
  "name": "my-marketplace",
  "plugins": [
    { "name": "my-plugin", "source": "./my-plugin", "description": "示例插件" }
  ]
}

市场来源支持三种类型:本地目录远程 git 仓库HTTP(S) tar/zip 压缩包

Important

远程来源(git / http)在拉取前做 SSRF 防护:默认拒绝内网地址(环回、私有网段、9.* / 10.* / 11.* / 21.* / 30.* 等);压缩包解压有 zip-slip / 路径穿越防护与大小上限。如确需访问内网,显式加 --allow-internal-hosts

CLI 管理

# 市场
goclaude plugin marketplace add ./path/to/marketplace          # 本地目录
goclaude plugin marketplace add https://github.com/owner/repo  # 远程 git
goclaude plugin marketplace add https://example.com/mkt.tar.gz # 压缩包
goclaude plugin marketplace list
goclaude plugin marketplace remove my-marketplace

# 插件
goclaude plugin install my-plugin@my-marketplace   # 从市场安装
goclaude plugin install ./local/plugin             # 直接来源安装
goclaude plugin list
goclaude plugin disable my-plugin                  # 禁用(保留安装)
goclaude plugin enable my-plugin                   # 启用
goclaude plugin uninstall my-plugin                # 卸载

终端中查看(REPL /plugin

> /plugin

Plugins
  my-plugin v0.1.0  enabled  @my-marketplace
    示例插件

Marketplaces
  my-marketplace [local]  1 plugins
    ./path/to/marketplace

管理: CLI `goclaude plugin install <name@mkt>` / `uninstall` / `marketplace add <src>`

/plugin enable <name>/plugin disable <name> 可在 REPL 内切换启用状态(重启 REPL 生效)。

贡献装配与优先级

启用的插件在启动装配阶段把贡献合并进各注册表,来源标记为 plugin优先级最低(不会覆盖用户/项目配置):

贡献类型 合并目标 触发方式
commands CustomCommands /<command>
agents Agent Registry Agent 工具 / /agents
skills Skill Registry /<skill> / Skill 工具
hooks Hook Registry 生命周期事件(命令式 hook,stdin/stdout JSON)
MCP servers MCP Manager mcp__<server>__<tool>

📋 CLI 命令速查

REPL Slash 命令

命令 说明
/help / /? 显示完整帮助
/exit /quit /q 退出 REPL
/clear /reset 清空对话历史
/history 浏览历史输入
/messages 查看当前消息列表
/model [name] 查看或设置模型标识
/cost /usage Token 用量与费用
/permissions 权限模式(Shift+Tab 切换)
/env 环境变量来源
/pwd 当前工作目录
/redraw 清屏重印 Banner
/compact 上下文压缩状态
/skills [name] Skills 面板 / 详情
/remember 审查整理记忆
/agents [type] Agents 面板 / 详情
/mcp [tools|status] MCP 面板 / 工具 / 状态
/tools [name] 工具列表 / Schema
/teams [name] 团队列表 / 详情
/plugin [list|marketplaces|enable|disable] 插件 / 市场管理
/<skill名称> [args] 直接触发对应 Skill
/<command名称> [args] 直接触发自定义 Command

顶级 CLI 命令

命令 说明
goclaude 交互式 REPL
goclaude chat [prompt] 单轮流式对话
goclaude run [prompt] 自主工具调用执行
goclaude doctor 环境诊断
goclaude version 版本信息
goclaude skills [list|show] Skills 管理
goclaude agents [list|show] Subagent 管理
goclaude mcp [list|tools|status] MCP 管理
goclaude team [create|list|show|join|send|inbox|delete] 团队管理
goclaude plugin [list|install|uninstall|enable|disable] 插件管理
goclaude plugin marketplace [add|list|remove] 插件市场管理

常用标志

标志 默认值 说明
-p, --provider deepseek Provider (deepseek / anthropic / kimi)
-m, --model deepseek-chat 模型
-v, --verbose false 详细日志
--env-file 额外 .env(可重复)
--agent-teams false 团队模式
--no-mcp false 禁用 MCP
--max-turns 20 最大工具循环数
--dangerously-skip-permissions false 跳过权限

🧬 支持的模型

Provider 模型 说明
DeepSeek deepseek-chat V3 通用对话(默认)
DeepSeek deepseek-reasoner R1 推理模型(支持 thinking)
DeepSeek deepseek-coder 代码专项
Kimi kimi-k2.6 Kimi K2 多模态模型
Kimi Kimi K2.7 Code Kimi K2 代码专项
Anthropic claude-sonnet-4-20250514 Claude Sonnet 4
Anthropic claude-opus-4-20250514 Claude Opus 4(待验证)
AWS Bedrock 🔨 接口已定义,待完整实现
GCP Vertex AI 🔨 接口已定义,待完整实现

📋 Todo

下列能力均已实现并通过测试。

# 条目 状态 说明
1 /<skill名称> 终端触发 终端中通过 /<skill名称> 直接触发对应的 Skill 执行(context: fork 走子 Agent,否则注入主对话)
2 Plugin 全生命周期管理 市场注册/发现、插件安装、升级、卸载、启用/禁用、配置与贡献装配(commands/agents/skills/hooks/MCP)
3 /<command名称> 终端触发 终端中通过 /<command名称> 直接触发对应的自定义 Command(支持别名、补全与 /help 展示)

📁 项目结构

项目目录是 DDD 分层的物理映射。核心目录按「入口 → 用例编排 → 领域核心 → 基础设施实现 → 工具适配」组织。

路径 角色 重点内容
cmd/goclaude/ 进程入口 环境加载、配置初始化、信号处理、Cobra 根命令启动
pkg/interfaces/ 交互入口层 CLI、REPL、TUI、Slash 命令、运行时适配器
pkg/application/ 应用编排层 Skill、Agent、MCP、Team、Workflow、Memory、Hook 服务
pkg/domain/ 领域核心层 Query Engine、Tool Executor、权限模型、消息与事件模型
pkg/infrastructure/ 基础设施层 Provider、MCP 传输、文件系统、Shell、沙箱、持久化
pkg/tools/ 工具适配层 file、bash、grep、glob、skill、mcp、agent、team 等工具实现
pkg/util/ 通用支持 .env、frontmatter、settings env、WebSocket 等内部工具
configs/ 默认配置 default.yaml 是参数类配置的默认来源
tests/ 验证体系 Go 集成测试与 Shell E2E 场景

模块之间的依赖关系:

GoClaude 模块关系图
图 5 · 模块关系图 各 package 之间的依赖与协作关系


🏛️ 架构与运行机制

GoClaude 遵循严格的 DDD 四层架构

  • interfaces — CLI / REPL / TUI 入口与运行时装配
  • application — 编排 Skill、Agent、MCP、Team、Memory 等用例服务
  • domain — 查询引擎、工具模型、权限模型等核心抽象
  • infrastructure — Provider、文件系统、MCP 传输、沙箱、持久化等具体实现

额外的 pkg/tools 作为工具适配层,将本机能力、MCP、Agent、Team 等统一适配为 domain/tool.Tool

完整应用分层架构

GoClaude 完整应用分层架构
图 6 · 完整应用分层架构 interfaces / application / domain / infrastructure 四层全景

系统总览

GoClaude 系统架构总览
图 7 · 系统架构总览 运行时各子系统的整体组成与交互

核心数据流

Query Engine 数据流
图 8 · Query Engine 数据流 消息组装 → 流式调用 → 工具执行 → 结果回填的循环

运行机制说明

  1. 启动阶段cmd/goclaude/main.go 加载环境变量、.env 链、settings.json 与 YAML 配置,创建根 context 并进入 Cobra 命令树
  2. 路径分流chat 走轻量 Provider 验证路径;REPL / run 走完整 Query Engine,装配工具、Skills、MCP、Subagent、Team、Memory 与 Hook
  3. 服务装配buildAppContext 集中加载扩展源并构建 Tool Registry;本地与 MCP 工具统一暴露为工具定义,随 StreamParams 发送给模型
  4. 核心循环 — Query Engine 以「消息组装 → Provider 流式调用 → 事件转发 → 工具执行 → tool_result 回填」的循环运行,直到无 tool_use / 达到 max_turns / context 取消
  5. 工具调度 — Tool Executor 先做输入校验与权限检查,只读工具并行执行,写入类操作串行执行
  6. 扩展机制 — 自动压缩、条件 Skill 激活、Team leader inbox 注入、长期记忆 Hook 等均通过引擎配置或回调接入

设计原则

原则 说明
依赖倒置(DIP) 领域层只定义接口,基础设施层提供实现。query.AIProvideranthropic.Client / deepseek.Client / kimi.Client 实现
并发模型 context.Context 级联取消、goroutine + channel 流式响应、errgroup worker pool、sync.RWMutex 保护共享状态
安全默认值 API Key 只走环境变量;工具调用先校验与授权;写入类操作串行;Shell 受沙箱约束
扩展优先 Skills、MCP、Subagent、Team、Hook、Memory 都通过服务或回调接入,避免污染领域层核心循环

📄 许可证

本项目采用 Apache License 2.0 开源许可证。

详见 LICENSE 文件。

About

goclaude is a terminal AI coding assistant rewritten in Go

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages