codegraph

package
v0.3.6 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 21, 2026 License: Apache-2.0 Imports: 6 Imported by: 0

Documentation

Overview

domains.go —— 领域层的投影:把视图按领域聚合成带统计的领域树。

职责:领域树结构(parent/children)、每个领域的成员统计与对外接口清单 边界:只读视图,不改数据、不打日志、不做网络;领域一律读自数据的 domains 段, **不按包名或容器名推导**——推导出来的层级会被人和 agent 当成真实架构。 与前端 web/src/app/codegraph/domains.ts 的「跨领域边 / 对外接口」判定规则 必须一致,两侧分叉就是 bug。

本文件实现数据契约文件的加载:baseline、单个 diff、视图列表。

职责:读文件 + json.Unmarshal + 带路径上下文的错误 边界:不校验引用完整性(validate.go 的事)、不合并(merge.go 的事)

本文件实现「基准 + 差异 → 视图」的合并(spec §3.2 的渲染时合并)。

职责:Merge 产出带 Status 标记的 View;删除的对象保留并标 deleted,

供消费方画红虚线——直接剔除会让"删了什么"不可见

边界:不做查询(query.go);diff 的合法性由 ValidateDiff 把关,

Merge 对非法引用宽容跳过(渲染路径不因脏数据崩)

本文件实现视图上的邻域查询:多源 BFS,下游为正距离、上游为负距离。

职责:Resolve(id/名字 → 节点 id)、Neighborhood(chain/who-calls/并集共用核心) 边界:不做布局(消费方的事);deleted 节点/边不参与遍历(它们只是渲染残影)

本文件实现保鲜检测:节点声称的 file:line 与真实源码对不上即 stale。

为什么这么设计(spec §7):过期的图比没有图更糟——agent 信了它就省了验证。 节点刻意不存源码正文,file:line 是唯一锚点,所以校验它就是校验图的新鲜度。

职责:CheckStale——按廉价规则逐节点比对 边界:不重扫、不修复,只报告;unscanned 节点跳过(没人声称它是新鲜的)

Package codegraph 实现代码图数据契约的模型与算法:加载、校验、合并、查询、保鲜。

职责:

  • 解析目标仓库 codegraph/baseline.json 与 codegraph/diffs/<view>.json
  • 基准 + 差异合并出视图;BFS 邻域查询(chain / who-calls / 并集 / 深度)
  • file:line 签名保鲜检测

边界:

  • 不依赖 handoff 任何内部包(agentd/store/client)——数据契约独立是 spec 2026-08-19-codegraph-design §2 的硬约束,本包必须能原样搬进任何工具
  • 不产出数据:扫描由 AI executor 完成(见 docs/codegraph-scan-recipe.md)
  • 不做网络:一切输入都是本地文件

本文件实现引用完整性校验:图与 diff 里的一切引用必须落在已定义的对象上。

职责:Validate(基线自查)、ValidateDiff(diff 相对基线自查) 边界:不查 file:line 真实性(stale.go 的事)、不修数据,只报告

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func ListViews

func ListViews(repoRoot string) ([]string, error)

ListViews 列出 diffs 目录下的视图名(文件名去 .json,字典序)。 目录不存在返回空列表——大多数仓库只有基线,这不是错误。

func Resolve

func Resolve(v *View, arg string) (string, error)

Resolve 把命令行参数解析成节点 id:先按 id 精确匹配,再按 name 精确匹配。 name 多义或未命中时报错并列出近似候选(contains,最多 5 个),方便 agent 自纠。

func Validate

func Validate(g *Graph) []string

Validate 检查基线的引用完整性,返回问题列表(空 = 干净)。 检查项:节点的 container 必须存在;每条边两端必须是已定义节点。

func ValidateDiff

func ValidateDiff(g *Graph, d *Diff) []string

ValidateDiff 检查 diff 相对基线的引用完整性。 检查项:nodesModified/nodesDeleted 引用的节点必须在基线里; edgesAdded/edgesDeleted 两端必须在「基线 ∪ nodesAdded」里; nodesAdded 的 container 必须存在。

Types

type Container

