一个用于学习和演进的 Python Coding Agent 项目。
核心目标不是“功能最全”,而是把现代 Agent 的关键控制面拆成可读、可改、可验证的模块。
当前版本已经覆盖:
- 主循环(对话 -> tool_use -> tool_result 回流)
- 权限闸门与 Hook
- 上下文压缩与大输出落盘
- Skill / Memory / Task / Cron
- 多 Agent 团队协作(派单 + 任务板认领)
- Worktree 隔离执行车道
- Merge Queue(Lead 统一评审/集成)
- MCP 外部工具接入(stdio,统一工具池)
- Python 3.12+
- 推荐
uv
uv synccp .env.example .envmodels/anthropic_client.py 读取:
DMX_API_KEYDMX_BASE_URL
mkdir -p .claude
touch .claude/.claude_trustedpython main.py每轮循环做的事:
micro_compact微压缩- 注入队友事件(
teammate_manager.poll_events) - 注入 cron 通知
- 调模型(带工具定义)
- 若有
tool_use:权限检查 -> hooks -> handler 执行 -> 回写tool_result - 必要时 full compact(自动或手动)
无论工具来自哪里(本地 / MCP)都走同一条路径:
- 同一个
TOOLS工具池 - 同一个
TOOL_HANDLERS路由 - 同一个权限系统(
PermissionManager) - 同一个 Hook 管道(
PreToolUse/PostToolUse) - 同一个
tool_result回流
这点是工程上最关键的稳定性来源。
learn-claude-code/
├── main.py
├── configs/
├── models/
├── modules/
│ ├── permission.py
│ ├── hook.py
│ ├── prompt.py
│ ├── retry.py
│ ├── skill.py
│ ├── memory.py
│ ├── task.py
│ ├── taskBoard.py
│ ├── teammate.py
│ ├── worktree.py
│ ├── mergeQueue.py
│ └── mcp/
│ ├── __init__.py
│ ├── client.py
│ └── registry.py
├── tools/
│ ├── __init__.py
│ ├── common.py
│ ├── compact.py
│ └── subagent.py
├── mcp_servers/
│ └── echo_server.py
├── .mcp.json
├── .hooks.json
├── .memory/
├── .tasks/
├── .team/
├── .worktrees/
└── README.md
工具注册在 tools/__init__.py,分三层:
- 子代理与主代理共享工具:
bash、read_file、write_file、edit_file、todo等 - 主代理专用工具:任务管理、团队管理、任务板、worktree、merge queue 等
- MCP 动态工具:启动时读取
.mcp.json,自动注入命名为
mcp__<server_alias>__<tool_name>
- Lead Agent:派单、收集结果、评审并集成改动
- Worker Agent:执行任务,必要时使用 worktree 车道隔离改动
- 直投:
assign_task(指定某个 teammate) - 任务板:
board_post_task(任意符合角色的 worker 自主认领)
worker 完成后写 .team/results/*.md,lead 在下一轮 poll_events 收到事件,再按需 read_file 查看完整正文。
每条板任务可绑定独立车道(wt/<name> + .worktrees/<name>),降低并行污染风险。
关键动作:
create/bind/enter/closeout- dirty 检查:
remove前若有未提交改动会降级为keep - 生命周期记录在
.worktrees/index.json和.worktrees/events.jsonl
worker 在车道里提交后,向 merge queue 登记“待评审 patch”;lead 决策:
merge:合并进主分支(串行锁保护),成功后可完结任务reject:标记拒绝,分支保留供复盘
可用工具:
merge_queue_listmerge_reviewmerge_integrate
最小示例:
{
"mcpServers": {
"demo": {
"command": "python",
"args": ["-u", "mcp_servers/echo_server.py"]
}
}
}tools/__init__.py 在 import 末尾调用 mcp_registry.bootstrap():
- 读取
.mcp.json subprocess.Popen拉起每个 MCP serverinitialize+tools/list- 把远端工具注入主工具池
- 交互内输入
/mcp查看 server 状态 - 工具
mcp_status也可输出同样信息
当前实现聚焦 tools-first:
- 仅 stdio transport
- 覆盖
initialize/tools/list/tools/call - 未展开 resources/prompts/auth/elicitation(可后续扩展)
决策顺序:
bash 安全校验 -> deny 规则 -> mode 检查 -> allow 规则 -> ask_user
模式:
defaultplan(禁写)auto(只读自动放行)
支持:
SessionStartPreToolUsePostToolUse
配置在 .hooks.json。
返回码可用于阻断工具执行或注入提示。
- Micro compact:压缩旧
tool_result文本体积 - Full compact:上下文超限或手动触发
compact - 大输出可落盘到
.task_outputs/tool-results/
在 python main.py 交互中可用:
/help/prompt/sections/skills/team/inbox/cron/test/mcpq/exit
spawn_teammate(name="alice", role="backend")
spawn_teammate(name="bob", role="frontend")
board_post_task(subject="refactor cron retry", claim_role="backend")
board_post_task(subject="landing hero section", claim_role="frontend")
merge_queue_list
merge_review(task_id=7)
merge_integrate(task_id=7, strategy="merge")
/mcp
MIT