@xia-sc/dsh-language-policy 0.0.0-stage → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/LICENSE +21 -0
- package/README.md +145 -2
- package/cordis.patch.yml +20 -0
- package/icon.svg +11 -0
- package/index.js +84 -0
- package/locale/en.json +6 -0
- package/locale/zh.json +6 -0
- package/package.json +53 -4
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 0.1.1 — 2026-11-04
|
|
4
|
+
|
|
5
|
+
- 发布链路改为 GitHub Actions + npm Trusted Publishing(OIDC),发布自动附带 provenance,不再使用长期 npm token。
|
|
6
|
+
- README 增加 npm version / license / publish 徽标。
|
|
7
|
+
- 无运行时代码变化。
|
|
8
|
+
|
|
9
|
+
## 0.1.0 — 2026-11-04
|
|
10
|
+
|
|
11
|
+
- 首个版本:Host-only bundle,通过 `ctx.systemPrompt.section()` 在系统提示词末尾(persona suffix 之后)注入简体中文语言策略。
|
|
12
|
+
- 全局 section,主 agent、Agent Teams teammate、subagent 均生效。
|
|
13
|
+
- 配置:`enabled`(关掉做 A/B 对照)、`text`(覆盖默认文本)。
|
|
14
|
+
- 附带静态冒烟测试(`test/smoke.mjs`)与 A/B 实验工具(`tools/`)。
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 xia-sc
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,146 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @xia-sc/dsh-language-policy
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://www.npmjs.com/package/@xia-sc/dsh-language-policy)
|
|
4
|
+
[](LICENSE)
|
|
5
|
+
[](https://github.com/xia-sc/dsh-language-policy/actions/workflows/publish.yml)
|
|
6
|
+
|
|
7
|
+
一个只做一件事的 **Host-only DSH bundle**:把一条简体中文语言策略钉在系统提示词的**最末尾**,让模型的内部推理(reasoning)和用户回复保持中文。
|
|
8
|
+
|
|
9
|
+
- 零依赖(只用 `systemPrompt` 服务和 Cordis 的 `ctx.effect` 生命周期)
|
|
10
|
+
- 不覆盖任何上游配置,纯追加
|
|
11
|
+
- 全局 section:主 agent、Agent Teams 的 teammate、subagent 都会带上
|
|
12
|
+
|
|
13
|
+
## 为什么需要它
|
|
14
|
+
|
|
15
|
+
中文用户使用 DSH 时,模型内部的思考会周期性地变成英文,`~/.dsh/AGENTS.md` 里写「内部推理一律使用中文」也压不住长会话漂移。根本原因不在规则丢失:
|
|
16
|
+
|
|
17
|
+
1. 系统提示词本身是纯英文的,而且很长(约 7.8K 字符 / 23 段,仅 1 段中文);
|
|
18
|
+
2. `AGENTS.md` 被注入成 **user 角色**的 `<system-reminder>`,框架文案明确写了它只是 guidance,**不覆盖 system/developer/user 指令**;
|
|
19
|
+
3. `AGENTS.md` 只在会话开始注入一次(`baseline: true`),长会话中被稀释到很远的位置;
|
|
20
|
+
4. 模型在「深度排障」类长推理任务里会回归英文训练分布(实测两个排障会话思考中文占比只有 4% / 9%,其余会话 75%–99%)。
|
|
21
|
+
|
|
22
|
+
把同一条策略以 **system 角色、最后一段** 的形式注入,才能在优先级和位置上同时压住这个漂移。
|
|
23
|
+
|
|
24
|
+
## 工作原理
|
|
25
|
+
|
|
26
|
+
插件在 `apply()` 里向 `ctx.systemPrompt` 注册一个 section:
|
|
27
|
+
|
|
28
|
+
| 字段 | 值 | 说明 |
|
|
29
|
+
|---|---|---|
|
|
30
|
+
| `name` | `policy:response-language` | `policy:` 前缀避免与第一方 section 撞名 |
|
|
31
|
+
| `order` | `getSectionOrder('DEPLOYMENT_PERSONA_SUFFIX') + 1` | 跟随上游段落顺序,落在系统提示词最后;取不到时回退 `10201` |
|
|
32
|
+
| `interpolate` | `false` | 策略是纯文本,不参与 `{{变量}}` 插值,避免装配报错 |
|
|
33
|
+
| `text` | 见 `index.js` 的 `DEFAULT_TEXT` | 可用 `config.text` 覆盖 |
|
|
34
|
+
|
|
35
|
+
选择「运行时插件」而不是「patch 里覆盖 `system-prompt` 的 config」的原因:后者要复述 `personaPrefix`,相当于把上游文案复制一份,上游一改就会被旧副本盖回去;本插件只追加,上游怎么改都不受影响。
|
|
36
|
+
|
|
37
|
+
## 安装
|
|
38
|
+
|
|
39
|
+
任选其一(都需要 `plugin_manager`):
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
install_bundle -> target: <本仓库克隆目录的绝对路径> # 本地目录
|
|
43
|
+
install_bundle -> target: @xia-sc/dsh-language-policy # 发布 npm 后
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
本地目录安装时,`plugin_manager` 会把该绝对路径以 `link:` 形式写进 profile 的 `dependencies`,所以仓库目录不要移动或删除。安装会写 profile 的 `package.json`(`dependencies` + `dsh.profile.bundles`)并立即生效。**新开一个会话**即可验证;已存在的会话要等下一轮重新装配系统提示词。
|
|
47
|
+
|
|
48
|
+
## 配置
|
|
49
|
+
|
|
50
|
+
| 字段 | 默认 | 说明 |
|
|
51
|
+
|---|---|---|
|
|
52
|
+
| `enabled` | `true` | `false` 时完全不注册 section,用于 A/B 对照 |
|
|
53
|
+
| `text` | 内置默认文本 | 覆盖默认语言策略文本 |
|
|
54
|
+
|
|
55
|
+
要临时关掉,在 profile 的 bundle 行上加 config(`cordis.patch.yml` 里的注释有示例):
|
|
56
|
+
|
|
57
|
+
```yaml
|
|
58
|
+
- id: dsh-language-policy
|
|
59
|
+
name: '@xia-sc/dsh-language-policy'
|
|
60
|
+
config:
|
|
61
|
+
enabled: false
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## 验证
|
|
65
|
+
|
|
66
|
+
### 静态检查(不启动 DSH)
|
|
67
|
+
|
|
68
|
+
```powershell
|
|
69
|
+
node --check index.js
|
|
70
|
+
node test/smoke.mjs
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
`test/smoke.mjs` 断言:三个导出形态、默认文本关键字、section 名/order/`interpolate`、`enabled` 与 `text` 开关、order 回退、patch 只 `insert` 不 `override`、manifest 的 locale/icon 资源。
|
|
74
|
+
|
|
75
|
+
### 提示词落地检查
|
|
76
|
+
|
|
77
|
+
新会话发一句话,然后解压该会话日志,确认系统提示词里出现了策略文本、且上游 `personaPrefix` 没被动过:
|
|
78
|
+
|
|
79
|
+
```js
|
|
80
|
+
// 用法: node check.mjs %USERPROFILE%\.dsh\sessions\<workspace>\<session-id>\session.v4.jsonl.zstd
|
|
81
|
+
import { readFileSync } from 'node:fs'
|
|
82
|
+
import { zstdDecompressSync } from 'node:zlib'
|
|
83
|
+
|
|
84
|
+
const magic = Buffer.from([0x28, 0xb5, 0x2f, 0xfd])
|
|
85
|
+
const buf = readFileSync(process.argv[2])
|
|
86
|
+
let text = ''
|
|
87
|
+
let off = 0
|
|
88
|
+
for (;;) {
|
|
89
|
+
const idx = buf.indexOf(magic, off)
|
|
90
|
+
if (idx < 0) break
|
|
91
|
+
try { text += zstdDecompressSync(buf.subarray(idx)).toString('utf8') } catch {}
|
|
92
|
+
off = idx + 4
|
|
93
|
+
}
|
|
94
|
+
const recs = text.split('\n').filter(Boolean).map((line) => JSON.parse(line))
|
|
95
|
+
const sys = recs.find((record) => record.type === 'system/message')
|
|
96
|
+
const prompt = sys?.data?.message?.content?.[0]?.text ?? ''
|
|
97
|
+
console.log({
|
|
98
|
+
hasPolicy: prompt.includes('语言策略'),
|
|
99
|
+
hasPersona: prompt.includes('You are a coding agent powered by'),
|
|
100
|
+
length: prompt.length,
|
|
101
|
+
})
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### 验证记录(2026-11-04,DSH desktop 0.2.1-rc.5)
|
|
105
|
+
|
|
106
|
+
本地目录安装后,当前会话的下一轮请求重新装配了系统提示词(会话日志 `system/message` 实测):
|
|
107
|
+
|
|
108
|
+
| 记录 | 字符数 | 含策略 | 含上游 persona |
|
|
109
|
+
|---|---|---|---|
|
|
110
|
+
| 安装前(会话开始) | 7785 | 否 | 是 |
|
|
111
|
+
| 安装后 | 7974 | 是 | 是 |
|
|
112
|
+
|
|
113
|
+
7974 − 7785 = 189 = 策略文本 187 字符 + 段落分隔符 2 字符:上游提示词逐字未变,只追加了本段。策略位于 23 个 section 之后;其后只有 DSH 自身的 runtime-context 快照(当前环境、MCP 等),该快照按架构总是排在最后。
|
|
114
|
+
|
|
115
|
+
### 效果对照(A/B):实测结果
|
|
116
|
+
|
|
117
|
+
2026-11-04 在本机 desktop 0.2.1-rc.5 上做了 2 组 × 3 样本对照。按需求把原计划的「方案 A」换成「只靠 AGENTS.md」,两组唯一差异是系统提示词里那 189 字符的策略段(6121 − 5932),题目、模型、AGENTS.md 基线、宿主全部相同:
|
|
118
|
+
|
|
119
|
+
| 组 | 三次样本中文占比 | 均值 | 极差 |
|
|
120
|
+
|---|---|---|---|
|
|
121
|
+
| 仅 AGENTS.md | 79.2% / 74.3% / 49.2% | 67.5% | 30.0pp |
|
|
122
|
+
| AGENTS.md + 插件 | 77.6% / 77.6% / 76.3% | 77.2% | 1.3pp |
|
|
123
|
+
|
|
124
|
+
结论:AGENTS.md 本身有效(两次都在 74–79%),但长推理会出现英文漂移(一次掉到 49.2%);插件把占比稳定在 76–78% 的窄带内,主要收益是**压低漂移的尾部风险**,而不是把均值从 0 拉到 100。n=3 属小样本,不构成统计显著性结论。完整方法、统计口径、会话 id 与复现命令见 [tools/experiment-report.md](tools/experiment-report.md)。
|
|
125
|
+
|
|
126
|
+
## 边界
|
|
127
|
+
|
|
128
|
+
- **不承诺 100% 中文思考**:长推理仍可能漂移,提示词只能提高概率。
|
|
129
|
+
- 压缩摘要的英文指令硬编码在上游(`compaction-basic` 的 summarizer),插件改不了。
|
|
130
|
+
- `locale: zh` 只影响界面,不影响模型提示词;本插件补的就是这一块。
|
|
131
|
+
|
|
132
|
+
## 文件
|
|
133
|
+
|
|
134
|
+
| 文件 | 作用 |
|
|
135
|
+
|---|---|
|
|
136
|
+
| `index.js` | 插件本体(`name` / `inject` / `apply`) |
|
|
137
|
+
| `cordis.patch.yml` | 只 `insert` 一行插件行 |
|
|
138
|
+
| `locale/{en,zh}.json` | Plugin Manager / Settings 显示用的标题与描述 |
|
|
139
|
+
| `icon.svg` | 插件面板图标(原创) |
|
|
140
|
+
| `test/smoke.mjs` | 静态冒烟检查 |
|
|
141
|
+
| `CHANGELOG.md` | 变更记录 |
|
|
142
|
+
| `tools/` | 实验与验证脚本(不进 npm 包):reasoning 中文占比统计、会话日志检查、实验题目与报告 |
|
|
143
|
+
|
|
144
|
+
## License
|
|
145
|
+
|
|
146
|
+
MIT
|
package/cordis.patch.yml
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# ============================================================================
|
|
2
|
+
# @xia-sc/dsh-language-policy —— DSH bundle patch
|
|
3
|
+
# ============================================================================
|
|
4
|
+
# 只插入一行插件,不覆盖任何上游行(尤其不碰 system-prompt 的 config),
|
|
5
|
+
# 因此不会与上游的 personaPrefix / personaSuffix 失配。
|
|
6
|
+
#
|
|
7
|
+
# 安装:
|
|
8
|
+
# plugin_manager -> install_bundle -> target: <本目录绝对路径> (本地目录)
|
|
9
|
+
# plugin_manager -> install_bundle -> target: @xia-sc/dsh-language-policy (npm 包)
|
|
10
|
+
#
|
|
11
|
+
# 只想临时关闭对照时(不卸载),给该行加 config:
|
|
12
|
+
# - id: dsh-language-policy
|
|
13
|
+
# name: '@xia-sc/dsh-language-policy'
|
|
14
|
+
# config:
|
|
15
|
+
# enabled: false
|
|
16
|
+
# ============================================================================
|
|
17
|
+
|
|
18
|
+
- insert:
|
|
19
|
+
- id: dsh-language-policy
|
|
20
|
+
name: '@xia-sc/dsh-language-policy'
|
package/icon.svg
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="Language policy">
|
|
2
|
+
<defs>
|
|
3
|
+
<linearGradient id="bg" x1="0" y1="0" x2="1" y2="1">
|
|
4
|
+
<stop offset="0" stop-color="#2563eb"/>
|
|
5
|
+
<stop offset="1" stop-color="#7c3aed"/>
|
|
6
|
+
</linearGradient>
|
|
7
|
+
</defs>
|
|
8
|
+
<rect width="64" height="64" rx="16" fill="url(#bg)"/>
|
|
9
|
+
<path d="M16 14h32a4 4 0 0 1 4 4v18a4 4 0 0 1-4 4H32l-10 8v-8h-6a4 4 0 0 1-4-4V18a4 4 0 0 1 4-4z" fill="#ffffff" opacity="0.18"/>
|
|
10
|
+
<text x="32" y="40" text-anchor="middle" font-family="Segoe UI, 'Microsoft YaHei', sans-serif" font-size="30" font-weight="600" fill="#ffffff">中</text>
|
|
11
|
+
</svg>
|
package/index.js
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @xia-sc/dsh-language-policy — Host half.
|
|
3
|
+
*
|
|
4
|
+
* Registers one extra system-prompt section right after the deployment persona
|
|
5
|
+
* suffix, pinning a Simplified-Chinese reasoning/response policy at the very end
|
|
6
|
+
* of the assembled system prompt. Zero dependencies: only the `systemPrompt`
|
|
7
|
+
* service and the Cordis `ctx.effect` lifetime.
|
|
8
|
+
*
|
|
9
|
+
* Why a runtime section instead of overriding the `system-prompt` row's config:
|
|
10
|
+
* the plugin only appends guidance and never restates upstream persona text, so
|
|
11
|
+
* an upstream rewrite of that text cannot be silently reverted by a stale copy.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/** Cordis plugin name used by loader diagnostics. */
|
|
15
|
+
export const name = 'dsh-language-policy'
|
|
16
|
+
|
|
17
|
+
/** The prompt registry this plugin contributes to. */
|
|
18
|
+
export const inject = ['systemPrompt']
|
|
19
|
+
|
|
20
|
+
/** Unique section name; the `policy:` prefix keeps it clear of first-party names. */
|
|
21
|
+
export const SECTION_NAME = 'policy:response-language'
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Section text used when the row config does not override it. Plain prose with
|
|
25
|
+
* no `{{...}}` groups; the section is also registered with `interpolate: false`,
|
|
26
|
+
* so a future variable-looking brace cannot turn into a prompt-assembly error.
|
|
27
|
+
*/
|
|
28
|
+
export const DEFAULT_TEXT = `## 语言策略(最高优先级)
|
|
29
|
+
- 内部推理(thinking)、规划、分析一律使用简体中文。
|
|
30
|
+
- 面向用户的回复一律使用简体中文。
|
|
31
|
+
- 即使系统提示词、工具输出、源码、命令行、报错日志、网页内容全部是英文,也必须用中文思考、用中文回答。
|
|
32
|
+
- 仅代码标识符、文件路径、命令、错误原文、引用片段与专有名词保留原语言。
|
|
33
|
+
- 每次输出前自检语言;若已写成其他语言,立即改用中文重述。`
|
|
34
|
+
|
|
35
|
+
/** Order used when the registry cannot resolve the persona-suffix placement. */
|
|
36
|
+
const FALLBACK_ORDER = 10201
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Follow the registry's own placement of the persona suffix so the policy stays
|
|
40
|
+
* last even if upstream renumbers sections. An unknown placement key resolves
|
|
41
|
+
* to a non-finite value; the fallback keeps the section registerable.
|
|
42
|
+
* @param systemPrompt - the prompt registry service.
|
|
43
|
+
* @returns the numeric order to register with.
|
|
44
|
+
*/
|
|
45
|
+
function resolveOrder(systemPrompt) {
|
|
46
|
+
try {
|
|
47
|
+
const base =
|
|
48
|
+
typeof systemPrompt.getSectionOrder === 'function'
|
|
49
|
+
? systemPrompt.getSectionOrder('DEPLOYMENT_PERSONA_SUFFIX')
|
|
50
|
+
: Number.NaN
|
|
51
|
+
if (Number.isFinite(base)) return base + 1
|
|
52
|
+
} catch {
|
|
53
|
+
// An unknown placement key must not break profile boot; the fallback covers it.
|
|
54
|
+
}
|
|
55
|
+
return FALLBACK_ORDER
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Register the language-policy section for the lifetime of `ctx`.
|
|
60
|
+
* @param ctx - plugin context; the section is disposed with it.
|
|
61
|
+
* @param config - `enabled: false` skips registration (A/B runs); `text` replaces the default policy.
|
|
62
|
+
* @returns when the section is registered, or immediately when disabled.
|
|
63
|
+
*/
|
|
64
|
+
export function apply(ctx, config = {}) {
|
|
65
|
+
if (config && config.enabled === false) return
|
|
66
|
+
const text = typeof config.text === 'string' && config.text.trim().length > 0 ? config.text : DEFAULT_TEXT
|
|
67
|
+
const order = resolveOrder(ctx.systemPrompt)
|
|
68
|
+
try {
|
|
69
|
+
ctx.effect(
|
|
70
|
+
() =>
|
|
71
|
+
ctx.systemPrompt.section({
|
|
72
|
+
name: SECTION_NAME,
|
|
73
|
+
order,
|
|
74
|
+
// Preserve the text literally: the policy is prose, not a template.
|
|
75
|
+
interpolate: false,
|
|
76
|
+
text,
|
|
77
|
+
}),
|
|
78
|
+
'dsh-language-policy.section()',
|
|
79
|
+
)
|
|
80
|
+
} catch (error) {
|
|
81
|
+
// Guidance is best-effort: a registration failure must not stop the profile from booting.
|
|
82
|
+
console.warn('[dsh-language-policy] section registration failed:', error)
|
|
83
|
+
}
|
|
84
|
+
}
|
package/locale/en.json
ADDED
package/locale/zh.json
ADDED
package/package.json
CHANGED
|
@@ -1,6 +1,55 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xia-sc/dsh-language-policy",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "DSH host-only bundle that pins a Simplified-Chinese reasoning/response policy at the end of the system prompt",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "xia-sc",
|
|
7
|
+
"homepage": "https://github.com/xia-sc/dsh-language-policy#readme",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/xia-sc/dsh-language-policy.git"
|
|
11
|
+
},
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/xia-sc/dsh-language-policy/issues"
|
|
14
|
+
},
|
|
15
|
+
"keywords": [
|
|
16
|
+
"dsh",
|
|
17
|
+
"dsh-plugin",
|
|
18
|
+
"deepseek-harness",
|
|
19
|
+
"language-policy",
|
|
20
|
+
"chinese"
|
|
21
|
+
],
|
|
22
|
+
"type": "module",
|
|
23
|
+
"main": "index.js",
|
|
24
|
+
"exports": {
|
|
25
|
+
".": "./index.js",
|
|
26
|
+
"./package.json": "./package.json",
|
|
27
|
+
"./locale/*.json": "./locale/*.json",
|
|
28
|
+
"./icon": "./icon.svg"
|
|
29
|
+
},
|
|
30
|
+
"files": [
|
|
31
|
+
"index.js",
|
|
32
|
+
"cordis.patch.yml",
|
|
33
|
+
"locale/*.json",
|
|
34
|
+
"icon.svg",
|
|
35
|
+
"README.md",
|
|
36
|
+
"CHANGELOG.md",
|
|
37
|
+
"LICENSE"
|
|
38
|
+
],
|
|
39
|
+
"engines": {
|
|
40
|
+
"dsh": ">=0.2.1-rc.5 <0.3.0-0"
|
|
41
|
+
},
|
|
42
|
+
"scripts": {
|
|
43
|
+
"check": "node --check index.js",
|
|
44
|
+
"test": "node test/smoke.mjs",
|
|
45
|
+
"prepublishOnly": "npm test"
|
|
46
|
+
},
|
|
47
|
+
"publishConfig": {
|
|
48
|
+
"access": "public"
|
|
49
|
+
},
|
|
50
|
+
"dsh": {
|
|
51
|
+
"bundle": {
|
|
52
|
+
"patch": "./cordis.patch.yml"
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|