github.com/liu-ethan/golem

Go 原生的
AI 编程 Agent

Go LLM Execution Model — 单二进制、零 CGO、毫秒级冷启动。 分层记忆管道、声明式权限引擎、四种审批模式,UX 对齐 Claude Code 与 Codex CLI。

Go 1.22+ Bubble Tea TUI BM25 记忆检索 YAML 权限规则 Linux Namespace
golem — welcome
golem 欢迎页

核心功能

从 Agent 主循环到三层记忆,golem 把 AI 编程助手需要的每一块都编译进一个静态二进制。

Agent 主循环

Streaming SSE 流式响应,自动识别 tool_use 并循环执行。内置 bash、read/write/edit、list_dir、grep 等工具。

三层记忆系统

Layer 0 滑动窗口压缩、Layer 1 BM25 情节记忆、Layer 2 自动合并 user_profile.md。按需注入,降低 Token 消耗。

四层安全模型

审批模式(UX)+ YAML 规则(bash 策略)+ project_root 路径隔离 + Linux Namespace 沙箱,各司其职。

斜杠命令体系

/permissions、/sessions、/compact、/context 等命令对齐 Claude Code / Codex CLI,Shift+Tab 切换审批模式。

模型无关接入

统一 Anthropic Messages API 协议,base_url 可配 Claude、DeepSeek 等兼容端点,不绑定单一厂商。

Go 原生工程化

纯 Go SQLite(modernc.org/sqlite)、Bubble Tea TUI、GitHub Actions CI。适合嵌入 CI/CD 与本地开发工作流。

设计亮点

深入研究 Claude Code 与 Codex CLI 的架构差异,在 Go 生态中实现差异化增强。

能力 Claude Code / Codex golem
记忆检索 全量注入或固定上限 BM25 按需检索 top-K
记忆分层 单层或两阶段管道 三层架构 Working / Episodic / Semantic
用户画像 有限或无 每项目 user_profile.md,每 3 次会话自动更新
上下文压缩 手动或自动触发 80% 阈值自动压缩 + /compact + /context 可视化
审批交互 plan / ask / auto 等模式 四种模式 + Shift+Tab + /permissions 权限页
权限规则 YAML 声明式规则 同样 YAML,deny > ask > allow,/permissions 管理
进程隔离 应用层 + sandbox 模式 project_root 路径隔离 + bash namespace(P1)
部署形态 Node / Rust 运行时依赖 单静态二进制,冷启动 < 20ms,零 CGO
模型接入 厂商绑定或有限切换 Anthropic 风格接口,base_url 自由配置

会记住你的 Agent

跨会话提取偏好与项目事实,BM25 检索按需注入。相比全量记忆注入,显著降低 Token 消耗,同时保持上下文相关性。

安全可控的执行环境

审批模式、YAML 规则、project_root 路径限制、bash namespace 四层分离——不是把所有安全逻辑堆在一层里。

熟悉的 TUI 体验

暖色主题对齐 Claude Code CLI,Thinking 流与最终回答视觉分离,语义着色区分路径、代码块与用户/助手消息。

Go 生态原生

纯 Go SQLite 驱动、Bubble Tea 组件化 TUI、colocated 单元测试 + integration 端到端测试。适合 Go 团队直接 fork 定制。

快速开始

Go 1.22+,Linux 上可用 Namespace 沙箱。克隆仓库、配置 API Key、在项目目录启动即可。

  1. 克隆并构建

    编译为单个静态二进制,可选安装到 PATH。

  2. 配置 LLM 端点

    项目级 .golem/config.yaml 覆盖全局 ~/.golem/config.yaml,支持环境变量占位符。

  3. 进入项目目录启动

    你在哪个目录执行 golem,哪里就是 project_root。TUI 内 Shift+Tab 切换审批模式。

# 安装
git clone https://github.com/liu-ethan/golem.git
cd golem
go build -o golem ./cmd/golem

# 配置 .golem/config.yaml
provider:
  base_url: "https://api.anthropic.com"
  api_key: "${ANTHROPIC_API_KEY}"
  model: "claude-sonnet-4-5"
defaults:
  approval: ask-before-edit
  sandbox: workspace-write

# 启动
cd my-project
./golem

如何使用

Bubble Tea 驱动的 TUI,流式渲染、工具调用卡片、审批确认——一切在终端内完成。

golem v0.1.0-dev
golem 欢迎页界面
首次启动 — 显示模型、sandbox 模式、常用斜杠命令提示。Enter 开始对话,q 退出。运行 /init 可生成 AGENTS.md 模板。
golem — chat
golem 对话界面
状态栏 — 显示 project_root、approval 模式、sandbox、session ID、Token 用量与模型名。Thinking 块与最终回答视觉分离,透明展示推理过程。
golem — tool execution
golem 工具执行界面
工具调用 — read_file 自动执行,write_file 在 ask-before-edit 模式下弹确认。Diff 预览 inline 展示,Y/Enter 批准,n/Esc 拒绝。
Shift+Tab循环切换 approval 模式
/permissions权限页:切换模式 + 查看 rules
/sessions会话列表,点选 resume
/compact手动触发 Layer 0 压缩
/context可视化 context 占用
/diff显示 working tree git diff

审批模式

plan只读探索,write/bash 直接拒绝
ask-before-edit写操作前确认(默认推荐)
ask任意 tool 执行前均弹确认
edit-automatically全部自动执行

项目架构

从用户输入到记忆提取的完整执行管道,安全层与审批层严格分离。

用户输入
TUI 接收消息,加载会话历史
会话管理层
SQLite 读取历史 · BM25 检索 memory_facts · 注入 user_profile.md + top-K 记忆
Agent 主循环
LLM Streaming SSE → 解析 tool_use → 分发工具执行 → 循环直至完成
权限规则层
仅匹配 bash command · deny > ask > allow · deny 命中直接拒绝,不弹框
审批交互层
plan / ask-before-edit / ask / edit-automatically · Shift+Tab 或 /permissions 切换
沙箱 / 路径校验
bash namespace fork · 文件工具限制在 project_root 内
记忆提取层
会话结束同步提取 3–5 条事实 → SQLite · 每 3 次会话触发 Layer 2 合并

目录结构

golem/
├── cmd/golem/          # CLI 入口
├── internal/
│   ├── llm/            # LLMClient + prompts/
│   ├── agent/          # Agent 主循环
│   ├── tools/          # 内置工具集
│   ├── approval/       # 审批交互模式
│   ├── rules/          # YAML 权限规则
│   ├── sandbox/        # Linux Namespace
│   ├── session/        # SQLite 会话
│   ├── memory/         # 三层记忆 + BM25
│   └── tui/            # Bubble Tea 界面
└── .golem/             # 项目级配置
    ├── config.yaml
    ├── rules.yaml
    ├── user_profile.md
    └── data/golem.db

记忆分层

Layer 0 · Working Memory
  当前会话 message history
  context 达 80% 自动压缩

Layer 1 · Episodic Memory
  会话结束提取 3–5 条事实
  BM25 检索 top-K 注入

Layer 2 · Semantic Memory
  每 3 次会话合并
  → .golem/user_profile.md
  始终注入 system prompt