Community研究与数据分析github.com

Codespaces — 信念图架构发现

构建代码库的可查询信念图(模块、边界、依赖、实体),使 AI 编码代理能够精确划定变更范围:支持架构发现、影响半径分析、边界与层违例检查,以及 Python 和 TypeScript 中的调用/数据流追踪。

Codespaces — 信念图架构发现 是什么?

Codespaces 技能为 AI 编码代理提供了一套架构发现工作流。它利用 tree-sitter 从 Python 和 TypeScript 代码库中构建一个可查询的信念图,以 S-表达式格式(.belief_map.sexp)存储模块边界、依赖关系、实体定义和架构层信息。核心工作流强制“先查询后读码”:代理必须首先使用 `belief_search.py` 脚本(支持 `search`、`analyze`、`boundary` 等命令)查询图,以确定变更的影响范围,之后才能直接阅读源文件。该技能还提供基础设施拓扑抽取(Kustomize/Helm/Terraform)、Git 提交分析,以及用于复杂分析的可组合 Scheme 查询语言。它适用于 Cursor、Claude Code 等 AI 代理平台,可有效避免盲目阅读代码、猜测模块 ID 等常见反模式。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add diskd-ai/codespaces

Installed? Explore more 研究与数据分析 skills: affaan-m/uspto-database, affaan-m/scholar-evaluation, affaan-m/literature-review · View all 6 →

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

Codespaces — 信念图架构发现 是做什么的?

在阅读源文件之前,先查询 .belief_map.sexp 来发现模块、边界和依赖关系。切勿盲目阅读代码——优先查询图。

脚本

本技能包含 Python 脚本。请从技能的基础目录下运行它们:

  • scripts/belief_search.py —— 查询信念图
  • scripts/build_belief_map.py —— 从源码生成信念图
  • scripts/build_infra_topology.py —— 提取 Kustomize、Helm 和 Terraform 拓扑事实
  • scripts/git_descendants.py —— 查找从 HEAD(或给定引用)出发的所有后代提交

切勿使用项目本地的脚本副本——它们可能已过时,且输出 JSON 而非 S-表达式。

前提

找到信念图。如果不存在,则构建它:

ls .belief_map.sexp belief_map.sexp 2>/dev/null
# 构建:pip3 install tree-sitter tree-sitter-typescript tree-sitter-python
python3 scripts/build_belief_map.py          # 增量构建 ~5s
python3 scripts/build_belief_map.py --full   # 全量重建 ~30s

强制性工作流:先查询后读码

对于非平凡的代码工作,在执行 rg、find、sed、cat、nl、打开目录或阅读源文件之前,请先运行一次信念图查询。该技能只有在作为第一步定界步骤时才有帮助,而不是在源代码已被检查之后用作确认。

当任务包含明确关键字时的快速首次通过:

python3 scripts/belief_search.py quick "keyword"

quick 用于搜索第一个匹配的模块并立即运行 analyze。用它一步获取边界文件、依赖关系、反向依赖关系、架构层和违例信息。如果 quick 返回了错误的模块或没有匹配项,请使用下面明确的 search -> analyze 流程。

第 1 步 —— 查找模块 ID:

python3 scripts/belief_search.py search "keyword"
python3 scripts/belief_search.py entity EntityName

使用 search 或 entity 来定位模块 ID。模块 ID 是完整的相对路径,如 pki-service/src/modules/ca/ca.service,而不是像 ps34 那样的短代码。信念图内部可能包含短路径映射 ID,但它们会被自动解析——始终传递人类可读的路径风格字符串。切勿猜测或编造模块 ID——始终先用 search 确认。

第 2 步 —— 分析模块(立即执行此操作,非可选):

python3 scripts/belief_search.py analyze <module-id>

analyze 是主要命令。它返回完整的上下文:边界文件、依赖关系、反向依赖关系、架构层和违例信息。在阅读任何源码之前始终运行它。

第 3 步 —— 仅读取 analyze 输出中列出的边界文件。

第 4 步 —— 不要读取整个目录。 如果边界显示 2-3 个相关文件,只读取这些文件。忽略目录中的其他所有内容。

命令参考

