Semantic Drift Vocabulary:用一份版本化词表对齐业务概念与代码命名

前言

在 DSH 里让智能体写代码时,同一个业务概念往往在类型名、字段名、注释和资源文案里各写各的。团队可以口头约定「以某某为准」,但 rename 进不了可 review 的 diff,例外也记不住。DSH 社区插件 dsh-semantic-drift(界面名 Semantic Drift Vocabulary / 语义漂移词表)把「项目里东西叫什么」收成一份跟仓库一起版本化的 YAML,用只读扫描标出代码与词表不一致之处,并在每次会话里把同一套命名规则注入智能体提示词。思路借鉴 kurapica/schema-node-csharp 的三点前提(语义应是独立、可版本化的产物;小词表比开放类型系统好维护;漂移必须可观测、可裁决),实现上不借用其 Meta/Property/Relation 模型或代码生成——一个词表文件、一个只读扫描器、一个面板、五个智能体工具。

这是什么

维护者 Yubickari,在 DSH 插件目录中归类为「记忆」。插件记录每个业务概念的点分 id、人类用语 terms、种类 kind、规范符号 canonical(及必要时 type、unit)和说明;对比代码树后报告重复定义、结构分叉、拼写变体、注释/资源里出现但代码未用的术语等;接受的例外写在词表里并带 reason 与最小 scope。它不自动改代码、不替团队决定是否提交 .dsh/semantics.yaml。

  • 目录页:https://www.skillhub.cn/plugins/Yubickari/dsh-semantic-drift
  • 源码与文档:https://github.com/Yubickari/dsh-semantic-drift
  • 许可证:MIT(见仓库 LICENSE)
  • 依赖 DSH:>=0.2.1-rc.3(见 package.json 中 dsh.engines)

核心功能

版本化词表

词表默认路径为工作区内的 .dsh/semantics.yaml。写入前会做校验:例如 id 须唯一且形如 group.name,canonical.symbol 须为合法标识符且概念间不重复,terms 非空且不可跨概念共享,每条 accepted 须有 reason,glob 须可解析;YAML 语法错误会报告行列且不会落盘。保存行为是规范且幂等的;在原始编辑器里手改格式会保留。

只读漂移扫描

扫描不写源码。即使词表为空,结构类检测仍可在代码与代码之间比较(例如「同一类型被声明两次」),便于冷启动。注册概念后再扫,才会出现依赖词表的命名类发现。README 列出的检测方向包括:同类型重复声明(比较成员值而不只是名字)、两份拷贝已分叉、Parameterized 衍生拷贝(不应合并)、规范名的拼写变体(含代码从未使用的规范拼写)、术语出现在注释或资源但不在代码中。结构检测覆盖 C#、TypeScript、Python 的声明;其它文件主要贡献注释/字符串证据。插件是词法层面的,不保证语义等价;canonical.unit 会展示和校验字符串,但没有单位漂移检测器。

例外与裁决

接受某条 finding 时选择 scope(单文件、同名目录、整符号或自定义 glob),查看将静音的条数并填写 reason。例外写在词表文件中,可编辑、改写、删除或撤销;每条会报告当前实际静音多少 finding。

智能体侧

每个会话会注入一段提示:列出当前工作区概念及规则——命名前先查概念、按 canonical.symbol 拼写、缺概念先登记、 deliberate 偏离须记 reason。提供五个工具供智能体读、登记、扫描与裁决。提示词区块有 token 成本;可在面板设置里按 profile 关闭注入,扫描本身在无人请求时不产生该成本(具体数字见仓库 README「Token cost」)。扫描与注入均不强制执行,智能体仍可偏离,但偏离应被记录。

安装与启用

插件以当前 DSH 进程权限运行;安装前请自行查看源码与 MIT 许可证。社区目录 skillhub.cn 为独立站点,与 DeepSeek / 幻方无官方从属关系。安装方式与 README 一致:

# from npm
dsh plugin --profile desktop add dsh-semantic-drift

# from GitHub
dsh plugin --profile desktop add github:Yubickari/dsh-semantic-drift

# from a local checkout
dsh plugin --profile desktop add link:/path/to/dsh-semantic-drift

Web GUI 可在 Settings → Plugins → Install from source 完成同等操作。安装后刷新页面一次以便浏览器端加载,再在侧栏选择 Semantic Drift Vocabulary。仓库已提交 lib/,从 git 源安装无需 build。更新需再次执行 install(无插件内 updater),例如:

dsh plugin --profile desktop add dsh-semantic-drift@0.2.0
dsh plugin --profile desktop add github:Yubickari/dsh-semantic-drift#v0.2.0

更新后重启 DSH,在面板页脚或 GET /semantic-drift/health 查看版本;更新不会改动已有词表与 accepted 条目。

典型用法

下面步骤来自 README「Getting started」,可在工作区内复现。

  1. 打开工作区中的 Semantic Drift Vocabulary。
  2. 点击 Create vocabulary,生成带默认 exclude、无概念的 .dsh/semantics.yaml。
  3. 点击 Scan。尚无概念时仍可能看到结构类 finding。
  4. 用 New concept 或工具 semantic_upsert 登记概念,再扫描一次。
  5. 对有意保留的差异:选 scope,确认静音条数,填写 reason 接受 finding。

词表片段示例(字段含义见 README「The vocabulary file」):

version: 1
meta:
  project: demo
  updated: 2026-10-25
exclude: ["**/node_modules/**", "**/bin/**", "**/obj/**"]
concepts:
  - id: device.target_temperature
    terms: ["target temperature", "set point"]
    kind: quantity
    canonical:
      symbol: TargetTemperature
      type: double
      unit: "°C"
    note: The temperature the device is asked to reach.
    accepted:
      - symbol: TargetTemp
        path: src/Legacy/**
        reason: public field kept for one release

terms 可用任意语言;扫描器在注释、字符串和资源文件中按纯文本匹配。

适用场景与边界

适合需要在多人、多会话、智能体协作下维持同一套业务命名,且希望 rename 与例外都能进 Git diff 的团队。一个工作区一份词表,无跨仓库视图。它不替代类型系统或静态分析的全语义能力,也不做自动 rename/merge。是否将 .dsh/semantics.yaml 纳入版本控制由项目自行决定。

结尾

dsh-semantic-drift 把业务概念收成可 review 的词表、用只读扫描暴露命名与结构漂移,并把同一规则放进每次智能体会话。安装与细节以仓库 README(含 README.zh.md)为准;浏览与安装入口亦可从目录页进入:https://www.skillhub.cn/plugins/Yubickari/dsh-semantic-drift ,源码:https://github.com/Yubickari/dsh-semantic-drift 。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