claw-code 源码详细分析:子系统目录地图——几十个顶层包如何用五条轴(会话 / 工具 / 扩展 / 入口 / 桥接)读懂?

范围src/顶层包 (含 */__init__.py 的目录)与 与会话/runtime 强相关的根模块 ;与 result/01_start.md 第十三节、「清单---路由---会话」叙事一致。


1. 为什么用五条轴

src/ 里同时存在:

  • 大量占位包 (读 reference_data/subsystems/*.json 暴露 MODULE_COUNT / SAMPLE_FILES);
  • 已实现的 CLI / runtime 切片main.pyruntime.pyquery_engine.py 等);
  • 横切类型与快照schemastypesreference_data)。

若按字母表扫目录,容易 迷失在名字里。五条轴对应 Harness 里五条常驻问题:

核心问题 典型关键词
会话 状态放哪、如何累计、如何落盘与回放? turn、session、transcript、context、budget、denial
工具 命令/工具清单、路由、shim 执行边界? PORTED_*、route、registry、pool、permission 过滤
扩展 第三方与生命周期往哪挂? plugin、hook、skill
入口 用户/脚本从哪进、启动与交互形态? CLI、entry、bootstrap、setup、UI 形态
桥接 与外部世界(宿主、网络、代理、双栈)怎么接? bridge、remote、proxy、server、coordinator

读法 :先判断「我关心哪条轴」,只打开该轴下的包与根文件;需要 parity 对照 时再点进 reference_data/subsystems/<同名>.json


2. 轴一:会话(Session / Turn)

关心对象 :一轮对话的 状态机、转写、持久化、用量、权限在 turn 上的投影

位置 角色(读懂时心里的一句话)
state/ 占位包:归档里与会话/状态机相关的子树入口(元数据见 subsystems/state.json)。
query_engine.py QueryEnginePortsubmit_message、预算/轮次闸门、与 TranscriptStore 同步。
session_store.py 磁盘 JSON 会话:StoredSessionsave_session / load_session
transcript.py 进程内转写条目标记与截断窗口。
context.py 工作区上下文:PortContext、归档是否在盘、文件计数。
history.py bootstrap_session 里逐步追加的 HistoryLog(Markdown 友好)。
runtime.py PortRuntime:路由 → registry → QueryEnginePortpersist_session编排核
permissions.py 工具池过滤用的 ToolPermissionContext(与会话里的 PermissionDenial 配合,见 result/05.md)。
cost_tracker.py / costHook.py 成本计量与钩子占位,偏企业会话对账。
tasks.py / task.py 任务/规划结构,与会话多步推理相邻。

不迷路口诀 :凡是 TurnResultmutable_messages.port_sessions,都从这一轴进。


轴二:工具(Commands / Tools / Executable Surface)

关心对象镜像清单如何把 prompt 映射到名字shim 执行(尚非真 I/O)。

位置 角色
commands.py commands_snapshot.jsonPORTED_COMMANDSexecute_commandget_command
tools.py tools_snapshot.jsonPORTED_TOOLSexecute_toolget_tools(含 MCP/simple/权限过滤)。
execution_registry.py MirroredCommand / MirroredTool:按名转调 execute_*
tool_pool.py 策略下的工具子集报告(assemble_tool_pool)。
command_graph.py 命令按 source_hint 分 builtin / plugin-like / skill-like。
parity_audit.py 清单条目数与 archive_surface_snapshot 分母对比(见 result/10.md)。
services/ 占位包:归档中与「服务层/平台能力」相关子树,常与 工具背后真实能力 对接。
utils/ 占位包:体量大(MODULE_COUNT 常上百),多为 各子系统与工具共用的杂项能力 在归档中的投影;读时当作 基建库,不要期望单文件读完。

不迷路口诀 :凡是 PORTED_*route_promptexec-command / exec-tool,都从这一轴进。


轴三:扩展(Plugins / Hooks / Skills)

关心对象可插拔:谁在生命周期里挂钩、插件包长什么样、技能如何发现。

位置 角色
plugins/ 插件模型与捆绑插件在归档中的入口。
hooks/ 生命周期钩子流水线占位。
skills/ 可发现技能面占位。
components/ 常作为 UI/组件扩展 与宿主渲染相关(与「扩展面」相邻,也可能与入口轴交叉)。

不迷路口诀 :凡是 /pluginhookskill 命令行或协议设计 ,优先在这一轴找 目录名与 subsystems/*.json 规模


轴四:入口(Bootstrap / CLI / UX Surface)

关心对象从哪启动预取与信任多种交互形态

位置 角色
cli/ 命令行入口面占位(与根 main.py 形成「已实现 vs 归档镜像」对照)。
entrypoints/ 多入口形态(脚本、IDE、服务)的统一出口叙事。
bootstrap/ 启动/引导子系统占位;与 bootstrap_graph.pyrun_setup() 叙事一致。
main.py 当前 Python CLI 真入口argparse 子命令全集。
setup.py / system_init.py / prefetch.py / deferred_init.py 启动报告、预取、延迟初始化(bootstrap_session 会调用 run_setup)。
direct_modes.py / remote_runtime.py / replLauncher.py / dialogLaunchers.py 直连、远程、REPL、对话框等 模式化入口(多与桥接轴配合)。
screens/ 终端/界面屏相关占位。
vim/ 编辑器(Vim)适配占位。
keybindings/ 快捷键占位。
outputStyles/ 输出风格占位。
voice/ 语音交互占位。

不迷路口诀 :凡是 python3 -m src.mainSetupReport、slash 形态,从这一轴进。


轴五:桥接(Bridge / Remote / Host / Server)

关心对象宿主与代理隔离网络/代理路径常驻服务多通道协调TS/Python 过渡

位置 角色
bridge/ 宿主环境 ↔ runtime 的桥(IPC/协议/编辑器),与 result/01_start.md 中「bridge」叙述一致。
remote/ 远程控制相关子树;配合 mainremote-mode / ssh-mode / teleport-mode 等模拟。
upstreamproxy/ 上游代理相关占位。
coordinator/ 多任务/多通道协调占位。
server/ HTTP/SSE 等常驻服务端骨架;与 Rust server crate 可对照。
native_ts/ 与原生 TypeScript 资产或互操作相关的过渡占位。
migrations/ 迁移脚本/版本过渡占位。
buddy/ / memdir/ / moreright/ 产品语义 功能岛 :保留目录名利于 parity 与子系统 JSON 一一对照 ,读时先查 subsystems/<name>.jsonsample_files 再决定深入优先级。

不迷路口诀 :凡是 「数据从哪来、包发往哪、是否过代理」,从这一轴进。


3. 横向地基(不属于单轴尽头)

这些目录 支撑所有轴,读子系统前先建立「类型与数据从哪来」的认知:

位置 角色
schemas/ 数据结构/schema 占位。
types/ 类型定义占位。
constants/ 常量占位。
reference_data/ 对照底稿commands_snapshottools_snapshotarchive_surfacesubsystems/*.json(见 result/11.md)。

4. 实操:如何用五条轴「落地到文件」

  1. python3 -m src.main subsystems --limit 64 :看 port_manifest 给出的顶层模块 文件数,判断当前哪块「长高」了。
  2. 选定一轴 (例如先 工具轴 ):只读 commands.pytools.pyruntime.route_promptexecution_registry.py
  3. 打开对应 reference_data/subsystems/<pkg>.json :看 module_countsample_files,评估占位包 在归档里的真实体量
  4. 再读该包 __init__.py :几乎都是同一模板(ARCHIVE_NAMEMODULE_COUNTSAMPLE_FILESPORTING_NOTE),确认 尚未展开实现
  5. parity_audit.ARCHIVE_DIR_MAPPINGS 对表 :顶层包名是否在 parity 期望列表里(见 result/10.md)。

5. 轴与轴的交界(故意重叠处)

  • runtime.py :横跨 工具轴 (路由、registry)与 会话轴QueryEnginePort、持久化)。
  • permissions.py:工具清单过滤(工具轴)+ 会话摘要里的拒绝累计(会话轴)。
  • bootstrap_session:入口(setup)+ 工具(matches)+ 会话(engine)+ 桥接叙事(history 里可记路径)。

读代码时 允许一个文件挂两条轴 ,地图的作用是 决定从哪条叙事进门


6. 小结

  • 几十个顶层包 多数是 parity 占位 + JSON 元数据真逻辑 目前集中在 根模块mainruntimequery_engine、commands/tools 等)。
  • 会话 / 工具 / 扩展 / 入口 / 桥接 五条轴 过滤阅读范围 ,再配合 reference_data/subsystemssubsystems CLI ,可以把「目录海啸」变成 可计划的深入顺序
  • schemas / types / constants / reference_data横向地基,不强行塞进单轴,避免扭曲理解。

相关推荐
cxr8282 小时前
GPU 加速声场求解器 - 深度扩展
人工智能·python
zaim12 小时前
计算机的错误计算(二百二十六)
java·python·c#·c·错数·mpmath
EmmaXLZHONG2 小时前
Django By Example - 学习笔记
笔记·python·学习·django
ZC跨境爬虫2 小时前
Playwright进阶操作:鼠标拖拽与各类点击实战(含自定义拖拽实例)
前端·爬虫·python·ui
IMPYLH2 小时前
Linux 的 ln 命令
linux·运维·服务器·bash
kvo7f2JTy2 小时前
全面解析 Mineru:高效文件解析工具的核心参数详解
python
心静财富之门2 小时前
《前端零基础入门:HTML + CSS + JavaScript 全套速查表(详细版 + 实例)》
前端·javascript·python
.小小陈.2 小时前
深度拆解 Linux 程序编译与链接:从静态库到 ELF 运行时全流程
linux·运维·服务器
哥布林学者2 小时前
深度学习进阶(四)Transformer 整体结构
机器学习·ai