为编码智能体预取相关源码,减少反复查找
30/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/20 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add kobubu/Rag-Coding该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:需留意
是什么
dsh 原生插件 · search
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 13 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
⚠︎ 实装验证未通过(dependency_conflict · 2026/10/20) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件
查看扫描证据(共 82 处,展示前 74 条)
- 读取本地文件dist/src/harness/plugin.js:28
current = await readFile(hostPath); - 写入本地文件dist/src/harness/plugin.js:56
writeFileSync(config.diagnosticsPath, JSON.stringify(diagnostics)); - 写入本地文件dist/src/code-memory/cli.js:28
mkdirSync(dirname(output), { recursive: true }); - 写入本地文件dist/src/code-memory/cli.js:30
writeFileSync(temporary, serialized, { encoding: "utf8", flag: "wx" }); - 写入本地文件dist/src/code-memory/cli.js:31
renameSync(temporary, output); - 读取本地文件dist/src/code-memory/vector_cli.js:9
const index = validateIndex(JSON.parse(readFileSync(resolve(root, ".code-memory/index.json"), "utf8"))); - 执行外部命令来自配置/变量dist/src/setup/cli.js:65
const child = spawn(client === "harness" ? state.server.command : client === "codex" ? "codex" : "claude", childArgs, { cwd: state.project, env, stdio - 写入本地文件dist/src/hooks/cli.js:25
appendFileSync(process.env.CM_HOOK_LOG, JSON.stringify({ at: new Date().toISOString(), event: "reread_pointer", tool: event.tool_name }) + "\n"); - 执行外部命令来自配置/变量dist/src/hooks/cli.js:61
spawn(process.execPath, [fileURLToPath(new URL("./daemon_cli.js", import.meta.url)), ...args], { detached: true, stdio: "ignore" }).unref(); - 写入本地文件dist/src/hooks/cli.js:67
appendFileSync(process.env.CM_HOOK_LOG, JSON.stringify({ at: new Date().toISOString(), via, ms: Math.round(performance.now() - started), retrieve_ms: - 读取本地文件dist/src/code-memory/vector.js:66
const previous = JSON.parse(await readFile(cachePath, "utf8")); - 写入本地文件dist/src/code-memory/vector.js:88
await mkdir(config.directory, { recursive: true }); - 写入本地文件dist/src/code-memory/vector.js:89
await mkdir(resolve(cachePath, ".."), { recursive: true }); - 写入本地文件dist/src/code-memory/vector.js:91
await writeFile(cacheTemp, JSON.stringify({ embedding: EMBEDDING, values: cached })); - 写入本地文件dist/src/code-memory/vector.js:92
await rename(cacheTemp, cachePath); - 写入本地文件dist/src/code-memory/vector.js:100
await writeFile(temporary, JSON.stringify(manifest, null, 2)); - 写入本地文件dist/src/code-memory/vector.js:101
await rename(temporary, join(config.directory, "manifest.json")); - 读取本地文件dist/src/code-memory/vector.js:124
const manifest = JSON.parse(await readFile(join(this.config.directory, "manifest.json"), "utf8")); - 读取本地文件dist/src/code-memory/store.js:6
const schema = JSON.parse(readFileSync(new URL("../../../contracts/cm-local.schema.json", import.meta.url), "utf8")); - 读取本地文件dist/src/code-memory/store.js:97
bytes = (await stat(this.indexPath)).size; - 读取本地文件dist/src/code-memory/store.js:104
const raw = await readFile(this.indexPath, { signal }); - 读取本地文件dist/src/code-memory/store.js:119
const known = JSON.parse(await readFile(marker, "utf8")); - 写入本地文件dist/src/code-memory/store.js:127
await writeFile(temp, JSON.stringify({ format: "cm-verified-1", digest, validator: VALIDATOR })); - 写入本地文件dist/src/code-memory/store.js:128
await rename(temp, marker); - 读取本地文件dist/src/code-memory/store.js:145
const root = await realpath(this.projectRoot); - 读取本地文件dist/src/code-memory/store.js:150
path = await realpath(resolve(root, input.path)); - 读取本地文件dist/src/code-memory/live.js:34
const files = paths.map(path => ({ path, sha256: hash(readFileSync(join(this.root, path))) })); - 读取本地文件dist/src/code-memory/live.js:40
const pointer = JSON.parse(await readFile(join(this.directory, "current.json"), "utf8")); - 写入本地文件dist/src/code-memory/live.js:53
await mkdir(this.directory, { recursive: true }); - 读取本地文件dist/src/code-memory/live.js:60
return async () => { await file.close(); const current = JSON.parse(await readFile(path, "utf8")); if (current.token === token) - 删除本地文件dist/src/code-memory/live.js:61
await rm(path); }; - 读取本地文件dist/src/code-memory/live.js:67
const owner = JSON.parse(await readFile(path, "utf8")); - 删除本地文件dist/src/code-memory/live.js:74
await rm(path); - 读取本地文件dist/src/code-memory/live.js:159
await stat(cache); - 写入本地文件dist/src/code-memory/live.js:164
await copyFile(join(this.options.baseVectors, "embedding-cache.json"), cache); - 写入本地文件dist/src/code-memory/live.js:188
await mkdir(staging, { recursive: true }); - 写入本地文件dist/src/code-memory/live.js:194
await rename(staging, base); - 写入本地文件dist/src/code-memory/live.js:223
} await rename(temporary, path); } - 读取本地文件dist/src/code-memory/direct.js:15
const realRoot = await realpath(root); - 读取本地文件dist/src/code-memory/direct.js:18
actual = await realpath(resolve(root, path)); - 读取本地文件dist/src/code-memory/direct.js:35
if (before.size !== after.size || before.mtimeNs !== after.mtimeNs || before.ctimeNs !== after.ctimeNs || BigInt(bytesRead) !== after.size || await re - 读取本地文件dist/src/code-memory/indexer.js:9
return readdirSync(directory, { withFileTypes: true }).flatMap((entry) => { - 读取本地文件dist/src/code-memory/indexer.js:23
const root = realpathSync(projectRoot), files = new Set(ANALYSIS_FILES.filter(path => existsSync(join(root, path))).map(path => resolve(root, path))); - 读取本地文件dist/src/code-memory/indexer.js:35
if (!existsSync(resolved) || files.has(resolved)) - 读取本地文件dist/src/code-memory/indexer.js:42
if (existsSync(join(root, name))) - 读取本地文件dist/src/code-memory/indexer.js:44
return [...files].sort().map(path => ({ path: relative(root, path).split(sep).join("/"), sha256: hash(readFileSync(path)) })); - 读取本地文件dist/src/code-memory/indexer.js:94
const raw = readFileSync(filename); - 读取本地文件dist/src/local-agent/http.js:70
const bytes = await readFile(path, { signal: signal.signal }); - 读取本地文件dist/src/setup/install.js:17
root = await realpath(root); - 读取本地文件dist/src/setup/install.js:18
project = await realpath(project); - 读取本地文件dist/src/setup/install.js:33
const info = await lstat(path); - 读取本地文件dist/src/setup/install.js:37
for (const item of await readdir(path)) - 写入本地文件dist/src/setup/install.js:43
await mkdir(dirname(target), { recursive: true }); - 读取本地文件dist/src/setup/install.js:47
const project = await realpath(options.project); - 写入本地文件dist/src/setup/install.js:48
await mkdir(resolve(options.root), { recursive: true }); - 读取本地文件dist/src/setup/install.js:49
const root = await realpath(options.root), id = projectId(project), name = "cm_" + id, directory = join(root, "projects", id); - 写入本地文件dist/src/setup/install.js:72
await mkdir(directory, { recursive: true }); - 写入本地文件dist/src/hooks/client.js:10
mkdirSync(directory, { recursive: true, mode: 0o700 }); - 读取本地文件dist/src/hooks/client.js:11
const stat = statSync(directory); - 读取本地文件dist/src/hooks/client.js:19
return String(statSync(fileURLToPath(import.meta.url)).mtimeMs); - 读取本地文件dist/src/hooks/reread.js:9
const state = JSON.parse(readFileSync(statePath(session), "utf8")); - 写入本地文件dist/src/hooks/reread.js:18
writeFileSync(temp, JSON.stringify(state), { mode: 0o600 }); - 写入本地文件dist/src/hooks/reread.js:19
renameSync(temp, path); - 读取本地文件dist/src/hooks/reread.js:63
current = readFileSync(target); - 删除本地文件dist/src/hooks/daemon.js:49
unlinkSync(address); - 删除本地文件dist/src/hooks/daemon.js:64
unlinkSync(address); - 读取本地文件dist/src/setup/files.js:7
return utf8(await readFile(path)); - 读取本地文件dist/src/setup/files.js:21
root = await realpath(root); - 读取本地文件dist/src/setup/files.js:26
if ((await lstat(current)).isSymbolicLink()) - 删除本地文件dist/src/setup/files.js:42
await unlink(edit.path); - 写入本地文件dist/src/setup/files.js:45
await mkdir(dirname(edit.path), { recursive: true }); - 写入本地文件dist/src/setup/files.js:57
await rename(temporary, edit.path); - 删除本地文件dist/src/setup/files.js:60
await unlink(temporary).catch(() => { }); - 读取本地文件dist/src/setup/claude.js:18
if (await realpath(root) !== project)
扫描于 2026/11/2(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/cordis-plugin-include@deepseek-ai/dsh-agent@deepseek-ai/dsh-app-boot@deepseek-ai/dsh-fs@deepseek-ai/dsh-llm@deepseek-ai/dsh-system-prompt@deepseek-ai/dsh-tools@deepseek-ai/dsh-util-values给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
DeepSeek Harness 的本地代码记忆:自动源码上下文、语义搜索和依赖图。
README
由 DeepSeek 最新模型翻译生成DeepSeek Harness 的代码记忆
让编码智能体在第一步之前就拿到相关源码。 Code Memory(CM)是面向 JavaScript 和 TypeScript 项目的本地代码索引与上下文插件。它把符号查找、依赖图和语义搜索结合起来,减少反复查找源码。
非官方社区项目。 独立开发,与 DeepSeek 无关联,也未获其认可。
English · Русский · 下载 v0.9.1 · Windows 安装
功能
- 在 DeepSeek Harness 首次调用模型之前,提供精简的源码上下文。
- 直接查找指定文件和符号;需要发现时,使用本地 MiniLM 嵌入和 LanceDB。
- 借助 TypeScript 编译器的符号图和调用图,展开相关依赖。
- 检查源码版本,避免重复发送已提供给 Harness 且未改动的完整文件。
- 为 Codex 和 Claude Code 提供 MCP 服务器,并提供可选的 UserPromptSubmit 钩子,用于自动注入上下文。
- 内置 CM Atlas,一张本地地图,展示模块、符号及其关系。
索引、嵌入和图都留在你的电脑上。使用云端模型时,选中的代码仍会发送给模型服务商。CM 不包含模型额度,也不包含模型服务商订阅。
展开完整文档(README 剩余 1 节)
DeepSeek Harness 的代码记忆 让编码智能体在第一步之前就拿到相关源码。 Code Memory(CM)是面向 JavaScript 和 TypeScript 项目的本地代码索引与上下文插件。它把符号查找、依赖图和语义搜索结合起来,减少反复查找源码。 非官方社区项目。 独立开发,与 DeepSeek 无关联,也未获其认可。 English · Русский · 下载 v0.9.1 · Windows 安装 功能 - 在 DeepSeek Harness 首次调用模型之前,提供精简的源码上下文。 - 直接查找指定文件和符号;需要发现时,使用本地 MiniLM 嵌入和 LanceDB。 - 借助 TypeScript 编译器的符号图和调用图,展开相关依赖。 - 检查源码版本,避免重复发送已提供给 Harness 且未改动的完整文件。 - 为 Codex 和 Claude Code 提供 MCP 服务器,并提供可选的 UserPromptSubmit 钩子,用于自动注入上下文。 - 内置 CM Atlas,一张本地地图,展示模块、符号及其关系。 索引、嵌入和图都留在你的电脑上。使用云端模型时,选中的代码仍会发送给模型服务商。CM 不包含模型额度,也不包含模型服务商订阅。 CM Atlas 展示此公开仓库的模块与结构关系 实际 CM Atlas 截图,展示此仓库公开的 src 目录:39 个模块、2,409 个符号、8,321 条关系。当前 Atlas 界面为俄语;下面的安装指南为英语。 实测结果与局限 已发布的 Harness 试点使用 GPT-6 Luna,在一个仓库内的六类任务上测试,仓库为 Geo Dash。三个评估系列各跑 36 个会话:无 CM、旧版 CM、新版 CM,每个任务和每个分组重复两次。 | 新版 CM 对比无 CM | 已发布结果 | | 模型 token 总量 | 三个系列均减少 45–66% | | 估算模型费用 | 降低 30–47% | | Harness 会话总时长 | 降低 18–37% | | 跨系列汇总的独立校验通过解法 | 新版 CM 36/36;无 CM 35/36 | 这些是小规模、单项目试点结果,不保证节省。区间是观测到的系列结果,不是置信区间。费用为估算值;会话时长不含首次安装和索引。所有尝试(包括失败)都保留。早期方案和原生客户端实验的结果不同;不要把这些百分比套用到所有客户端或工作负载。 方法、原始结果与复现 · Codex 和 Claude Code 实验 · 哪些做法没有奏效 安装到现有 Harness 需要 DeepSeek Harness 0.2.0-rc.2,以及 Node.js 24 或 22.x 中的 22.19+: bash dsh plugin --profile web add github:kobubu/Rag-Coding#v0.9.1 该 tag 包含编译好的插件、命令行入口和 Atlas。CM 无需安装构建,也不需要 Vite/React 运行时模块。接下来准备项目索引和本地模型。也可以直接使用现成的 release tarball: bash dsh plugin --profile web add https://github.com/kobubu/Rag-Coding/releases/download/v0.9.1/dsh-plugin-code-memory-0.9.1.tgz 0.9.1 之前的 Git tag 需要对应的 release tarball,或显式从源码构建。新运行时在禁用脚本的情况下也能工作;原生依赖遵循宿主包管理器的策略。 如果 CM 是用 Windows bootstrap 安装的,请用新的 ZIP 和相同的 -InstallRoot 更新。Harness 0.2.0-rc.2 会优先使用自身安装目录旁的 CM 副本,而不是配置档里安装的副本;给这个旧安装再加一个 Git 依赖,不会替换它的启动器或内嵌副本。bootstrap 会创建新的 release 目录,并切换受管理的项目启动器。 在 Windows 上安装 从 v0.9.1 release 下载 CM-0.9.1-Windows.zip 和 SHA256SUMS.txt,校验 checksum,然后解压 ZIP。在解压后的文件夹里运行: powershell powershell -NoProfile -ExecutionPolicy Bypass -File .\install_cm.ps1 -ProjectRoot 'C:\path\to\your-project' -Clients harness 安装器会使用兼容的 Node.js,或下载私有运行时,安装 CM 和 Harness 0.2.0-rc.2,下载 embedding 模型,并准备好你的索引。不需要管理员权限,也不需要源码 checkout。首次下载依赖和模型需要联网。打开 setup 打印出的 start-harness.ps1 路径,然后在 Harness 里配置模型服务商。 用 -SourceScope src 只索引子目录。用 -Clients harness,codex,claude 为三个客户端都添加项目 MCP 连接;Codex 和 Claude Code 需要单独安装。它们的自动上下文钩子目前是单独手动配置,不是安装器的默认行为。 安装、启动、验证与卸载 · 原生客户端钩子配置 从源码构建 使用 Node.js 24 LTS,或 22.x 系列中的 Node.js 22.19.0+。 bash git clone https://github.com/kobubu/Rag-Coding.git cd Rag-Coding npm ci npm run verify npm run cm:index npm run cm:vectors npm run cm:search -- --query "how are embeddings reused between snapshots" npm run plugin:smoke plugin:smoke 通过真实的 Harness 运行时派发工具,不调用模型。在 PowerShell 里,转发 flag 的命令要用 npm.cmd。受限的云端构建可以用 ONNXRUNTIME_NODE_INSTALL=skip npm ci 跳过原生运行时下载;运行本地 embedding 仍然需要可用的 ONNX 运行时。 Windows 引导程序是打包好的安装路径。不包含 macOS/Linux 安装程序、自动发布更新和订阅服务。 改动源码后,用 npm run compile 重新构建运行时。提交时同步 dist/src/ 和 dist/viewer/;npm run package:check 和 CI 会拒绝缺失或过期的产物。命令之所以叫 compile,是因为 npm 会把名为 build 的脚本当成重建 Git 依赖的理由。 文档 以下工程文档目前是俄文;README 和 Windows 发布指南是英文。 | 文档 | 内容 | | CM 工作原理 | 路由、图扩展、上下文预算、源码新鲜度 | | Harness 集成 | 打包安装、配置、工具 | | MCP 设置 | 供编码客户端共用的本地检索 | | CM Atlas | 本地项目可视化 | | 发布说明 | 公开包包含哪些内容 | | 发布流程 | 重建安装程序、检查产物 | CM 用 TypeScript/Node.js 编写。索引项目代码时不执行代码。支持的输入是 JavaScript/TypeScript 源文件;当前语料上限为 500 个文件、8 MiB 源码。参见贡献规则。 在其他仓库上试用 Show Your Plugins 讨论 · 社区目录提交 欢迎独立的 A/B 结果:用同一任务、模型、推理设置、检查项和起始提交,分别在开启和关闭 CM 的情况下跑。单独列出索引/准备时间、所有失败尝试、总 token 数、耗时,以及补丁是否真的通过独立检查。无论变好还是变差,都请报到 Issues。
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
kobubu/Rag-Coding
为编码智能体预取相关源码,减少反复查找
相关插件 · 搜索 / 抓取
LLM 知识平台Tencent/WeKnora
概览 ·快速开始 ·新特性 ·功能 ·客户端 ·文档 ·开发
★ 36,161已汉化DSH
72.1
智能体记忆系统MemTensor/MemOS
MemOS 2.0 Stardust星尘
★ 12,195已汉化DSH
71.2
跨代理记忆库zilliztech/memsearch
跨平台语义记忆,专为 AI 编程智能体打造。
★ 2,799已汉化DSH
70.9
技能语料库EverMind-AI/SkillCorpus
SkillCorpus 能给你什么
★ 694已汉化DSH
69.7
代码图谱记忆syncable-dev/memtrace-public
你的智能体值得拥有结构化记忆。
★ 509已汉化MCP
67.9
AnySearch 搜索插件anysearch-team/anysearch-dsh
AnySearch 网页搜索服务商,为 DeepSeek Harness(DSH)提供高级搜索工具
★ 457已汉化DSH
66.6