dsh-plugin-prompt-tool 0.1.3 → 0.1.4

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/lib/index.mjs CHANGED
@@ -177,7 +177,6 @@ async function readBridgeBody(req) {
177
177
  return;
178
178
  }
179
179
  }
180
- /** 自建 loopback settings bridge:替代 registerConfigurableProviders,避免模型设置区出现插件条目。 */
181
180
  /** dsh-tui 暴露的布尔开关:键名与 settings 路径一致。 */
182
181
  const TUI_BOOLEAN_SWITCHES = [
183
182
  ["writeAgents", "写入常驻规则 AGENTS.md"],
@@ -212,7 +211,7 @@ function parseTuiBoolean(token, current) {
212
211
  /** 通过 DSH 命令注册表暴露 /prompt-tool,Web 与 dsh-tui 都能执行。 */
213
212
  function registerTuiCommand(ctx, getSource) {
214
213
  ctx.inject(["settings"], (sctx) => {
215
- sctx.commands.register({
214
+ return sctx.commands.register({
216
215
  name: "prompt-tool",
217
216
  description: "提示词工具:查看或切换本插件开关",
218
217
  input: { hint: "status | on/off/toggle <开关> | skill <目录名> on/off" },
@@ -271,6 +270,7 @@ ${renderTuiStatus(getSource())}`
271
270
  });
272
271
  });
273
272
  }
273
+ /** 自建 loopback settings bridge:替代 registerConfigurableProviders,避免模型设置区出现插件条目。 */
274
274
  function registerSettingsBridge(ctx) {
275
275
  ctx.inject(["settings"], (sctx) => {
276
276
  sctx.effect(() => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-plugin-prompt-tool",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
4
4
  "description": "DSH 插件:提示词工具,规范模型的思维链与回答内容,提供 Web UI 编辑 preset.md 与 AGENTS.md,并按 skills 目录注册可开关技能。",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -1,437 +0,0 @@
1
- # dsh-anchored-standard
2
-
3
- [中文说明](./README.zh-CN.md)
4
-
5
- Experimental DeepSeek Harness agent presets — one base mode plus two variants
6
- — that anchor a session's first model request on the Minimal condition
7
- (real Minimal tool schema, no auto-injected context), then promote to a small
8
- resident catalog once the session is durable, unlocking heavier Standard tools
9
- on demand.
10
-
11
- This is a community project. It is not an official DeepSeek preset and is not
12
- affiliated with or endorsed by DeepSeek.
13
-
14
- Welcome to submit feedback on the plugin in the form of Issues or PRs. For ideas for new plugins or useful findings, please submit them under the [repository](https://github.com/0liveiraaa/DeepseekCotexplorations).
15
-
16
- ## Modes at a glance
17
-
18
- | Mode | Directory | First model request | Anchor mechanism | Promotion signal | Cost |
19
- |---|---|---|---|---|---|
20
- | Anchored Standard | `preset/` | 2 tools (the Minimal pair) | Minimal tool schema | first durable `tool/call` **or** `assistant/message` (`promoteOn: either`) | none |
21
- | Zero-Anchored Standard | `zero-anchored-standard/` | 0 tools | one fixed anchor turn | the anchor reply (`assistant/message`) | +1 model call |
22
- | Whoami Standard | `whoami-standard/` | 0 tools | one "你是谁" self-introduction turn | the self-introduction reply (`assistant/message`) | +1 model call |
23
-
24
- Every mode directory is self-contained and installs alone under whatever id
25
- you copy it to (see [Install](#install)).
26
-
27
- ## Terminology
28
-
29
- - **trajectory** — the style of the model's first reasoning chain. The
30
- Minimal condition produces "We need…" first lines; the Standard condition
31
- produces "Let me…" ("standard-like") first lines.
32
- - **anchor** — the first-request conditions that select the trajectory. Issue
33
- #11 isolated three levers: the tool schema, the output budget, and the
34
- injected reminders.
35
- - **bootstrap phase** — request #1 of a session: the bootstrap tool pair, no
36
- auto-injected context, optional output cap.
37
- - **promotion** — the durable session event that ends the bootstrap phase.
38
- Base mode: first `tool/call` or `assistant/message`, whichever comes first.
39
- Variants: the anchor reply.
40
- - **durable** — recorded in the session event log. Phase state is derived
41
- from durable events, so resume and reload preserve it.
42
- - **resident catalog** — the promoted tool set: the bootstrap pair plus the
43
- discovery tools plus every tool the model explicitly unlocked.
44
- - **discovery tools** — `dev_tool_search`, `skill_search`, `skill_load`: the
45
- on-demand unlock surface for heavier Standard tools.
46
- - **materialized copy** — the committed copy of a `shared/` plugin inside a
47
- mode directory, generated by `npm run sync`.
48
-
49
- ## How it works
50
-
51
- The base mode in one request lifecycle (the variants change only the first
52
- turn — see their sections):
53
-
54
- ```
55
- user's first message
56
-
57
-
58
- ┌ request #1 ─ bootstrap phase ──────────────────────────────┐
59
- │ tools : bash + str_replace_editor (Minimal's real pair) │
60
- │ context : no AGENTS.md digest, no skill-catalog reminder │
61
- │ budget : adapter default (`bootstrapMaxTokens` optional) │
62
- └─────────────────────────────────────────────────────────────┘
63
- │ first durable tool/call OR assistant/message
64
- ▼ PROMOTION — derived from durable events, resume-safe
65
- ┌ request #2+ ─ resident phase ──────────────────────────────┐
66
- │ tools : bootstrap pair + discovery tools + unlocked │
67
- │ context : standard injections restored │
68
- │ budget : adapter default (a cap is stripped on promote) │
69
- └─────────────────────────────────────────────────────────────┘
70
- ```
71
-
72
- Three first-request levers decide the trajectory (issue #11):
73
-
74
- 1. **Tool schema** — the decisive variable at the adapter-default maxTokens
75
- (256000). The real Minimal pair anchored 5/5; every standard-family schema
76
- fell standard-like 11/11.
77
- 2. **Output budget** — a 1024 first-request cap also anchored the trajectory
78
- (26/32), independent of the tool descriptions. The base mode leaves this
79
- lever unset (`bootstrapMaxTokens` is opt-in).
80
- 3. **Injected reminders** — the AGENTS.md/CLAUDE.md digest and the
81
- available-skills reminder. With the skill catalog present the anchor did
82
- not reproduce at all (0/9); both are stripped during bootstrap.
83
-
84
- ## Why
85
-
86
- DeepSeek V4 Pro conditions strongly on the API-visible tool catalog. In the
87
- Project2 evaluation, Standard and PTC produced scores of 91 and 92, while the
88
- official Minimal preset produced 99 and 96. Permanently staying on Minimal,
89
- however, gives up the Standard preset's broader tool set.
90
-
91
- Anchored Standard separates initial trajectory selection from later tool use:
92
-
93
- 1. Keep the Minimal complete system prompt.
94
- 2. Expose the Minimal preset's REAL tool schemas — persistent `bash` +
95
- `str_replace_editor`, byte-identical to the official Minimal composition —
96
- on the first model request (lever 1 above).
97
- 3. Strip the auto-injected context on that first request as well — the
98
- AGENTS.md/CLAUDE.md workspace digest and the available-skills reminder that
99
- true Minimal never mounts (`suppressedContextSources` in the
100
- `tool-bootstrap` row; lever 3). User-initiated skill gestures are not
101
- filtered, and both injections return unchanged from request #2 on.
102
- 4. After the session records its first durable promotion signal — a `tool/call`
103
- or the first `assistant/message`, whichever comes first — promote to the
104
- RESIDENT catalog: the bootstrap pair plus the discovery tools plus whatever
105
- the model has explicitly unlocked via `dev_tool_search`. Dumping the full
106
- Standard catalog at promotion pulled the trajectory back to standard-like
107
- behavior (the post-promotion regression), so heavier tools — `web_search`,
108
- `subagent`, `workflow`, … — stay one `dev_tool_search` call away. Request
109
- #1 always sees the bootstrap catalog; request #2 always sees the resident
110
- catalog, so a text-only first reply can no longer trap the session in
111
- bootstrap. (`promoteOn` in the `tool-bootstrap` row selects the trigger:
112
- `either` default, `tool-call`, or `assistant-message`.)
113
- 5. Derive the phase from durable session events so resume and reload preserve it.
114
-
115
- The bootstrap catalog is the same on every platform: the Minimal pair
116
- (`bash`/`str_replace_editor`). The preset's shell is the persistent PTY bash
117
- (the sandboxed Standard `bash` row is disabled — both register the `bash` name
118
- into the same layer, and the tools registry rejects duplicates; Windows never
119
- had the sandboxed bash anyway). `pwsh` remains available in the promoted
120
- catalog on Windows.
121
-
122
- ## Results
123
-
124
- Project2 V4.1b, DeepSeek V4 Pro, `reasoningEffort=max`, Windows native:
125
-
126
- | Run | Ability | Reasoning blocks | `we` | `let's` | `let me` | Visible replies |
127
- |---|---:|---:|---:|---:|---:|---:|
128
- | r1 | 98 | 193 | 179 | 88 | 1 | 1 |
129
- | r2 | 99 | 162 | 165 | 98 | 0 | 1 |
130
-
131
- Both runs emitted exactly two tool-catalog snapshots: the two-tool Minimal
132
- bootstrap, followed by the 25-tool Standard catalog (these runs predate the
133
- post-promotion narrowing to the resident set — see [How it works](#how-it-works)).
134
- The result is reproducible evidence for this task, not a claim of universal
135
- improvement across models or workloads.
136
-
137
- Cross-version evidence (issue #11, Windows + official endpoint, first-request
138
- trajectory only): at the adapter-default maxTokens the Minimal tool schema
139
- anchored 5/5 (`We need modify…` first lines, `we` 1.4, `let me` 0.0), while
140
- pwsh/read, pwsh-only, and sandboxed bash/read all produced standard-like
141
- first lines 11/11 — the tool schema, not the output cap, is the decisive
142
- first-request variable at 256000.
143
-
144
- Full methodology and aggregate evidence are in
145
- [`xiaobright/modeltest`](https://github.com/xiaobright/modeltest).
146
-
147
- ## Configuration reference
148
-
149
- All knobs are rows in each mode's `agent.cordis.yml`. Unknown keys fail at
150
- preset mount.
151
-
152
- `tool-bootstrap` (in `preset/agent.cordis.yml`; the row must stay FIRST —
153
- waterfall registration order decides the first-request strip):
154
-
155
- | Key | Default | Meaning |
156
- |---|---|---|
157
- | `bootstrapTools` | `[bash, str_replace_editor]` | Tools visible on request #1. |
158
- | `promoteOn` | `either` | Promotion trigger: `either`, `tool-call`, or `assistant-message`. |
159
- | `bootstrapMaxTokens` | unset | Optional output cap for request #1; stripped after promotion. |
160
- | `suppressedContextSources` | `[agent-instructions, skill-catalog]` | `source.kind` values stripped during bootstrap; `[]` disables the filter. |
161
- | `compactionTools` | `[]` | Extra tools available between a compaction boundary and re-promotion. |
162
-
163
- `zero-tool-bootstrap` (in `zero-anchored-standard/` and `whoami-standard/`):
164
- `suppressedContextSources` and `compactionTools` have the same semantics
165
- (promotion is always the first `assistant/message`), plus
166
- `includeSubagents` — whether subagents also take the anchor phase (set `true`
167
- in `whoami-standard`, `false` in `zero-anchored-standard`).
168
-
169
- `anchor-turn` (in both variants): `text` — the synthetic first user message
170
- (default "This round is a test. Tools are not open yet; all tools will open
171
- next round." in zero-anchored, "你是谁" in whoami); `includeSubagents` —
172
- whether subagents also take the anchor turn.
173
-
174
- `instruction-hint` (all modes): `promoteOn` matching the mode's promotion
175
- semantics (`either` in the base mode, `assistant-message` in the variants) —
176
- the one-shot "instruction files exist, read them before acting" hint waits
177
- for promotion.
178
-
179
- ## Repository layout
180
-
181
- ```
182
- preset/ Anchored Standard — the base mode
183
- zero-anchored-standard/ variant: fixed zero-tool anchor turn
184
- whoami-standard/ variant: "你是谁" anchor turn, subagents inherit
185
- shared/ single source of truth for plugins used by 2+ modes
186
- scripts/sync-modes.mjs materializes shared/ plugins into every mode dir
187
- test/ zero-dependency test suite (npm test)
188
- verify/ one-shot headless verification runner
189
- ```
190
-
191
- Invariants, enforced by `npm run check`:
192
-
193
- - Every mode directory is self-contained: installable by copying it alone;
194
- `agent.cordis.yml` rows may reference only `./local.mjs` files, never `../`.
195
- - Plugins shared by several modes live once in `shared/`; the copies in mode
196
- directories are generated. Edit `shared/`, run `npm run sync`, commit both —
197
- never edit a materialized copy.
198
- - The `tool-bootstrap` row stays the FIRST row of `preset/agent.cordis.yml`.
199
-
200
- This repository deliberately ships no AGENTS.md/CLAUDE.md: the presets' whole
201
- mechanism is a clean request #1, stripping exactly those instruction-file
202
- digests from it (issue #6: 0/9 anchored with the injection present). Shipping
203
- one would only feed later rounds and contradict the mechanism being
204
- documented. Everything an assistant needs is in this README.
205
-
206
- ## Compatibility
207
-
208
- Developed and tested against:
209
-
210
- - DeepSeek Harness `0.1.0-rc.5`
211
- - repository commit [`47f9438`](https://github.com/deepseek-ai/deepseek-harness/tree/47f943859bef60e4160492346772ded9b24f765a)
212
- - Node.js 24 on Windows
213
-
214
- On the `0.1.0-rc.5` source checkout, `bootstrapMaxTokens` reaches the actual
215
- first request (the first `request/header` records the cap, `adapterDefaults`
216
- stays empty), because `llm.prepareCall` only materializes a default maxTokens
217
- when the proposed config has none. One prebuilt profile package observed in
218
- issue #11 (CLI launcher reporting `0.1.0-rc.6`) overwrote the proposed cap
219
- with `adapterDefaults.maxTokens`; there the cap is a no-op. The default
220
- composition therefore relies on the Minimal tool schema alone (which anchors
221
- at the adapter default with no cap) and leaves `bootstrapMaxTokens` as an
222
- opt-in for standard-schema bootstraps.
223
-
224
- DeepSeek Harness is currently a developer preview and explicitly permits
225
- breaking changes. This preset is a full snapshot of the Standard composition,
226
- so review upstream changes before using it with a newer release.
227
-
228
- ## Install
229
-
230
- Clone this repository, then copy the entire `preset` directory into the user
231
- preset root under the id `anchored-standard`. Every mode directory in this
232
- repository is self-contained: the `zero-anchored-standard/` and
233
- `whoami-standard/` variants install the same way, alone or together, with no
234
- other directory required (see their sections below).
235
-
236
- PowerShell:
237
-
238
- ```powershell
239
- $target = Join-Path $env:USERPROFILE '.dsh\.agent-presets\anchored-standard'
240
- if (Test-Path -LiteralPath $target) { throw "Preset already exists: $target" }
241
- New-Item -ItemType Directory -Force -Path (Split-Path -Parent $target) | Out-Null
242
- Copy-Item -Recurse -LiteralPath '.\preset' -Destination $target
243
- ```
244
-
245
- Linux/macOS:
246
-
247
- ```sh
248
- dsh_home="${DSH_HOME:-$HOME/.dsh}"
249
- mkdir -p "$dsh_home/.agent-presets"
250
- test ! -e "$dsh_home/.agent-presets/anchored-standard"
251
- cp -R preset "$dsh_home/.agent-presets/anchored-standard"
252
- ```
253
-
254
- Fully restart DeepSeek Harness, create a blank session, and select
255
- **Anchored Standard (experimental)**. Do not switch an active session from a
256
- different preset.
257
-
258
- ## Verify
259
-
260
- Export the session JSONL and inspect `request/header` events. Reproduction
261
- checklist (issue #11 asks for the first two explicitly, because both are the
262
- variables that decide the anchor):
263
-
264
- - **First-request `config.maxTokens` value**: with `bootstrapMaxTokens` unset
265
- (the default), the first header records the adapter default (e.g. 256000
266
- with `adapterDefaults.maxTokens: true`); with a cap configured it records
267
- the cap (e.g. 1024 with no maxTokens adapterDefault).
268
- - **First-request tool schema source**: the first header's `tools` array must
269
- be exactly `["bash", "str_replace_editor"]` — the official Minimal preset's
270
- real schemas, not Standard's `pwsh`/`read`.
271
- - the first request's messages should contain no AGENTS.md/CLAUDE.md digest and
272
- no available-skills reminder — only the user message and the minimal persona
273
- system prompt;
274
- - after the first tool call or the first assistant reply, the next changed
275
- header should contain the promoted resident catalog: the bootstrap pair plus
276
- `dev_tool_search`/`skill_search`/`skill_load` plus any tools the model
277
- already unlocked;
278
- - subsequent requests should keep that resident set (it grows only through
279
- explicit `dev_tool_search` unlocks) and restore the standard context
280
- injections.
281
-
282
- Run the local zero-dependency tests with:
283
-
284
- ```sh
285
- npm test
286
- ```
287
-
288
- ## Important behavior
289
-
290
- - With the default `promoteOn: either`, the session promotes after its first
291
- durable `tool/call` OR its first `assistant/message`, whichever comes first —
292
- request #1 sees the bootstrap catalog and every later request sees the
293
- resident catalog. A text-only first reply therefore still promotes at
294
- request #2; set `promoteOn: tool-call` to restore the original behavior,
295
- where a first response that makes no tool call never promotes.
296
- - A failed tool execution still promotes the session because the durable
297
- `tool/call` already exists.
298
- - The first request's output budget is NOT capped by default: the Minimal tool
299
- schema anchors at the adapter-default maxTokens, so `bootstrapMaxTokens` is
300
- opt-in. When set, the first request is capped and the cap is explicitly
301
- stripped after promotion (the next request's seed proposal carries the
302
- previous header's maxTokens forward).
303
- - The promoted catalog is the RESIDENT set — the bootstrap pair plus the
304
- discovery tools plus everything the model unlocked via `dev_tool_search` —
305
- not the full Standard dump. The Standard sandboxed `bash` row stays disabled
306
- in favor of the persistent shell (same tool name, same layer; see Why). When
307
- unlocked, the `read`/`write`/`edit` tools keep the sandboxed filesystem while
308
- `str_replace_editor` uses the preset's local fs.
309
- - A missing bootstrap tool degrades to the full catalog with a one-time
310
- warning instead of failing requests, so a composition drift cannot brick a
311
- session; invalid `promoteOn` values fail at preset mount instead.
312
- - Promotion decisions are memoized per session for the process lifetime; the
313
- durable event scan runs once per session per process.
314
- - While a session is unpromoted, the pre-step filter strips messages whose
315
- `source.kind` is listed in `suppressedContextSources` (default:
316
- `agent-instructions` and `skill-catalog`, the two automatic injections
317
- Standard adds over Minimal). Set the list to `[]` to disable the context
318
- filter; add other `source.kind` values to suppress more. A filter failure
319
- degrades to keeping every message rather than eating context.
320
- - The tool catalog changes at promotion and again whenever `dev_tool_search`
321
- unlocks a new tool; request-prefix cache continuity breaks at those points.
322
- - The preset has the same trust level as shell access. Review its files before
323
- installation.
324
- - The plugin performs no network requests and adds no telemetry.
325
-
326
- ## Zero-Anchored Standard (experimental)
327
-
328
- An extra test mode that does not change the Anchored Standard logic above. It
329
- uses the same Minimal-aligned system prompt, but instead of exposing two tools
330
- on the first request it injects one fixed zero-tool anchor turn:
331
-
332
- 1. When the user sends their first message, the `anchor-turn` plugin prepends a
333
- fixed user message — "This round is a test. Tools are not open yet; all
334
- tools will open next round." — ahead of it.
335
- 2. The first real model request carries ZERO tools, so the session's first
336
- reasoning chain follows the zero-injection "we" trajectory.
337
- 3. Once that anchor response is durable, the resident catalog is exposed
338
- and the real message proceeds with it.
339
-
340
- Anchoring on the first message — not on session creation — keeps the
341
- blank-session preset switcher usable. Subagents always see the resident
342
- catalog.
343
-
344
- Measured behavior (opencode-go, DeepSeek V4 Pro, `reasoningEffort=max`): the
345
- anchor request is stable "we"-style with zero `let me`; the following
346
- tool-bearing requests return to the "The user wants…/Let me" style. This mode
347
- is a comparison point for whether the zero-tool first turn is worth the extra
348
- model call — not a claim that tool rounds stay "we"-style.
349
-
350
- Install as a separate preset id:
351
-
352
- ```sh
353
- dsh_home="${DSH_HOME:-$HOME/.dsh}"
354
- mkdir -p "$dsh_home/.agent-presets"
355
- test ! -e "$dsh_home/.agent-presets/zero-anchored-standard"
356
- cp -R zero-anchored-standard "$dsh_home/.agent-presets/zero-anchored-standard"
357
- ```
358
-
359
- Restart DeepSeek Harness, create a blank session, select **Zero-Anchored
360
- Standard (experimental)**, then send your first message.
361
-
362
- ## Whoami Standard (experimental)
363
-
364
- A usability-oriented variant of the zero-tool anchor idea: the first turn is a
365
- natural self-introduction prompt instead of a fixed test message, and the
366
- user's real first message is deferred to the next turn. Whatever the user types
367
- first, the session warms up exactly one round and everything is ready when the
368
- real message is processed:
369
-
370
- 1. When the user sends their first message, the `anchor-turn` plugin prepends a
371
- fixed user message — "你是谁" (who are you) — ahead of it in the `next-turn`
372
- inbox queue.
373
- 2. dsh claims exactly ONE `next-turn` message per turn, so the first model
374
- request sees only the anchor on an EMPTY tool surface and replies with a
375
- self-introduction; that reply is the promotion signal.
376
- 3. The real message is claimed by the NEXT turn, with the promoted resident
377
- catalog (shells, `str_replace_editor`, the discovery tools) already
378
- unlocked — heavier Standard tools are one `dev_tool_search` away.
379
-
380
- The anchor text is configurable via the `anchor-turn` row's `text` option
381
- (default "你是谁"). Anchoring on the first message — not session creation —
382
- keeps the blank-session preset switcher usable.
383
-
384
- ### Full-powered subagents
385
-
386
- Whoami Standard ships with `includeSubagents: true` on both the
387
- `zero-tool-bootstrap` and `anchor-turn` rows, so subagents spawned from a
388
- session inherit the same anchor flow as top-level sessions:
389
-
390
- 1. A newly spawned subagent's first model request sees only the "你是谁"
391
- anchor on an empty tool catalog.
392
- 2. The subagent's self-introduction reply is the promotion signal.
393
- 3. The delegated prompt runs on the next turn with the promoted resident
394
- catalog (shells, `str_replace_editor`, and the discovery tools).
395
-
396
- Set `includeSubagents: false` on both rows to restore the plain behavior,
397
- where subagents start with the resident catalog immediately. Each subagent
398
- costs one extra model call for its anchor turn — a delegation-heavy session
399
- pays it per subagent.
400
-
401
- `zero-anchored-standard` keeps subagents plain by default; enabling the same
402
- flow there means setting `includeSubagents: true` on its `zero-tool-bootstrap`
403
- and `anchor-turn` rows (its anchor text stays the fixed test notice).
404
-
405
- The trade-off of the mode itself is one extra model call per session: the
406
- anchor turn is always taken, even when the first message is urgent.
407
-
408
- The directory is self-contained; install it alone or alongside any other mode.
409
-
410
- Install as a separate preset id:
411
-
412
- ```sh
413
- dsh_home="${DSH_HOME:-$HOME/.dsh}"
414
- mkdir -p "$dsh_home/.agent-presets"
415
- test ! -e "$dsh_home/.agent-presets/whoami-standard"
416
- cp -R whoami-standard "$dsh_home/.agent-presets/whoami-standard"
417
- ```
418
-
419
- Restart DeepSeek Harness, create a blank session, select **Whoami Standard
420
- (experimental)**, then send your first message — the self-introduction round
421
- runs first, and your message is answered with the full tooling on the next
422
- turn.
423
-
424
- ## Official ecosystem guidance
425
-
426
- DeepSeek currently asks community plugin authors to publish plugins in their own
427
- GitHub projects and add the [`dsh-plugin`](https://github.com/topics/dsh-plugin)
428
- repository topic for discovery. The official repository does not currently
429
- accept external pull requests and does not mandate a community repository
430
- template. See the official
431
- [`CONTRIBUTING.md`](https://github.com/deepseek-ai/deepseek-harness/blob/47f943859bef60e4160492346772ded9b24f765a/CONTRIBUTING.md).
432
-
433
- ## License
434
-
435
- MIT. `preset/agent.cordis.yml` is derived from the DeepSeek Harness Standard
436
- preset; the original DeepSeek copyright and MIT notice are retained in
437
- [`NOTICE`](./NOTICE).