命令用途示例
search "<pattern>"在图上进行正则表达式搜索(查找模块 ID)search "operative.*service"
analyze <id>完整模块分析(主要命令)analyze drive/modules/drive/drive_schema
quick <keyword>搜索并分析第一个匹配项(快捷方式)quick operatives
boundary <id>变更需要读取的文件boundary operatives.service
boundary <id> --files-only仅文件路径(简洁模式)boundary operatives.service --files-only
entity <Name>查找定义+引用entity DrivePath
deps <id> [depth]输出依赖树deps operatives.service 3
rdeps <id> [depth]影响半径(谁依赖于此)rdeps drive_schema 2
flow <id> <fn>跟踪调用/数据流flow drive_api fetchFiles
module <id>含边的单个模块module operatives.controller
`boundaries [idall]`检查架构违例
`invariants [idall]`检查命名约定违例
layers按层显示所有模块layers
find_function <name>查找函数/方法定义find_function createOrder
find_type <name>查找类型/类/接口/枚举定义find_type DriveDbCommitResponse
find_callchain <src> <tgt> [depth]查找函数间的调用路径find_callchain createOrder processPayment
find_callers <fn> [depth]谁调用了此函数find_callers handleRequest 3
find_calls <fn> [depth]此函数调用了什么find_calls createOrder 2
grep_functions <pattern>在源码中搜索函数体grep_functions "validate.*input"
diff_functions [ref]Git diff 中发生变更的函数diff_functions HEAD~3
query '<sexp>'可组合的 Scheme 查询query '(count (boundary "X"))'
repl交互式 Scheme REPLrepl

快速参考:rg 查询

当需要快速、有针对性的查找而不调用 Python 脚本时,可以直接使用 rg 查询信念图。配套的构建器写入 .belief_map.sexp;如果仓库仍在使用旧版 belief_map.sexp,请在下列命令中替换该文件名:

# 关于一个模块的所有事实
rg 'drive/modules/drive_db/api ' .belief_map.sexp

# 谁导入了一个模块
rg 'imports .* drive/modules/commons/result' .belief_map.sexp

# 一个模块导入了什么
rg 'imports drive/modules/drive_db/api' .belief_map.sexp

# 对一个实体的所有引用
rg 'DriveDbCommitResponse' .belief_map.sexp

# 仓库中所有的类
rg '^\(cls drive/' .belief_map.sexp

# 数据流边
rg 'data-flow' .belief_map.sexp

这些单行命令对于快速检查很有用。如需结构化输出和完整分析,请使用 Python 脚本的命令。

输出符号

所有输出都是 S-表达式事实,每行一个。完整格式请参见 references/sexp-notation.md。

关键模式:

(boundary <mod> :lang py :file <path> :purpose "<desc>")
(boundary-dep <mod> <dep> :lang ts :file <path> :relation imports)
(boundary-rdep <mod> <rdep> :lang tsx :file <path> :relation imports)
(boundary-summary <mod> :total 10 :deps 7 :rdeps 2)
(entity-def cls <mod> <Name> <line> :lang py :file <path>)
(violation <src> <tgt> :src-layer domain :tgt-layer api :via imports :lang ts "<reason>")
(result <module-or-path>)
(result-count 42)

:lang 值:py = Python(snake_case),ts = TypeScript(camelCase),tsx = TSX(PascalCase)。

Scheme 查询语言

组合查询以实现复杂分析。完整参考请参见 references/scheme-queries.md。

基本操作:

(boundary "id")                ; 目标 + 依赖 + 反向依赖(变更边界)
(entity "Name")                ; 定义实体的模块
(deps "id" depth)              ; 输出依赖
(rdeps "id" depth)             ; 反向依赖
(find-function "name")         ; 包含匹配函数定义的模块
(find-type "name")             ; 包含匹配类型定义的模块
(find-callers "fn" depth)      ; 调用某函数的模块
(find-calls "fn" depth)        ; 某函数调用的模块
(intersect A B)                ; 集合交集
(filter SET "pattern")         ; 正则表达式过滤
(files SET)                    ; 解析为文件路径
(count SET)                    ; 统计成员数
(violations)                   ; 有边界违例的模块
(layer "id")                   ; 一个模块的架构层

分析计划模式

在修改代码之前,通过查询制定计划:

