🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

代码知识图谱 hoyyang/dsh-code-graph

DeepSeek Harness
hoyyang44 天前有提交已提供中文文档扫描:含敏感能力

查调用链与影响面,切分支自动跟随索引

29.5/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/9/30 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add hoyyang/dsh-code-graph
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:待复验
是什么
dsh 原生插件 · dev
装得上吗
曾在 dsh 0.2.0-rc.2 下真实安装成功,但当前 dsh 已更新至 0.2.1-rc.5,本站尚未在新版下复验
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 44 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件
查看扫描证据(共 46 处,展示前 38 条)
  • 读取本地文件
    lib/index.js:61
    for (const dir of readdirSync(join(dshHome, 'profiles'))) {
  • 读取本地文件
    lib/index.js:63
    const pkg = JSON.parse(readFileSync(join(dshHome, 'profiles', dir, 'package.json'), 'utf8'));
  • 读取本地文件
    lib/index.js:76
    const reg = JSON.parse(readFileSync(join(dshHome, 'super-injector', 'registry.json'), 'utf8'));
  • 读取本地文件
    lib/index.js:155
    if (!existsSync(repo))
  • 写入本地文件
    lib/index.js:241
    appendFileSync(file, line);
  • 读取本地文件
    lib/index.js:243
    if (statSync(file).size > 262144)
  • 写入本地文件
    lib/index.js:244
    writeFileSync(file, line);
  • 读取本地文件
    lib/index.js:270
    if (statSync(p).isDirectory())
  • 写入本地文件
    lib/index.js:325
    mkdirSync(join(home, 'skills'), { recursive: true });
  • 写入本地文件
    lib/index.js:326
    writeFileSync(file, SKILL_MARKDOWN);
  • 删除本地文件
    lib/index.js:344
    rmSync(file);
  • 删除本地文件
    lib/index.js:358
    rmSync(file, { force: true });
  • 读取本地文件
    lib/engine.js:28
    if (!existsSync(p)) {
  • 执行外部命令来自配置/变量
    lib/engine.js:40
    const child = spawn(bin, ['cli', tool], {
  • 读取本地文件
    lib/engine.js:158
    if (existsSync(stateFile)) {
  • 读取本地文件
    lib/engine.js:159
    const parsed = JSON.parse(readFileSync(stateFile, 'utf8'));
  • 写入本地文件
    lib/engine.js:179
    mkdirSync(dirname(stateFile), { recursive: true });
  • 写入本地文件
    lib/engine.js:180
    writeFileSync(stateFile, JSON.stringify({ sigs: Object.fromEntries(sigStore), repos: regStore }));
  • 读取本地文件
    lib/engine.js:209
    if (!root || !existsSync(root))
  • 读取本地文件
    src/engine.ts:46
    if (!existsSync(p)) {
  • 执行外部命令来自配置/变量
    src/engine.ts:72
    const child = spawn(bin, ['cli', tool], {
  • 读取本地文件
    src/engine.ts:191
    if (existsSync(stateFile)) {
  • 读取本地文件
    src/engine.ts:192
    const parsed = JSON.parse(readFileSync(stateFile, 'utf8')) as Record<string, any>
  • 写入本地文件
    src/engine.ts:209
    mkdirSync(dirname(stateFile), { recursive: true })
  • 写入本地文件
    src/engine.ts:210
    writeFileSync(stateFile, JSON.stringify({ sigs: Object.fromEntries(sigStore), repos: regStore }))
  • 读取本地文件
    src/engine.ts:253
    if (!root || !existsSync(root)) return { checked: false, drift: false, reindexed: false, note: 'no root_path' }
  • 读取本地文件
    src/index.ts:94
    for (const dir of readdirSync(join(dshHome, 'profiles'))) {
  • 读取本地文件
    src/index.ts:96
    const pkg = JSON.parse(readFileSync(join(dshHome, 'profiles', dir, 'package.json'), 'utf8')) as {
  • 读取本地文件
    src/index.ts:108
    const reg = JSON.parse(readFileSync(join(dshHome, 'super-injector', 'registry.json'), 'utf8')) as { name?: string }[]
  • 读取本地文件
    src/index.ts:187
    if (!existsSync(repo)) return { kind: 'error' as const, text: '路径不存在: ' + repo }
  • 写入本地文件
    src/index.ts:272
    appendFileSync(file, line)
  • 读取本地文件
    src/index.ts:273
    try { if (statSync(file).size > 262144) writeFileSync(file, line) } catch { }
  • 写入本地文件
    src/index.ts:273
    try { if (statSync(file).size > 262144) writeFileSync(file, line) } catch { }
  • 读取本地文件
    src/index.ts:292
    if (statSync(p).isDirectory()) return REPO_MARKERS.some((m) => existsSync(join(p, m)))
  • 写入本地文件
    src/index.ts:330
    mkdirSync(join(home, 'skills'), { recursive: true })
  • 写入本地文件
    src/index.ts:331
    writeFileSync(file, SKILL_MARKDOWN)
  • 删除本地文件
    src/index.ts:345
    rmSync(file)
  • 删除本地文件
    src/index.ts:357
    try { rmSync(file, { force: true }) } catch { }
扫描于 2026/11/1(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-tools@deepseek-ai/schemastery
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 查询调用链与影响面
  • 分支切换自动跟随索引
  • 支持158+语言

面向 DSH 的分支感知代码知识图谱插件——支持 158+ 语言的调用方/影响/追踪,带新鲜度门控,零 MCP 会话

README

由 DeepSeek 最新模型翻译生成
dsh-code-graph banner 给 DSH 装上「预索引的代码知识图谱」:Agent 读代码不再盲 grep,而是查调用链、影响面、数据流——切分支自动跟随,索引图永远对应当前检出分支。 English · Releases · 更新日志 version dsh-plugin license 安装 GitHub dsh plugin add github:hoyyang/dsh-code-graph 或 npm dsh plugin add @hoyyang/dsh-code-graph - 零配置可用:装上即生效,读代码门禁默认开启,无需任何账号或 API Key。 - 依赖:本机需有 codebase-memory 引擎二进制(默认 ~/.local/bin/codebase-memory-mcp,可用 config.bin 改路径)。引擎缺失时 fail-loud 点名报错,不影响 DSH 启动。 - 卸载:dsh plugin --profile web remove dsh-code-graph——卸载即净:工具/命令/提示 section/skill 文件/状态文件全部自动清理,不碰图数据库与用户仓库。
展开完整文档(README 剩余 1 节)
dsh-code-graph

banner

给 DSH 装上「预索引的代码知识图谱」:Agent 读代码不再盲 grep,而是查调用链、影响面、数据流——切分支自动跟随,索引图永远对应当前检出分支。

English · Releases · 更新日志

version dsh-plugin license

安装

GitHub
dsh plugin add github:hoyyang/dsh-code-graph

或 npm
dsh plugin add @hoyyang/dsh-code-graph

- 零配置可用:装上即生效,读代码门禁默认开启,无需任何账号或 API Key。
- 依赖:本机需有 codebase-memory 引擎二进制(默认 ~/.local/bin/codebase-memory-mcp,可用 config.bin 改路径)。引擎缺失时 fail-loud 点名报错,不影响 DSH 启动。
- 卸载:dsh plugin --profile web remove dsh-code-graph——卸载即净:工具/命令/提示 section/skill 文件/状态文件全部自动清理,不碰图数据库与用户仓库。

有啥用

- 结构化读代码:callers /callees /impact(调用方逐层 BFS)/ trace(调用与数据流路径)/ architecture(架构概览),LSP 级跨文件解析,覆盖 158+ 语言。
- 分支自动跟随:检出任意分支后直接提问,索引图自动对应当前分支——切回访问过的分支零重索引(每分支一份持久图,LRU 上限防膨胀)。
- 大仓滚动单索引:超过 500MB 的仓库只保留当前分支一份索引,切分支删旧建新,磁盘占用恒为 1 份。
- 保鲜门控:每次查询比对 HEAD+脏树签名,漂移自动 fast 增量重索引(节流防抖),答案永远对应当前工作树。
- 永不空手:图查询零命中自动回落 ripgrep(无 rg 用 grep),结果显式标注 fallback,绝不冒充图结果。
- 读代码硬门禁:未先调 codegraph 的代码 grep 会被拒绝并给出引导;门禁自身异常一律放行(fail-open,绝不阻塞工具链)。
- schema 经济:只注册 1 个分发器工具(11 个操作),对比 MCP 方案 20+ 工具定义/请求,省 ~90% schema 开销。
- 跨分支查询:branch 参数直查已建索引的非检出分支(冻结态,不做保鲜)。

30 秒上手

1. 让 Agent 直接问:"这个函数被谁调用?"——Agent 会自动走 codegraph(门禁保证触发)。
2. 输入 /codegraph 查看已索引项目与分支状态。
3. 新仓库建索引:/codegraph fast(也支持 moderate/full)。
4. Agent 侧查询示例:codegraph { "op": "callers", "repo_path": "", "name": "handleRequest" }
5. 切分支后不用做任何事:git checkout release/x 后继续提问,索引自动跟随。

进阶用法

分支管理

- 索引按分支组织,分支项目名 = 路径__分支(一分支一库)。
- multi 模式(常规仓):每分支一份持久索引图,LRU 上限 maxBranchProjects(默认 6);切回已访问分支零重索引。
- single 模式(大仓,DB > branchIndexMaxDbBytes 即 500MB):每仓只留当前分支一份索引;每次使用核对当前检出分支,不一致删旧建新(fast 全量重建,可能分钟级)——稳态磁盘恒 1 份。
- branch 参数:codegraph { "op": "callers", "repo_path": "", "branch": "release/x", "name": "..." }——仅限已建索引分支;非检出分支为冻结态(不做保鲜)。
- detached HEAD 按 __detached- 命名;非 git 目录与 branchIndex=false 时回退单索引跟随行为。
- op=status 返回当前分支、模式(multi/single)与可用分支清单。

配置

| 键 | 默认 | 说明 |
| bin | ~/.local/bin/codebase-memory-mcp | 引擎二进制路径 |
| defaultMode | fast | index 默认模式(fast/moderate/full) |
| fresh | true | 查询前保鲜门控 |
| freshThrottleSec | 120 | 重索引防抖窗口(秒) |
| maxRows | 50 | 查询返回行数上限 |
| hint | true | 条件系统提示开关 |
| skill | true | skill 文件落盘开关 |
| gate | true | grep 门禁开关(未先调 codegraph 的代码 grep 被 deny) |
| branchIndex | true | 分支索引层总开关(false 回退单索引跟随行为) |
| maxBranchProjects | 6 | multi 模式每仓库分支项目上限(LRU) |
| branchIndexMaxDbBytes | 524288000 | 超过该 DB 字节数转 single(大仓滚动单索引)模式 |

操作一览(单工具分发器)

| op | 用途 |
| projects | 列已索引项目 |
| status | 索引状态 + 分支清单 |
| index | 建/增量索引(仅主 agent) |
| query | BM25 符号/全文检索 |
| callers / callees | 直接调用关系 |
| impact | 向上影响面 BFS(深度 1-8) |
| trace | 调用/数据流路径 |
| architecture | 架构概览 |
| snippet | 按 qualified_name 取代码 |
| changes | 变更检测(git ref 级) |

工作原理

插件是 DSH 原生 toolkit:唯一工具 codegraph 按需 spawn 本机 codebase-memory 引擎 CLI(JSON 走 stdin,空闲即走,无常驻连接、零 MCP 会话)。索引按分支持久化为独立图库;查询前做保鲜门控(HEAD+脏树签名比对);tools/pre-execute 事件上挂读代码门禁;分支层在查询时惰性解析当前检出分支并维护分支注册表(LRU 淘汰 / 大仓单槽清理),全程不修改用户仓库文件、不装 git hooks。

可靠性与验收

- 回归自测:29 项端到端用例(legacy 行为 13 / multi 分支 10 / single 单槽 5 / 存量采纳 1)——node scripts/selftest-ops.mjs,ALL PASS。
- 引擎契约 spike:6 项关键行为实测(--name 一名一库 / 删除真回收 / 同名增量 / 未提交改动感知 / 分支切换重建正确 / size_bytes 阈值)。
- 活体验收:存量仓库零迁移采纳(不触发重索引);分支往返四场景(提交→漂移重索引、新分支→自动建图、跨分支冻结查询、切回→零重索引)全部通过。
- 门禁回归:全新会话 grep 拦截(拒绝原文逐字)/ codegraph 后放行 / 门禁 fail-open 三态验证。
- 生命周期:热重载 fiber 重建验证;卸载零残留(工具/命令/section/skill/状态文件);重装幂等。

常见问题

- 切分支后要手动重索引吗? 不需要。查询自动解析当前检出分支:已有该分支索引直接复用,没有则自动 fast 建图。
- 大仓切分支慢? single 模式下是全量重建(分钟级),这是为磁盘占用恒定付出的代价;不介意多占空间可调大 branchIndexMaxDbBytes 转 multi 模式。
- 没装引擎会怎样? 工具调用 fail-loud 点名报错并给安装指引;DSH 启动与门禁放行逻辑不受影响。
- 会修改我的仓库吗? 不会。不装 git hooks、不写 .gitignore、不启动常驻监听、不改任何仓库文件。
- 为什么我的 grep 被拒绝了? 门 11 读代码强制路由:先调一次 codegraph(确认可用或不可用)后 grep 即放行;bash 里直接跑 rg/grep 不受影响。

本地构建

git clone https://github.com/hoyyang/dsh-code-graph && cd dsh-code-graph
bash scripts/build.sh # pnpm/npm 装依赖 + tsc 编译(自包含)
node scripts/selftest-ops.mjs # 29 项端到端回归(需引擎二进制)

许可证

MIT
预览分享卡片长什么样 ↓hoyyang/dsh-code-graph
分享 · DeepSeek Harness Hub
hoyyang/dsh-code-graph

查调用链与影响面,切分支自动跟随索引

回到顶部