dsh-context-imports
Verifieddsh-context-imports · v0.1.1 · MIT · Web UI
Claude Code-style @path imports for DSH: expands @imports in AGENTS.md/CLAUDE.md and injects the referenced files into model context at session start
Install
dsh plugin add dsh-context-imports Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Tags
Creators
Readme
dsh-context-imports · 上下文导入
DeepSeek Harness 会注入 AGENTS.md 本体,但里面的 @路径 引用只是死文本——模型根本读不到。本插件把 Claude Code 的 @import 机制真正带进 DSH:会话启动时递归展开引用(深度可控、预算封顶、代码块忽略、缺失兜底),把被引用文件全文注入为持久上下文;压缩后自动续命,活跃上下文永远只有一份(事件形态无关的注入检测);装上即有六语言设置卡片(中/英/日/法/俄/韩),注入包装文本跟随 UI 语言。只基于官方公开 API(agent/session-start + agent.inject() + schemastery + dsh-settings),零功能插件依赖。
中文 | English
它解决什么问题
| 没有 dsh-context-imports | 装上之后 | |
|---|---|---|
| AGENTS.md 本体 | ✅ 官方 agent-instructions 注入 | ✅ 仍由官方注入(不重复) |
@00_BOOT/SYSTEM_STATE.md 等引用 |
❌ 死文本,模型看不到 | ✅ 全文注入为会话上下文 |
| 引用的引用(嵌套 @import) | ❌ 无人处理 | ✅ 递归展开,深度可控 |
| 长会话压缩后 | ❌ 状态文件随历史被压掉 | ✅ compact 后自动重新注入(续命) |
| 恢复会话(resume) | — | ✅ 检测到已有注入即跳过,永不叠加重复块 |
工作机制
agent/session-start(startup / resume / clear / compact)
│
├─ 读取配置(设置卡片实时生效,无需重载)
│
├─ 扫描指令文件(默认 AGENTS.md / CLAUDE.md)中的 @路径 引用
│ ├─ 跳过围栏代码块;必须带文件扩展名
│ ├─ 相对路径按「引用者所在目录」解析,逐层递归(默认 ≤3 层)
│ └─ 按解析后路径去重,环引用天然免疫
│
├─ 合并显式 files 列表(这些文件注入全文,指令文件本体只扫描不重注)
│
├─ 预算封顶:单文件 64KB(超限截断并标注)/ 总量 128KB(超限省略并标注)
│ 缺失文件只记一行提示,不报错
│
├─ 单份不变量:全量事件日志指纹检测,已有注入 → 跳过;
│ compact 真正压掉旧块后 → 自动重注续命
│
└─ pre-step 定位插入:排在 AGENTS.md / skill 目录等全部上下文注入之后、
用户消息之前;<system-reminder> 内只有 <file path="…"> 块与状态行,
零引导废话;包装可用 template 自定义
特性
- Claude Code 式 @import:
AGENTS.md里写@04_MEMORY/INDEX.md,会话开始模型就"已经读过"它——不再依赖 Agent 自觉执行启动读取(那个假设已被证明不可靠)。 - 四场景触发,全部可配:新会话 / 恢复 / 清空 / 压缩后。压缩续命是刻意设计——长会话压缩后状态文件自动回场。
- 单份注入不变量:对持久会话日志做了事件形态核验(注入消息双形态落库:
agent/inbox/spliced与user/message),检测按全量日志指纹匹配,与落库形态无关;任何场景下活跃上下文最多一份。 - 六语言设置卡片:设置 → Plugins → Plugin configuration 图形化编辑全部配置;界面文案中/英/日/法/俄/韩,跟随宿主语言实时切换。
- 预算与兜底:单文件/总量双预算、缺失文件降级为提示行、围栏代码块内的
@不误判、环引用去重。 - 纯官方 API:cordis 事件(
agent/session-start+agent/pre-step)+createUserMessage(dsh-llm)+ schemastery Config + dsh-settingsinstallSection(可选服务,缺失时按组合配置照常工作)。不依赖任何其他功能插件。
配置
| 字段 | 默认 | 说明 |
|---|---|---|
files |
[] |
额外注入的文件(相对会话工作目录或绝对路径) |
scanImports |
true |
扫描 AGENTS.md 等指令文件中的 @import 并递归展开 |
instructionFiles |
["AGENTS.md", "CLAUDE.md"] |
参与扫描的指令文件候选名(只扫描,不重注本体) |
maxDepth |
3 |
@import 递归深度上限 |
maxFileBytes |
65536 |
单文件字节上限(超限截断) |
maxTotalBytes |
131072 |
总字节预算(超限省略) |
injectOn |
全部四项 | 触发注入的会话启动场景(startup / resume / clear / compact) |
template |
"" |
自定义包装模板,{{content}} 标记注入内容位置;留空用语言默认 |
安装
dsh plugin --profile web add dsh-context-imports
装好即用(默认扫描 AGENTS.md/CLAUDE.md 的 @import 并在会话启动时注入被引用文件)。也可从源码构建:
git clone https://github.com/ciskonc/dsh-context-imports.git
cd dsh-context-imports
npm install
DSH_CHECKOUT=<你的 dsh 安装目录> npm run build # host 半 → lib/index.js
npm run build:client # 浏览器半 → lib/client.js
构建产物为标准 DSH 插件包(lib/),装入你的 profile 即可;设置卡片出现在 Settings → Plugins → Plugin configuration。
开发
| 文件 | 职责 |
|---|---|
| src/index.ts | Host 半:session-start 监听、@import 递归展开、预算、注入、settings 命名空间 |
| src/client/index.ts | 浏览器半入口:六语言字典注册 + settings.plugin.item keyed slot 卡片 |
| src/client/form.ts | 精简 CardForm(官方实现移植,修正数组回读比较) |
| src/client/ContextImportsCard.tsx | 卡片组件(复刻官方 PluginCard 结构与 CSS 变量) |
client 插件两条铁律(真实踩坑沉淀,违者炸宿主):
__ModuleLoader__.load({ id })的id必须逐字等于 package.json 的name——差一个 scope 前缀 loader 就按"未注册"处理;inject只声明 shell 模块表(staticModules 种子)里真实存在的模块——已从模块表删除的包(如@deepseek-ai/dsh-client-runtime)声明了就崩。