type Container struct {
	Label string `json:"label"`
	Kind  string `json:"kind"`
	Entry bool   `json:"entry,omitempty"`
	// Domain 是所属领域 id,必须是**叶子**领域。空串只在整图没有 domains 段时
	// 合法(旧扫描数据,消费方降级为单领域视图)。
	Domain string `json:"domain,omitempty"`
}

Container 是分组盒子(struct 一级,见 spec §3.1)。

type Diff

type Diff struct {
	View          string          `json:"view"`
	Base          string          `json:"base,omitempty"`
	Summary       string          `json:"summary,omitempty"`
	NodesAdded    map[string]Node `json:"nodesAdded,omitempty"`
	NodesModified map[string]Node `json:"nodesModified,omitempty"`
	NodesDeleted  []string        `json:"nodesDeleted,omitempty"`
	EdgesAdded    []Edge          `json:"edgesAdded,omitempty"`
	EdgesDeleted  []Edge          `json:"edgesDeleted,omitempty"`
}

Diff 是 codegraph/diffs/<view>.json:某分支/plan 相对基准的差异声明。

func LoadDiff

func LoadDiff(repoRoot, view string) (*Diff, error)

LoadDiff 读取 repoRoot/codegraph/diffs/<view>.json。view 是文件名(不含 .json)。

type Domain

type Domain struct {
	Label   string `json:"label"`
	Kind    string `json:"kind"`
	Summary string `json:"summary,omitempty"`
	Desc    string `json:"desc,omitempty"`
	Parent  string `json:"parent,omitempty"`
}

Domain 是一个领域:领域图的一级组织单位,可嵌套。

领域由扫描产出、人可在入库后修改(spec §3.1)。Parent 串成树,为空即顶层。 容器只能挂叶子领域——挂在中间层的容器既不属于本级全景、也进不了任何子领域, 会静默从图里消失,所以 Validate 把它当错误报出来而不是默默丢掉。

type DomainStat

type DomainStat struct {
	ID         string   `json:"id"`
	Label      string   `json:"label"`
	Kind       string   `json:"kind"`
	Summary    string   `json:"summary,omitempty"`
	Desc       string   `json:"desc,omitempty"`
	Parent     string   `json:"parent,omitempty"`
	Children   []string `json:"children"`
	Containers []string `json:"containers"`
	Funcs      int      `json:"funcs"`
	Models     int      `json:"models"`
	Entries    int      `json:"entries"`
	Unscanned  int      `json:"unscannedEntries"`
	Interfaces []string `json:"interfaces"`
}

DomainStat 是一个领域的展示投影:元信息 + 结构位置 + 成员统计。

统计只算**直属容器**里的节点:父领域的数字不含子领域,读数不会重复计入。 Interfaces 是本领域中被其他领域调用到的节点 id(即「对外开放接口」)。

func DomainTree

func DomainTree(v *View) []DomainStat

DomainTree 把视图投影成领域列表,按 id 升序;列表内各切片字段也按字典序排序, 保证同一份数据每次输出一致(CLI 输出要能直接 diff)。

视图没有领域段时返回 nil——调用方据此降级为单领域视图,不要自行编造领域。

type Edge

type Edge [2]string

Edge 是一条调用关系 [caller, callee]。

type Graph

type Graph struct {
	Meta Meta `json:"meta"`
	// Domains 是领域段,可为空——空即「该图未划分领域」,消费方降级为单领域视图。
	// **不得按包名伪造领域**:伪造出来的层级会被人和 agent 当成真实架构读。
	Domains    map[string]Domain    `json:"domains,omitempty"`
	Containers map[string]Container `json:"containers"`
	Nodes      map[string]Node      `json:"nodes"`
	Edges      []Edge               `json:"edges"`
}

Graph 是 codegraph/baseline.json 的顶层结构。 顶层 "diffs" 字段是早期原型的兼容残留,一期忽略:视图一律来自 diffs/目录。

func LoadGraph

func LoadGraph(repoRoot string) (*Graph, error)

LoadGraph 读取 repoRoot/codegraph/baseline.json。 文件不存在或 JSON 非法时返回带路径的错误——调用方(CLI/agentd)原文透出。

type Meta

