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

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


1. 为什么用五条轴

src/ 里同时存在:

  • 大量占位包 (读 reference_data/subsystems/*.json 暴露 MODULE_COUNT / SAMPLE_FILES);
  • 已实现的 CLI / runtime 切片 (main.py、runtime.py、query_engine.py 等);
  • 横切类型与快照 (schemas、types、reference_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 QueryEnginePort:submit_message、预算/轮次闸门、与 TranscriptStore 同步。
session_store.py 磁盘 JSON 会话:StoredSession、save_session / load_session。
transcript.py 进程内转写条目标记与截断窗口。
context.py 工作区上下文:PortContext、归档是否在盘、文件计数。
history.py bootstrap_session 里逐步追加的 HistoryLog(Markdown 友好)。
runtime.py PortRuntime:路由 → registry → QueryEnginePort → persist_session 的 编排核。
permissions.py 工具池过滤用的 ToolPermissionContext(与会话里的 PermissionDenial 配合,见 result/05.md)。
cost_tracker.py / costHook.py 成本计量与钩子占位,偏企业会话对账。
tasks.py / task.py 任务/规划结构,与会话多步推理相邻。

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


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

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

位置 角色
commands.py commands_snapshot.json → PORTED_COMMANDS、execute_command、get_command。
tools.py tools_snapshot.json → PORTED_TOOLS、execute_tool、get_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_prompt、exec-command / exec-tool,都从这一轴进。


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

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

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

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


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

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

位置 角色
cli/ 命令行入口面占位(与根 main.py 形成「已实现 vs 归档镜像」对照)。
entrypoints/ 多入口形态(脚本、IDE、服务)的统一出口叙事。
bootstrap/ 启动/引导子系统占位;与 bootstrap_graph.py、 run_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.main、SetupReport、slash 形态,从这一轴进。


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

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

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

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


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

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

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

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

  1. python3 -m src.main subsystems --limit 64 :看 port_manifest 给出的顶层模块 文件数,判断当前哪块「长高」了。
  2. 选定一轴 (例如先 工具轴 ):只读 commands.py、tools.py、runtime.route_prompt、execution_registry.py。
  3. 打开对应 reference_data/subsystems/<pkg>.json :看 module_count 与 sample_files,评估占位包 在归档里的真实体量。
  4. 再读该包 __init__.py :几乎都是同一模板(ARCHIVE_NAME、MODULE_COUNT、SAMPLE_FILES、PORTING_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 元数据 ;真逻辑 目前集中在 根模块 (main、runtime、query_engine、commands/tools 等)。
  • 用 会话 / 工具 / 扩展 / 入口 / 桥接 五条轴 过滤阅读范围 ,再配合 reference_data/subsystems 与 subsystems CLI ,可以把「目录海啸」变成 可计划的深入顺序。
  • schemas / types / constants / reference_data 作 横向地基,不强行塞进单轴,避免扭曲理解。

相关推荐
夏天拐跑了西瓜1 小时前
一文入门LangChain:从框架认知到构建你的第一个AI Agent
python·langchain·conda·agent
源流之道2 小时前
联想Y700 五代(TB323FU)刷 ColorOS 16 教程指南
网络·ai·刷机指南·刷机心得
魔猴疯猿2 小时前
从0到1用Python开发第一个智能体
人工智能·python·深度学习·神经网络·机器学习
xiaoqi01953 小时前
机器学习因子分析实战:从量化特征到可视化决策
人工智能·python·机器学习
Escalating_xu3 小时前
【Python】基础语法(1):常量、变量、类型、输入输出与运算符
开发语言·python
happylifetree4 小时前
Python14:核心语法-数据存储与运算-字符串定义
python
hhb_6184 小时前
AIRAGDebug:一键定位RAG链路异常
人工智能·python·算法
无忧智库4 小时前
AI分镜提示词怎么选
人工智能·ai
小静AI工程实验室4 小时前
asyncio.Queue 有界队列实战:背压、task_done、join 与异常收尾
python
小凡geo4 小时前
本地商家 GEO:用脚本一键生成 FAQPage 结构化数据,让 AI 切片更稳
开发语言·人工智能·python·microsoft·搜索引擎·ai