# dsh-dejaview [English](README.md) | 中文 一个 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) 插件, 向 agent 注册一个面向模型的工具 **`check_plugin_novelty`**。在动手写一个 dsh 插件 之前,它替你问出 [DejaView](https://github.com/jiang4wqy/dejaview) 的那句核心问题 ——**「这,是不是已经有人做过了?」**——只不过把范围收窄到 dsh 生态。 给它一个插件想法,它会检索三个公开来源—— [awesome-dsh-plugin](https://github.com/awesome-dsh-plugin/awesome-dsh-plugin) 注册表、[`dsh-plugin`](https://github.com/topics/dsh-plugin) GitHub topic、以及 npm 上打了 `dsh-plugin` 关键词的包——按 IDF 加权的词面相似度(稀有、有区分度的词 比生态高频词更值钱)对已有插件排序,为每个候选返回打分依据,外加 DejaView 的六维 裁决指引。**插件只负责取证与打分,最终裁决交给 harness 自带的那台 DeepSeek 模型**——因此它不需要额外的 API key,也不自带任何 LLM provider。 ## 与 DejaView 的关系 **[DejaView · 项目照妖镜](https://github.com/jiang4wqy/dejaview)** —— [**在线体验 ↗**](https://jiang4wqy.github.io/dejaview/) DejaView 是一个网页应用,用「证据优先」的流水线回答「这项目是不是已经有人造过」, 并提供三副人格报告——**镀金·华尔街 / 毒舌·马戏团 / 彩虹·夸夸群**——共守一条准则: *刻薄可以主观,事实不能主观;锐评项目,不攻击开发者本人。* `dsh-dejaview` 把这一个 问题、以及六维比对 + 三人格的框架,移植成一个作用于插件生态的 dsh 工具。取证与打分 在这里用 TypeScript 重新实现;裁决框架则作为指引交给模型。 ## 这个工具 `check_plugin_novelty` —— 以下至少给一个: | 参数 | 类型 | 含义 | |------------|------------|---------------------------------------| | `idea` | `string` | 你想做的 dsh 插件的一句话描述。 | | `name` | `string` | 拟定的插件名(如果有)。 | | `keywords` | `string[]` | 关键能力词。 | 返回一个 JSON:归一化后的 `query`、`verdict_hint` (`likely-exists` \| `adjacent` \| `looks-novel` \| `inconclusive`)、 `best_similarity`、检索覆盖的 `confidence`、各来源 `counts`、排序后的 `candidates` (含 `name`、`url`、`source`、`category`、`similarity`、`bucket` 及产生该分数的 `signals`)、`uncovered_terms`(最相近的候选没覆盖到的想法词 —— 差异化的起点)、 `degradations`、六维 `verdict_guidance` 和 `disclaimer`。 注册表通过 awesome-dsh-plugin 的 **README 一次请求**读取(对全部已收录插件全量 召回),git tree 扫描作为兜底;响应在进程内缓存几分钟,同一会话多次查重不会重复拉取。 真实示例(对「把回合状态那句替换成轮换文案」这个想法的实时检索结果): ```text verdict_hint = likely-exists best_similarity = 1.0 100% [near-duplicate/registry] 01Virex/dsh-status-rotator — Replaces the "Deep diving..." turn-status label ... 47% [adjacent/registry] alingalingling/ui-status-label — Customize the "deep diving" thinking status label ... ``` 当 harness 的 `systemPrompt` 服务存在时,插件还会贡献一行简短指引 (`tool:check_plugin_novelty`),让 agent 知道在造插件前先跑这个查重。它通过可选 inject 注入,因此没有该服务的 headless profile 也能正常加载。 ## 范围与诚实 - 证据只覆盖 awesome-dsh-plugin 注册表与 `dsh-plugin` GitHub topic,且是**查询当下** 的快照。没查到只代表「本次检索范围内没有」,不等于「全世界没人做过」。 - 若检索降级(限流、网络问题),工具会返回已拿到的部分 + `degradations` 说明,并 降低置信度,而不是让整个调用失败。 - 网络访问仅限 GitHub 公开 REST API 与 raw 文件主机;不发送任何凭据,也不读取本地文件。 ## 运行要求 DeepSeek Harness(`engines.dsh >= 0.1.0-rc.6`)在加载时提供 `@deepseek-ai/dsh-tools` 与 `@deepseek-ai/cordis`。它们**刻意**没有列为可安装依赖: 其独立 npm 依赖图无法干净安装,因此本包用本地类型 shim(`src/dsh-shims.d.ts`)构建, 并把这些包标记为 external。仓库内置已构建的 `lib/`,直接从 Git 安装即可加载,无需构建。 ## 安装到 profile ```sh git clone https://github.com/jiang4wqy/dsh-dejaview.git cd dsh-dejaview pnpm install # 只装开发工具;harness 包在运行时提供 pnpm run check # 类型检查 + 测试 + 构建 dsh plugin --profile dejaview add . dsh --profile dejaview --dump-config | grep dsh-dejaview dsh --profile dejaview ``` 卸载: ```sh dsh plugin --profile dejaview remove dsh-dejaview ``` ## 开发 ```text src/index.ts # 插件入口:在 ctx.tools 上注册 check_plugin_novelty src/fingerprint.ts # 想法 → 归一化的 token/短语指纹 src/sources.ts # 取候选:awesome-dsh 注册表 + dsh-plugin topic src/score.ts # 可解释的词面相似度 + 分档 src/rubric.ts # DejaView 六维 + 三语气裁决指引 src/novelty.ts # 编排(除注入的 fetcher 外为纯函数) src/dsh-shims.d.ts # harness 提供的包的本地类型 shim tests/ # node:test 单测(原生 TS 运行,无需额外运行时) scripts/smoke.ts # 针对公开 GitHub 的手动实跑检查 ``` - `pnpm run typecheck` —— `tsc --noEmit` - `pnpm run test` —— `node --test tests/*.test.ts` - `pnpm run build` —— `tsdown` → `lib/` - `node scripts/smoke.ts` —— 实时端到端检查 ## 被发现 给仓库加上 [`dsh-plugin`](https://github.com/topics/dsh-plugin) topic(元数据,不是文件): ```sh gh api --method PUT repos/jiang4wqy/dsh-dejaview/topics \ -H 'Accept: application/vnd.github+json' \ -f 'names[]=dsh-plugin' ``` ## 许可证 [MIT](LICENSE) © jiang4wqy