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

语义代码搜索 JohnXu22786/semantic-search

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

面向 DeepSeek Harnessdsh以及任意 Node 脚本的本地语义代码搜索。

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

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

自动兼容检查有告警:未发布到 npm registry,仅可从源码安装。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add JohnXu22786/semantic-search
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:需留意
是什么
dsh 原生插件 · search
装得上吗
实装验证未通过(dependency_conflict),装前请到仓库确认最近更新与 issue
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 3 天前
档位由哪些信号合成

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

验证判据与等级说明 →
⚠︎ 实装验证未通过(dependency_conflict · 2026/10/22) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查⚠ 装前注意

未发布到 npm registry,仅可从源码安装

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✗npm 包dsh-semantic-search(未发布到 npm,仅可源码安装)
✓Node 引擎要求 ^22.19.0 || >=24.0.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/30 06:18:11

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

读写/删除本地文件发起外部网络请求
查看扫描证据(共 23 处,展示前 23 条)
  • 读取本地文件
    src/engine/search.ts:379
    content = await readFile(meta.path, { encoding: 'utf8', signal })
  • 读取本地文件
    src/engine/search.ts:458
    stat(path),
  • 读取本地文件
    src/engine/search.ts:459
    readFile(path, { encoding: 'utf8', signal }),
  • 读取本地文件
    src/watcher.ts:62
    const entries = await readdir(root, { recursive: true, withFileTypes: true })
  • 读取本地文件
    src/watcher.ts:69
    const info = await stat(filePath)
  • 发起网络请求
    src/engine/provider.ts:228
    response = await fetch(url, {
  • 发起网络请求
    src/engine/provider.ts:291
    const r2 = await fetch(url, {
  • 读取本地文件
    src/engine/scanner.ts:159
    entries = await readdir(dir, { withFileTypes: true })
  • 读取本地文件
    src/engine/scanner.ts:187
    stat = await lstat(abs)
  • 读取本地文件
    src/engine/scanner.ts:242
    content = await readFile(abs, { encoding: 'utf8', signal: opts.signal })
  • 写入本地文件
    src/engine/persist.ts:62
    await mkdir(parent, { recursive: true })
  • 写入本地文件
    src/engine/persist.ts:64
    await writeFile(tmp, JSON.stringify(value), 'utf8')
  • 写入本地文件
    src/engine/persist.ts:65
    await rename(tmp, file)
  • 写入本地文件
    src/engine/persist.ts:77
    await mkdir(dir, { recursive: true })
  • 写入本地文件
    src/engine/persist.ts:81
    await writeFile(tmp, buf)
  • 写入本地文件
    src/engine/persist.ts:82
    await rename(tmp, join(dir, VECTORS_FILE))
  • 读取本地文件
    src/engine/persist.ts:89
    for (const entry of await readdir(dir)) {
  • 读取本地文件
    src/engine/persist.ts:90
    const st = await stat(join(dir, entry))
  • 读取本地文件
    src/engine/persist.ts:102
    await stat(join(dir, INDEX_FILE))
  • 读取本地文件
    src/engine/persist.ts:120
    readFile(join(dir, INDEX_FILE), 'utf8'),
  • 读取本地文件
    src/engine/persist.ts:121
    readFile(join(dir, VECTORS_FILE)),
  • 删除本地文件
    src/engine/persist.ts:182
    await rm(join(dir, INDEX_FILE), { force: true })
  • 删除本地文件
    src/engine/persist.ts:183
    await rm(join(dir, VECTORS_FILE), { force: true })
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

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

功能亮点

  • 本地语义代码搜索
  • 符号感知索引
  • 向量与BM25混合检索

README

由 DeepSeek 最新模型翻译生成
dsh-semantic-search 面向 DeepSeek Harness(dsh)以及任意 Node 脚本的本地语义代码搜索。 English documentation: README.md sema 为工作区构建片段级索引:源码经语言感知分词器(camel/snake/kebab 拆分、CJK n-gram)处理后,按符号感知边界切块(函数/类保持完整),再嵌入为定长向量——默认完全本地、零依赖(特征哈希的 TF-IDF),也可接入任意 OpenAI 兼容的 embedding 端点。查询基于该索引做混合检索(向量余弦 + BM25,用倒数排名融合 RRF 合并),即使关键词不完全一致也能按语义命中。 以 dsh 插件 bundle 形式交付——在 harness 工具注册表上提供一个 sema 工具(action=search、action=reindex 或 action=stats)——并附带独立的 sema CLI。 特性一览 - 默认离线可用 —— 内置 lexical 提供方无需网络、无需下载模型、无需 API key;可当作快速 BM25 增强的代码搜索使用。 - 符号感知分块 —— 保守的按语言表(16 种语言)提供边界,函数/类保持完整;漏判边界时优雅退化为普通文本块。
展开完整文档(README 剩余 1 节)
dsh-semantic-search

面向 DeepSeek Harness(dsh)以及任意 Node 脚本的本地语义代码搜索。

English documentation: README.md

sema 为工作区构建片段级索引:源码经语言感知分词器(camel/snake/kebab 拆分、CJK n-gram)处理后,按符号感知边界切块(函数/类保持完整),再嵌入为定长向量——默认完全本地、零依赖(特征哈希的 TF-IDF),也可接入任意 OpenAI 兼容的 embedding 端点。查询基于该索引做混合检索(向量余弦 + BM25,用倒数排名融合 RRF 合并),即使关键词不完全一致也能按语义命中。

以 dsh 插件 bundle 形式交付——在 harness 工具注册表上提供一个 sema 工具(action=search、action=reindex 或 action=stats)——并附带独立的 sema CLI。

特性一览

- 默认离线可用 —— 内置 lexical 提供方无需网络、无需下载模型、无需 API key;可当作快速 BM25 增强的代码搜索使用。
- 符号感知分块 —— 保守的按语言表(16 种语言)提供边界,函数/类保持完整;漏判边界时优雅退化为普通文本块。
- CJK 感知分词 —— n-gram 分词(默认 bigram)让中文查询与文档无需分词库即可对齐;全角标点被折叠而非硬断。
- RRF 混合检索 —— 向量余弦与 BM25 双通道经倒数排名融合,单通道命中的文档也能进入排序。
- 优雅降级 —— 远程 provider 不可达时索引自动回退到本地 lexical provider(可用 allowFallback 控制)。
- 增量刷新 + 文件监听 —— action=reindex 按大小+mtime 差异更新,可选的 watcher 让索引保持新鲜。
- 持久化 —— 索引原子化保存到 <root>/.sema(JSON 元数据 + 二进制向量),provider/维度变化时自动检测失效。
- 确定性 —— 相同的工作区与配置产生相同的索引与排序结果。

支持的语言

TypeScript、JavaScript、Python、Go、Rust、Java、Kotlin、Scala、C、C++、C#、Objective-C、Ruby、PHP、Swift、Bash,以及常见数据/标记格式(JSON、YAML、TOML、Markdown、HTML、XML……)。

安装

作为 dsh bundle

本包声明 "dsh": { "bundle": { "patch": "./cordis.patch.yml" } }。补丁插入一行插件项,将 bundle 挂载到 ctx.tools 并注册 sema 工具。

从 npm(包名已保留;发布待访问权限配置完成后执行)
npm install -g dsh-semantic-search

或直接从此仓库安装
dsh plugin --profile demo add github:JohnXu22786/semantic-search

或使用本地检出目录
dsh plugin --profile demo add /path/to/semantic-search

作为独立 CLI

npm install -g dsh-semantic-search # 或: npm run build && node bin/sema.mjs
sema --help

dsh 工具 API

插件只提供一个 sema 工具。将 action 设为 search、stats 或 reindex,参数对象例如:

- 搜索:{ "action": "search", "query": "查找重试循环" }
- 统计:{ "action": "stats" }
- 全量重建:{ "action": "reindex", "full": true }

搜索时必须提供至少包含一个非空白字符的 query。缺少查询词、空字符串或仅含空白字符都会返回校验错误。

CLI 用法

sema index 从工作区构建完整索引 sema reindex [--full] 增量刷新(或加 --full 全量重建) sema search <query...> 混合向量+BM25 搜索,打印 top 命中 sema stats [--json] 索引健康度、provider 与规模数据

全局选项:

--root <dir> 工作区根目录(默认:当前目录) --data-dir <dir> 索引存储目录(默认:<root>/.sema) --provider <kind> embedding provider:lexical | openai(默认:lexical) --dim <n> embedding 维度(lexical 默认 4096;openai 0=自动) --base-url <url> OpenAI 兼容 embeddings 端点根地址 --model <name> embeddings 模型名(仅 openai) --api-key <key> API key(仅 openai;环境变量:SEMA_EMBEDDING_API_KEY) --top <n> search 打印的命中数(默认:20) --json 输出机器可读结果(支持处) --help 显示帮助

CLI 退出码

- 0 —— 成功(包括零命中的搜索,以及 --version/--help)。
- 1 —— 运行时失败(配置错误、构建/索引/搜索出错)。
- 2 —— 用法错误:未知命令、未知参数、缺少或为空白的搜索查询。

配置

可在 bundle 行的 config(示例见 cordis.patch.yml)、上面的 CLI 参数或代码默认值中配置:

| 选项 | 默认 | 含义 |
| root | cwd | 待索引的工作区根目录 |
| dataDir | .sema | 索引存储目录 |
| provider.kind | lexical | lexical(离线)或 openai |
| provider.dimension | 0(lexical: 4096) | embedding 维度;0=从端点自动推断 |
| provider.baseUrl | https://api.openai.com/v1 | OpenAI 兼容端点根地址 |
| provider.apiKey | 空 | 显式配置的 OpenAI API key;优先于环境变量和凭据库 |
| provider.model | text-embedding-3-small | embedding 模型名 |
| provider.apiKeyEnv | SEMA_EMBEDDING_API_KEY | 环境变量名称;也用作凭据库引用 |
| allowFallback | true | 远程 provider 失败时回退到 lexical |
| include / ignore | 默认 | 索引/忽略的 glob 集合 |
| maxLinesPerChunk | 80 | 分块大小硬上限 |
| nGram | 2 | CJK n-gram 大小(1 关闭 n-gram) |
| topK | 20 | 默认返回的命中数 |
| rrfK | 60 | RRF 融合常数 |
| vectorK | 300 | 融合前每通道候选数 |
| autosave | true | 构建后持久化索引 |
| autoIndex | true | 首次搜索时惰性构建 |
| watch | true | 监听工作区变更 |

OpenAI key 按以下顺序选择:provider.apiKey、provider.apiKeyEnv 指定的环境变量值,最后是以 provider.apiKeyEnv 为引用的宿主凭据库条目。凭据库中的 key 会在每次 embedding 操作时重新解析,因此凭据轮换无需重启插件。

开发

npm ci
npm test # 构建 + 运行 node:test 套件(76 个测试)
npm run typecheck
npm run build # tsc -> lib/

许可证

MIT —— 见 LICENSE。© 2026 dsh-semantic-search 贡献者。
预览分享卡片长什么样 ↓JohnXu22786/semantic-search
分享 · DeepSeek Harness Hub
JohnXu22786/semantic-search

面向 DeepSeek Harnessdsh以及任意 Node 脚本的本地语义代码搜索。

回到顶部