; 1. 范围
(boundary "operatives.service")
(count (boundary "operatives.service"))

; 2. 架构约束
(violations "operatives.service")
(layer "operatives.service")

; 3. 跨语言边界
(filter (refs-to "DrivePath") "app-service")

; 4. 缩小到可操作的文件
(filter (boundary "operatives.service") "dto")
(intersect (deps "controller" 2) (deps "service" 2))

; 5. 变更后验证
(violations "operatives.service")

触发示例

在阅读源码之前,对以下情况使用本技能:

  • 根因调查,涉及服务、API、任务、事件、UI 流程或失败行为。
  • 跨服务或跨模块问题,包括“X 如何调用 Y?”和“此数据存储在哪里?”
  • 当答案取决于代码行为时需要澄清的问题。
  • 架构评审、影响分析、公开契约变更或影响半径检查。
  • 对非平凡的暂存变更进行审核,当依赖方向或模块所有权很重要时。

不要强制将其用于仅提交的任务、git 日志摘要、手动演示/服务器运行、纯浏览器测试或会话日志分析。

错误恢复

如果命令返回 (error no-match ...):

  1. 不要使用相同的 ID 重试或猜测另一个 ID
  2. 使用更宽的关键字运行 search 以找到正确的模块 ID
  3. 如果存在 :suggestions 字段 —— 它会列出相似的模块 ID
# 错误:猜测 ID
python3 scripts/belief_search.py analyze ps34        # 失败:ps34 是短路径映射 ID
python3 scripts/belief_search.py analyze ca.service  # 失败:路径不完整

# 正确:先搜索,然后使用结果中的完整路径
python3 scripts/belief_search.py search "ca.*service"
# 输出显示:pki-service/src/modules/ca/ca.service
python3 scripts/belief_search.py analyze pki-service/src/modules/ca/ca.service

反模式

  • 猜测模块 ID。 模块 ID 是完整的相对路径(例如 pki-service/src/modules/ca/ca.service)。像 ps34 这样的短代码是内部路径映射 ID,不能直接使用。务必先 search。
  • 只构建但不查询。 构建了信念图但从不运行 search、analyze 或 boundary,这毫无价值。
  • 先读源码再查询。 首次源码读取应该是来自 analyze 输出的 boundary-file 行。
  • 将 .belief_map.sexp 作为一个完整的文件来阅读。 使用 search、analyze 或 rg 来查询特定事实。
  • 对跨模块任务跳过信念图。 在阅读源文件之前,始终查询图以了解边界。
  • 读取目录中的所有文件。 当边界显示 2-3 个文件时,只读取这些文件。
  • 使用项目本地脚本。 始终使用本技能打包的脚本。项目副本可能输出 JSON 而非 S-表达式。

重建图

python3 scripts/build_belief_map.py          # 增量构建(~5s)
python3 scripts/build_belief_map.py --full   # 全量重建(~30s)
python3 scripts/build_belief_map.py ./drive  # 单个子仓库
python3 scripts/build_belief_map.py --lsp    # 带 LSP 调用层次结构(~1-5分钟)

在结构性变更(添加/删除文件、更改导入、添加类)后重建。

基础设施拓扑

从 Kustomize、Helm 和 Terraform 文件中提取服务拓扑。此脚本需要 PyYAML(pip3 install pyyaml)。

python3 scripts/build_infra_topology.py                    # 自动检测所有 IaC
python3 scripts/build_infra_topology.py --kustomize .      # 仅 kustomize
python3 scripts/build_infra_topology.py --helm ./charts    # 仅 helm 图表
python3 scripts/build_infra_topology.py --terraform ./infra # 仅 terraform
python3 scripts/build_infra_topology.py --append .belief_map.sexp  # 合并到图中

输出 infra-node、k8s-depends、k8s-service、helm-depends、tf-depends 和 infra-maps 边。使用以下命令查询:

rg 'infra-node' .belief_map.sexp                  # 所有服务
rg 'k8s-depends' .belief_map.sexp                 # 服务依赖
rg 'infra-node.*:component database' .belief_map.sexp  # 所有数据库
rg 'infra-maps.*app-service' .belief_map.sexp     # 基础设施 -> 源代码映射

相关技能