CodingClaw Agent 是一个用 Python 开发的个人编程助手(Personal Coding Agent),专注于本地编码工作流程。它是一个单智能体系统,支持通过命令行界面(CLI)和 JSON-RPC 与 AI 模型交互。
| 特性 | 说明 |
|---|---|
| 单智能体编码工作流 | 集成的 AI 助手,帮助完成编程任务 |
| OpenAI 兼容模型网关 | 支持任何 OpenAI 兼容的 API(默认 Kimi K2.5) |
| 本地 JSONL 会话和日志 | 所有数据以 JSONL 格式本地存储 |
| 双接口支持 | CLI 交互模式 + JSON-RPC over stdin/stdout |
| MCP 客户端 | 支持连接 MCP(Model Context Protocol)服务器 |
| Python 技能加载器 | 支持带提示模板的技能系统 |
codingclaw-agent/
├── app/ # 主应用代码
│ ├── config.py # 配置管理
│ ├── types.py # 数据类型定义
│ ├── agent/ # 智能体核心
│ │ ├── runner.py # 主运行器(核心协调器)
│ │ ├── context.py # 上下文管理
│ │ └── compactor.py # 上下文压缩
│ ├── interfaces/ # 接口层
│ │ ├── cli/main.py # CLI 入口
│ │ └── rpc.py # JSON-RPC 接口
│ ├── mcp/ # MCP 客户端
│ │ └── client.py # MCP 服务器连接管理
│ ├── models/ # 模型层
│ │ ├── base.py # 基础模型接口
│ │ ├── openai_compatible.py # OpenAI 兼容实现
│ │ └── registry.py # 模型注册表
│ ├── skills/ # 技能系统
│ │ └── loader.py # 技能加载器
│ ├── storage/ # 存储层
│ │ ├── artifacts.py # 工件存储
│ │ ├── logs.py # 日志写入
│ │ └── sessions.py # 会话存储
│ └── tools/ # 工具系统
│ ├── builtins.py # 内置工具
│ └── permissions.py # 权限管理
├── .codingclaw/ # 本地数据目录
│ ├── config.json # 配置文件
│ ├── logs/ # 日志文件
│ └── sessions/ # 会话数据
├── example.config.json # 配置示例
└── pyproject.toml # Python 项目配置
文件: app/interfaces/cli/main.py
- 参数解析(argparse)
- 命令分发(models, tools, skills, sessions)
- 交互式会话循环
- RPC 模式启动
def main() -> None:
parser = build_parser()
args = parser.parse_args()
raise SystemExit(asyncio.run(_run(args)))文件: app/agent/runner.py
AgentRunner 类协调所有组件:
- 初始化子系统(模型、存储、工具、技能、MCP)
- 管理会话生命周期
- 处理用户提示的完整流程
- 协调工具调用和权限确认
文件: app/interfaces/rpc.py
提供 JSON-RPC 接口,支持方法:
start_session- 创建会话send_message- 发送消息list_sessions- 列出会话list_tools- 列出工具list_models- 列出模型list_skills- 列出技能
文件: app/config.py
def load_config(config_path=None, workspace=None) -> AgentConfig:
# 加载 ~/.codingclaw/config.json
# 支持环境变量覆盖
# 初始化目录结构class AgentRunner:
def __init__(self, config: AgentConfig, approval_callback):
self.registry = ModelRegistry() # 模型注册表
self.provider = self.registry.create(...) # AI 模型提供者
self.context_manager = ContextManager(...) # 上下文管理
self.compactor = Compactor() # 上下文压缩
self.session_store = SessionStore(...) # 会话存储
self.tool_runtime = ToolRuntime(...) # 工具运行时
self.skill_loader = SkillLoader(...) # 技能加载器
self.permission_policy = PermissionPolicy(...) # 权限策略核心方法: prompt(session_id, user_prompt, mcp_tools)
处理流程:
- 加载会话历史消息
- 添加系统提示和上下文
- 激活匹配的技能
- 添加用户消息
- 压缩上下文(如果超过阈值)
- 调用模型 API
- 处理工具调用(循环)
- 保存会话状态
| 工具名 | 功能 | 需要确认 |
|---|---|---|
list_files |
列出目录文件 | 否 |
read_file |
读取文件内容 | 否 |
grep_search |
搜索文本 | 否 |
write_file |
写入文件 | 是 |
edit_file |
编辑文件(替换文本) | 是 |
run_shell |
执行 shell 命令 | 是 |
export_markdown |
导出 Markdown | 是 |
连接外部 MCP 服务器获取额外工具:
class MCPClientManager:
async def connect_all(self) -> None:
# 启动 MCP 服务器子进程
async def list_tools(self) -> list[ToolSpec]:
# 获取 MCP 工具列表
async def call_tool(self, server, tool, args) -> dict:
# 调用 MCP 工具# 核心数据类型
@dataclass
class Message:
role: Role # system | user | assistant | tool
content: str
name: str | None # 工具名
tool_call_id: str | None
timestamp: float
@dataclass
class ToolSpec:
name: str
description: str
input_schema: dict
requires_confirmation: bool
handler: Callable
@dataclass
class SessionEvent:
type: EventType # message | tool_call | tool_result | ...
payload: dict
timestamp: float
id: str~/.codingclaw/config.json
{
"provider_name": "openai-compatible",
"model_id": "kimi-k2.5",
"base_url": "https://api.moonshot.cn/v1",
"api_key_env": "CODINGCLAW_API_KEY",
"supports_tools": true,
"supports_reasoning": false,
"compat_flags": {
"supports_developer_role": false,
"supports_reasoning_effort": false
},
"mcp_servers": [
{
"name": "filesystem",
"command": ["npx", "-y", "@modelcontextprotocol/server-filesystem", "/path/to/workspace"],
"enabled": true
}
]
}| 变量名 | 说明 |
|---|---|
CODINGCLAW_API_KEY |
API 密钥 |
CODINGCLAW_MODEL |
模型 ID(覆盖配置) |
CODINGCLAW_BASE_URL |
API 基础 URL(覆盖配置) |
CODINGCLAW_HOME |
数据目录(默认 ~/.codingclaw) |
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -e .# 启动交互式会话
codingclaw
# 单次提问
codingclaw --prompt "分析项目结构"
# 指定工作目录
codingclaw --workspace /path/to/project
# 查看支持的模型
codingclaw models
# 查看可用工具
codingclaw tools
# 查看技能列表
codingclaw skills
# 查看会话列表
codingclaw sessions
# 继续指定会话
codingclaw --session <session_id>
# JSON-RPC 模式
codingclaw --mode rpc在交互式会话中可用:
/exit或/quit- 退出会话
用户输入
│
▼
┌─────────────────┐
│ CLI / RPC 接口 │
└─────────────────┘
│
▼
┌─────────────────┐
│ AgentRunner │
│ - 加载会话 │
│ - 激活技能 │
│ - 压缩上下文 │
└─────────────────┘
│
▼
┌─────────────────┐
│ Model Provider │
│ (OpenAI API) │
└─────────────────┘
│
▼
┌─────────────────┐
│ 处理响应 │
│ - 直接回复 │
│ - 工具调用 │
└─────────────────┘
│
├──────────────┬──────────────┐
▼ ▼ ▼
内置工具 MCP 工具 保存结果
│ │ │
└──────────────┴──────────────┘
│
▼
返回给用户
| 组件 | 用途 |
|---|---|
| Python 3.9+ | 编程语言 |
| httpx | 异步 HTTP 客户端 |
| PyYAML | YAML 解析 |
| asyncio | 异步编程 |
| subprocess | MCP 服务器进程管理 |
| argparse | 命令行参数解析 |
| dataclasses | 数据模型定义 |
-
模块化架构 - 清晰的层次划分(接口、智能体、模型、工具、存储)
-
本地优先 - 所有数据本地存储(JSONL 格式),保护隐私
-
双模式支持 - CLI 交互模式和 JSON-RPC 模式,灵活集成
-
工具安全 - 敏感操作(写文件、执行命令)需要用户确认
-
上下文管理 - 自动压缩历史消息,控制 token 消耗
-
技能系统 - 基于触发词自动加载提示模板
-
MCP 扩展 - 通过 Model Context Protocol 连接外部工具生态
-
OpenAI 兼容 - 支持任何 OpenAI 兼容的 API 提供商
- 协调器模式(AgentRunner 协调多个子系统)
- 工具注册和发现机制
- 权限控制策略
- asyncio 用于并发操作
- 异步 HTTP 请求(httpx)
- 异步子进程管理(MCP)
- JSONL 格式用于追加写入
- 会话数据的读写模式
- 日志和事件的分离存储
- JSON-RPC 2.0 协议
- MCP(Model Context Protocol)
- OpenAI API 兼容层
- 路径逃逸检查(workspace 限制)
- 命令执行超时控制
- 敏感操作的用户确认
- 添加新工具 - 在
app/tools/builtins.py中定义 - 添加新模型 - 在
app/models/中实现 BaseProvider - 添加新技能 - 在 skills 目录创建 YAML 定义
- 集成 MCP 服务器 - 在配置中添加 mcp_servers
笔记创建时间: 2024 项目版本: 0.1.0