type Meta struct {
	Project   string `json:"project"`
	Branch    string `json:"branch"`
	Commit    string `json:"commit"`
	ScannedAt string `json:"scannedAt"`
	Generator string `json:"generator"`
}

Meta 是图的来源信息。

type Node

type Node struct {
	Kind         string     `json:"kind"`
	Container    string     `json:"container"`
	Order        int        `json:"order,omitempty"`
	Name         string     `json:"name"`
	File         string     `json:"file"`
	Line         int        `json:"line"`
	Signature    string     `json:"signature,omitempty"`
	SignatureOld string     `json:"signatureOld,omitempty"` // 仅出现在 diff 的 nodesModified 里
	Params       [][]string `json:"params,omitempty"`       // [名, 类型, 说明]
	Returns      string     `json:"returns,omitempty"`
	Summary      string     `json:"summary,omitempty"`
	Tests        []TestRef  `json:"tests,omitempty"`
	Fields       [][]string `json:"fields,omitempty"` // model 专用: [名, 类型, 说明]
	Unscanned    bool       `json:"unscanned,omitempty"`
}

Node 是图节点,Kind 三选一:entry / func / model。 不存源码——消费方按 File:Line 实时读取,这同时是保鲜检测的抓手。

type Result

type Result struct {
	View             string       `json:"view"`
	Foci             []string     `json:"foci"`
	Nodes            []ResultNode `json:"nodes"`
	Edges            []ViewEdge   `json:"edges"`
	UnscannedEntries int          `json:"unscannedEntries"`
	Warning          string       `json:"warning,omitempty"`
}

Result 是一次邻域查询的完整结果。 UnscannedEntries/Warning 让消费方能区分「查询无结果」与「根本没扫」—— 这是 spec §6 的硬要求,agent 拿掉这个信息会写出漏影响面的 plan。

func Neighborhood

func Neighborhood(v *View, foci []string, down, up int) (*Result, error)

Neighborhood 从焦点集合做多源 BFS。down/up 是两个方向各自的最大深度: 0 = 该方向不查,-1 = 不限。deleted 节点与边不参与遍历。

type ResultNode

type ResultNode struct {
	ID   string `json:"id"`
	Dist int    `json:"dist"`
	ViewNode
}

ResultNode 是查询结果里的节点:id + 与焦点的 BFS 距离(下游正、上游负)。

type StaleNode

type StaleNode struct {
	ID     string `json:"id"`
	File   string `json:"file"`
	Line   int    `json:"line"`
	Reason string `json:"reason"`
}

StaleNode 描述一个失鲜节点及原因。

func CheckStale

func CheckStale(repoRoot string, g *Graph) []StaleNode

CheckStale 逐节点做三级廉价校验:文件存在 → 行号在界内 → 行窗口(line-1..line+1)里能找到名字 token。entry 只做前两级 (注册行长相多样,token 检查会假红);func/model 检查 token: func 取 Name 最后一个 '.' 之后的段("Client.Dispatch" → "Dispatch"), model 取整名。文件按缓存读,同文件多节点只读一次。

type TestRef

type TestRef struct {
	Name    string `json:"name"`
	File    string `json:"file"`
	Snippet string `json:"snippet,omitempty"`
}

TestRef 关联一个测试函数。File 形如 "pkg/x_test.go:41"。

type View

type View struct {
	Name string `json:"view"`
	// Domains 原样来自基线:diff 只改节点与边,不改领域划分。
	Domains    map[string]Domain    `json:"domains,omitempty"`
	Containers map[string]Container `json:"containers"`
	Nodes      map[string]ViewNode  `json:"nodes"`
	Edges      []ViewEdge           `json:"edges"`
}

View 是合并后的图视图。

func Merge

func Merge(g *Graph, d *Diff) *View

Merge 把基线与一个 diff 合并成视图。d 为 nil 时返回纯基准视图(Name="baseline")。

type ViewEdge

type ViewEdge struct {
	From   string `json:"from"`
	To     string `json:"to"`
	Status string `json:"status,omitempty"`
}

ViewEdge 是视图里的边。

type ViewNode

type ViewNode struct {
	Node
	Status string `json:"status,omitempty"` // "" | added | modified | deleted
}

ViewNode 是视图里的节点:Node + 差异状态。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL