dsh-plugin-upgrade 0.1.3 → 2.0.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/README.md CHANGED
@@ -4,11 +4,11 @@
4
4
  - **1024 store channel**: `npm i -g dsh1024` once, then `dsh1024 plugin --profile web add dsh-plugin-upgrade` (counts toward the [deepseek1024.com](https://deepseek1024.com) install ranking).
5
5
  [![Gitee](https://img.shields.io/badge/Gitee-mirror-c71d23?logo=gitee)](https://gitee.com/perrylink/dsh-plugin-upgrade)
6
6
 
7
- **Version-locked plugin upgrade skill for DeepSeek Harness — `0.1.3-alpha.1` → `0.1.5-alpha.1`.**
7
+ **Merged, version-locked plugin upgrade skill for DeepSeek Harness — `0.1.3-alpha.1` → `0.1.5-rc.1`, carried as two closed legs.**
8
8
 
9
- *A version card plus a zero-dependency seam scanner, so "typecheck is green" is never mistaken for "the plugin still works".*
9
+ *Leg A `0.1.3-alpha.1` → `0.1.5-alpha.1`, leg B `0.1.5-alpha.1` → `0.1.5-rc.1`: one corridor card plus one zero-dependency seam scanner over the merged 20-seam catalog, so a client half that stopped mounting silently is never mistaken for "typecheck is green".*
10
10
 
11
- > **Official repository.** This is the only official repository of dsh-plugin-upgrade, maintained by PerryLink. Same-name repositories under other accounts are not affiliated.
11
+ > **Official repository.** This is the only official repository of dsh-plugin-upgrade, maintained by PerryLink. It supersedes the two version-locked packages `dsh-plugin-upgrade` (leg A) and `dsh-plugin-upgrade-rc1` (leg B). Same-name repositories under other accounts are not affiliated.
12
12
 
13
13
  [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE)
14
14
  [![DSH plugin](https://img.shields.io/badge/dsh--plugin-✅-green)](https://github.com/topics/dsh-plugin)
@@ -19,7 +19,7 @@
19
19
  [![npm version](https://img.shields.io/npm/v/dsh-plugin-upgrade)](https://www.npmjs.com/package/dsh-plugin-upgrade)
20
20
  [![npm downloads](https://img.shields.io/npm/dm/dsh-plugin-upgrade)](https://www.npmjs.com/package/dsh-plugin-upgrade)
21
21
 
22
- [English](README.md) · [简体中文](README.zh.md) · [Español](README.es.md) · [Português](README.pt.md) · [हिन्दी](README.hi.md)
22
+ [English](README.md) · [简体中文](README-zh.md) · [Español](README-es.md) · [Português](README-pt.md) · [हिन्दी](README-hi.md)
23
23
 
24
24
  </div>
25
25
 
@@ -29,25 +29,29 @@
29
29
 
30
30
  | Surface | Status |
31
31
  |---|---|
32
- | Harness | DeepSeek Harness `0.1.5-rc.1` (checkout `2efea31131`, tag `dsh-v0.1.5-rc.1` = `183f08e9c6dd`). Peer band `@deepseek-ai/dsh-skill >=0.1.2-rc.1 <0.2.0 \|\| >=0.1.5-alpha.1 <0.2.0`, `@deepseek-ai/cordis ^4.0.2`, `@deepseek-ai/schemastery ^3.18.2`. |
32
+ | Harness | DeepSeek Harness `0.1.5-rc.1` (tag `dsh-v0.1.5-rc.1` = `183f08e9c6dd`; leg A→B handoff `dsh-v0.1.5-alpha.1` = `5dda764ed3aa`; corridor start `0.1.3-alpha.1`). Peer band `@deepseek-ai/dsh-skill >=0.1.2-rc.1 <0.2.0 \|\| >=0.1.5-alpha.1 <0.2.0`, `@deepseek-ai/cordis ^4.0.2`, `@deepseek-ai/schemastery ^3.18.2`. |
33
33
  | Node | `^22.19.0 \|\| >=24.0.0` |
34
34
  | Platforms | Anywhere Node runs; the scanner is filesystem-only and platform-neutral |
35
35
  | Model | Text-only models fully supported; the skill is a Markdown body, no tool or vision requirement |
36
- | Scope | **One corridor only**: `0.1.3-alpha.1` → `0.1.5-alpha.1`. It is not a general migration framework. |
36
+ | Scope | **Two closed legs, one span**: leg A `0.1.3-alpha.1` → `0.1.5-alpha.1` plus leg B `0.1.5-alpha.1` → `0.1.5-rc.1`. A corridor never widens: a hop after `0.1.5-rc.1` is a new package. |
37
+ | Legs | Both legs live in this package: leg A keeps the `S1`–`S10` + `M1` seams, leg B keeps `C1`, `C2`, `C4`, `C5`, `H1`–`H4`, `P1` — each with its own evidence, card section, fixtures and rollback path. There is no sibling package to install. |
38
+ | `C3` | Retired: leg B's card spelled the stale-type-line false green `C3`, which is the same defect as leg A's `M1`. The fold is recorded on the card; `--seams C3` matches nothing. |
39
+ | Sibling | Do not mount the retired `dsh-plugin-upgrade` in the same profile: both register the agent skill `plugin-upgrade`, so the second mount collides on the skill name. That package is deprecated on npm and its repository is retired; this package replaces both of its legs. |
37
40
 
38
41
  ## What you get
39
42
 
40
43
  Two halves, one seam catalog:
41
44
 
42
- - **A bundled agent skill (`plugin-upgrade-015`)** — a version card and a fix-and-verify loop. The model loads it only when a task actually needs it; the package contributes no system-prompt paragraph and no tool.
43
- - **A zero-dependency CLI (`dsh-plugin-upgrade-scan`)** — reports `file:line` facts for ten seams measured against 40 real plugin repositories during the 2026-09-09 adaptation wave. Exit `1` on any error-severity hit, so it drops straight into CI.
45
+ - **A bundled agent skill (`plugin-upgrade`)** — the merged corridor card and a fix-and-verify loop. The body first routes the caller to the leg that matches its peer band; the model loads it only when a task actually needs it, and the package contributes no system-prompt paragraph and no tool.
46
+ - **A zero-dependency CLI (`dsh-plugin-upgrade-scan`)** — reports `file:line` facts for the merged twenty seams (`S3`, `S8`, `S9`, `M1`, `S4`, `S5`, `S6`, `S7`, `S2`, `S1`, `S10`, `C1`, `C2`, `P1`, `C4`, `C5`, `H1`, `H2`, `H4`, `H3`) re-read from the harness tag ranges on 2026-09-09 (leg A) and 2026-09-10 (leg B). Exit `1` on any error-severity hit, so it drops straight into CI.
44
47
 
45
- The point is the failure mode the card exists to kill: **a green local gate is not evidence of adaptation.** Two classes of breakage survive `typecheck` + `test`:
48
+ The point is the failure mode this corridor exists to kill: **this span's breakage is mostly silent, from both ends.** The type line can be stale, so the repo compiles against the **old** catalog (seam `M1`), and the bare `conversation` client slot was deleted with no alias while `ctx.slots.inject()` only runs its callback when the declaration exists — so a client half that still targets it stops mounting with no error, no log line and no failed build (seam `C1`). Three classes of breakage survive `typecheck` + `test`:
46
49
 
47
- 1. the published type line hides the seam, and the repo compiles against stale types (seam `M1`);
48
- 2. the tests are mocked against the old shape, so they pass while the host rejects the new one.
50
+ 1. the local gate compiles a stale type line old `paths` alias, or dev/test types pinned at `0.1.5-alpha.*` (seam `M1`);
51
+ 2. a log writer omits the V3 required `stream` field, so the session imports and then refuses to resume (seam `S3`);
52
+ 3. the tests are mocked against the old shape, so they pass while the host drops the contribution (seam `C1`).
49
53
 
50
- Four of the ten seams`S3`, `S8`, `S9`, `M1` were still uncovered by any community upgrade PR when this package was written; the other six are cross-checked against the wave evidence.
54
+ Honest sizing: leg B's workspace sweep found that the family's client halves use only **8** slot keys, all of which survive in rc.1 for them the rc.1 breakage is **latent, not actual**. Third-party client plugins that targeted the bare `conversation` key are the ones that break, and they break quietly. Leg A's sweep found the opposite texture: 40 repos, 11 of them hit `M1`, and fixing the stale path exposed real TypeScript errors in 3 repos that were previously "green".
51
55
 
52
56
  ## Quick start
53
57
 
@@ -62,8 +66,8 @@ dsh --profile web --dump-config | grep -A3 'id: dsh-plugin-upgrade'
62
66
  npx dsh-plugin-upgrade-scan --repo ../my-plugin
63
67
  ```
64
68
 
65
- Then ask the agent to use the `plugin-upgrade-015` skill, or drive the loop yourself with the card at
66
- `skills/plugin-upgrade-015/references/v0.1.3-alpha.1-to-v0.1.5-alpha.1.md`.
69
+ Then ask the agent to use the `plugin-upgrade` skill, or drive the loop yourself with the card at
70
+ `skills/plugin-upgrade/references/v0.1.3-alpha.1-to-v0.1.5-rc.1.md` (leg A is §1, leg B is §2, the merged seam index is §3).
67
71
 
68
72
  ## Install & uninstall
69
73
 
@@ -82,7 +86,7 @@ Every key is optional and lives in the profile patch:
82
86
  | Key | Default | Meaning |
83
87
  |---|---|---|
84
88
  | `enabled` | `true` | Register the packaged skill. Set `false` to keep the dependency mounted but silent. |
85
- | `skillName` | `plugin-upgrade-015` | Directory under `skillsRoot` to register, and the name shown in the catalog. |
89
+ | `skillName` | `plugin-upgrade` | Directory under `skillsRoot` to register, and the name shown in the catalog. |
86
90
  | `skillsRoot` | the package's own `./skills` | Where `<skillName>/SKILL.md` lives. Point it at your own card to reuse the plumbing. |
87
91
  | `userInvocable` | `true` | Whether a human can invoke the skill by name in addition to the model. |
88
92
 
@@ -91,53 +95,67 @@ Every key is optional and lives in the profile patch:
91
95
  - id: dsh-plugin-upgrade
92
96
  name: dsh-plugin-upgrade
93
97
  config:
94
- skillName: plugin-upgrade-015
98
+ skillName: plugin-upgrade
95
99
  ```
96
100
 
97
101
  The plugin mounts loud: a missing `SKILL.md`, an empty body, or a frontmatter without `name` fails the mount instead of registering an empty skill.
98
102
 
99
103
  ## Surfaces
100
104
 
101
- **Skill** — `plugin-upgrade-015` (model- and user-invocable by default). Body: the 6-step loop. References: the version card. Scripts: the detector, shipped inside the skill directory so relative paths resolve.
105
+ **Skill** — `plugin-upgrade` (model- and user-invocable by default). Body: leg routing table, the 8 hard rules and the 6-step loop. References: the merged corridor card. Scripts: the detector, shipped inside the skill directory so relative paths resolve.
102
106
 
103
107
  **CLI** — `dsh-plugin-upgrade-scan`:
104
108
 
105
109
  ```sh
106
- dsh-plugin-upgrade-scan [--repo <path>] [--json <out.json>] [--seams S3,S8,M1] [--quiet]
110
+ dsh-plugin-upgrade-scan [--repo <path>] [--json <out.json>] [--seams S3,C1,P1] [--quiet]
107
111
  ```
108
112
 
109
113
  | Flag | Meaning |
110
114
  |---|---|
111
115
  | `--repo <path>` | Repository to scan (default: cwd). |
112
116
  | `--json <out.json>` | Also write the machine-readable report (`repo`, `scannedAt`, `files`, `hits[]`, `bySeam`). |
113
- | `--seams S3,S8,M1` | Restrict to specific seams. |
117
+ | `--seams S3,C1,P1` | Restrict to specific seams of the merged catalog. |
114
118
  | `--quiet` | Suppress the human rendering (pair with `--json`). |
115
119
 
116
- Exit codes: `0` no error-severity hit · `1` at least one error-severity hit · `2` usage or scan failure. A clean scan is necessary but not sufficient — the card's exit criterion is a real-host smoke on a temporary `DSH_HOME`.
120
+ Exit codes: `0` no error-severity hit · `1` at least one error-severity hit · `2` usage or scan failure. A clean scan is necessary but not sufficient — the exit criterion is a real-host smoke, plus a resume round-trip for log writers (leg A) and a real browser assertion for the client half (leg B).
117
121
 
118
- ## The ten seams
122
+ ## The twenty seams
119
123
 
120
- | Id | Severity | What changed in the `0.1.5-alpha.1` line |
124
+ Order follows the catalog in `lib/scan.mjs` (leg A first, then leg B), which is also the order `test/card.test.mjs` pins the card to.
125
+
126
+ | Id | Severity | What changed on the way to `0.1.5-rc.1` |
121
127
  |---|---|---|
122
- | `S1` | warn | Session format is V3; the log file is generation-scoped (`session.v3.jsonl.zstd`). Hardcoded `session.jsonl.zstd` paths silently stop working. |
123
- | `S2` | warn | `EpochHeader.system` is gone; the system prompt is `system/message` at surface node 0. Readers need a structural fallback. |
124
- | `S3` | error | `assistant/message` requires `stream`; without it the session imports but cannot be resumed (`Session.fromRestore` rejects invalid settlement fields). |
125
- | `S4` | error | `tool/code-dispatch` was renamed `tool/ptc-dispatch`. |
126
- | `S5` | error | `ctx.agent` was removed; callers receive the `Agent` explicitly. |
127
- | `S6` | error | `Inbox` became a type interface it can no longer be constructed; use `agent.inbox` and the official fixture shape. |
128
- | `S7` | warn | `SubprocessHandle.pid` was removed (only `SubprocessTerminalHandle` keeps `pid`). |
129
- | `S8` | error | `SessionHandle.read()` now returns `SessionHandleReadResult` unwrap `.events`. |
130
- | `S9` | error | `SystemPrompt` config `persona` became `personaPrefix` / `personaSuffix`. |
131
- | `M1` | error | A `tsconfig` `paths` alias that points at a missing checkout directory makes TypeScript silently fall back to published types the local gate turns **fake green**. |
132
-
133
- `S7`, `S1`, `S2` and `S10` are deliberately advisory: they have legitimate matches (Node's own `pid`, legacy-generation readers, a plugin's own adaptive event gate), so the scanner reports them as leads for manual review rather than failures.
128
+ | `S3` | error | `assistant/message` gained a required `stream` field (session format V3): a log written without it imports successfully and then refuses to resume (`Session.fromRestore` throws `invalid settlement fields`). |
129
+ | `S8` | error | `SessionHandle.read()` returns `SessionHandleReadResult` (`{ eventState, events }`) instead of the event array; array operations must unwrap `.events`. |
130
+ | `S9` | error | `SystemPrompt`'s config renamed `persona` `personaPrefix` / `personaSuffix`. Substituting `includeHarnessIdentity: false` is **not** equivalent it deletes the harness identity block. |
131
+ | `M1` | error | The local gate compiles a stale type line: dev/test types pinned at `0.1.5-alpha.*`, or a `tsconfig` `paths` alias resolving to a missing checkout directory, makes TypeScript fall back silently to the published types. Green gate, wrong ruler. |
132
+ | `S4` | error | `tool/code-dispatch` was renamed `tool/ptc-dispatch`; the old label is no longer recognized in V3 sessions. |
133
+ | `S5` | error | `ctx.agent` was removed: the caller must pass the Agent explicitly (e.g. the second parameter of `setup(agentCtx, agent)`). |
134
+ | `S6` | error | `Inbox` is a type interface, not a constructable class; fixtures use the official unsupported shape and runtime code reads `agent.inbox`. |
135
+ | `S7` | warn | `SubprocessHandle.pid` was removed (only `SubprocessTerminalHandle.pid` remains); drop the field from test fixtures. |
136
+ | `S2` | warn | `EpochHeader.system` was removed: the system prompt is surface node 0's `system/message` now. |
137
+ | `S1` | warn | Session format V3 and generation-suffixed log names the current generation is `session.v3.jsonl.zstd`, so scripts that hardcode `session.jsonl.zstd` fail silently. |
138
+ | `S10` | warn | Plugin-authored session events must go through the host's fail-closed adaptation gate: `Session.append` has no `ignorable` write channel, so an unconditional append can make a session unreadable. |
139
+ | `C1` | error | The bare client slot `conversation` was deleted and replaced by `main` + `main.conversation`, with **no alias**. `ctx.slots.inject()` only fires when the declaration exists, so a plugin targeting it stops mounting **silently**. |
140
+ | `C2` | error | `@deepseek-ai/dsh-client-ui-sidebar-textpreview` was renamed `…-sidebar-documentpreview`; the old name is gone with no shim package. |
141
+ | `P1` | error | The peer band must keep its second segment: `>=0.1.2-rc.1 <0.2.0` alone **rejects** `0.1.5-rc.1` under npm semver's prerelease-tuple rule (measured `false` on semver 7.8.5). |
142
+ | `C4` | warn | rc.1 added a global main-panel model (`main`, `sidebar.panellist`, `ctx.layout.selectPanel(MainPanelId \| null)`) and appended a `usePanelInfo` standard prop to almost every slot. |
143
+ | `C5` | warn | Document preview moved to the keyed slot `sidebar.right.tab.document` (`DocumentContent`); `sidebar.right.pane.tab` survives but its parent entry became `rightbar.session`. |
144
+ | `H1` | warn | `KNOWN_SESSION_EVENT_TYPES` gained `deliverables/presented` and `subagent/catalog` — the fail-closed vocabulary grew. |
145
+ | `H2` | warn | The new `present` tool's row occupies `tool.call.toolview` key `'present'`, which was free in alpha.1. |
146
+ | `H4` | info | The DeepSeek adapter's default advisory catalog now leads with `deepseek-flash` (DeepSeek-V41-Flash). |
147
+ | `H3` | info | New optional capabilities: `ctx.sessionFeedback`, `ctx.layout.beginNavigation()`, `ctx.workspaces.openSession()` / `openWorkspace()` / `forkSession()`. Listed on the card; deliberately not auto-detected. |
148
+
149
+ `S7`, `S2`, `S1`, `S10`, `C4`, `C5`, `H1`, `H2` and `H4` are deliberately advisory: they have legitimate matches (a repo that already uses the new API, a documentation snapshot, a plugin's own model-id table, a Node `ChildProcess.pid`), so the scanner reports them as leads for manual review rather than failures. `M1` and `P1` are **structured** checks — they resolve `package.json` and `tsconfig*.json` instead of matching text — and `H3` is **card-only**: documented, id-parity checked, and deliberately without a detector (`CARD_ONLY = ['H3']`).
134
150
 
135
151
  ## What this does not cover
136
152
 
137
- - **Other corridors.** `0.1.1` → `0.1.2` and future lines are out of scope; the card is version-locked on purpose, because a card that drifts is worse than no card.
153
+ - **A hop after `0.1.5-rc.1`.** The merged span ends at rc.1 by construction: the harness hop `0.1.5-rc.1` → `0.1.5-rc.2` added no plugin-facing seam (this package's own dev/test pin and CI probe run on the `0.1.5-rc.2` line so the catalog is verified against the newest published types). Anything that adds a seam later is a **new package** — a card that drifts is worse than no card.
154
+ - **The `0.1.1` → `0.1.2` hop.** Use the community convergence skill.
155
+ - **Restating across legs.** Leg A owns the session-format seams (`assistant/message.stream`, `SessionHandleReadResult`, `EpochHeader.system`, `ctx.agent`, `Inbox`, `SystemPrompt.persona`, the V3 log generation) and leg B does not restate them — the whole `packages/core/session/src` diff in leg B's range is two added event-type literals and one comment line. Each leg's card section keeps its own scope statement.
138
156
  - **The DSH user-facing upgrade path.** This package upgrades *plugin source code*, not a user's harness installation.
139
- - **Client/browser behavior.** The scanner is static. A client half still needs a real browser assertion.
140
- - **Proof.** A clean scan is a hypothesis. The exit criterion is a real-host smoke (temp `DSH_HOME`, target CLI, `plugin add <tarball>`, `--dump-config`, plus a resume round-trip for session-log writers).
157
+ - **Theme tokens.** `docs/web-styling.md` has zero changes in leg B's range.
158
+ - **Proof.** A clean scan is a hypothesis. The exit criterion is a real-host smoke (temp `DSH_HOME`, target CLI, `plugin add <tarball>`, `--dump-config`) plus a resume round-trip for session-log writers (leg A) and a real browser assertion for every client-side hit (leg B).
141
159
 
142
160
  ## Security boundaries
143
161
 
@@ -149,23 +167,74 @@ Exit codes: `0` no error-severity hit · `1` at least one error-severity hit ·
149
167
  ## Development
150
168
 
151
169
  ```sh
152
- pnpm install
153
- pnpm test # node --test (real Cordis + real SkillRegistry)
154
- pnpm run verify:self-contained # every import resolves inside the package
155
- pnpm run verify:artifacts # the packed tarball carries the skill, CLI and patch
156
- pnpm run check:readmes # five-language README consistency
157
- pnpm pack
170
+ npm install # or: pnpm install (the repo ships a pnpm-lock.yaml)
171
+ npm test # node --test: scanner, card<->catalog parity, real Cordis + SkillRegistry
172
+ npm run verify:self-contained # every import resolves inside the package
173
+ npm run verify:artifacts # the packed tarball carries the skill, CLI and patch, and excludes tests
174
+ npm run check:readmes # five-language README consistency
175
+ npm pack
158
176
  ```
159
177
 
160
- The scanner has its own synthetic `fixtures/bad-repo` and `fixtures/good-repo` plus a live negative on a repository already adapted by the wave, so a regression in the catalog fails the suite rather than a downstream user.
178
+ The scanner has a synthetic fixture pair **per leg**: `fixtures/leg-a-bad-repo` (leg A's session/config seams, every error seam present on purpose) with `fixtures/leg-a-good-repo` (adapted), and `fixtures/bad-repo` (leg B's client-slot seams) with `fixtures/good-repo` (adapted) — plus a live negative on a family repository already pinned to `0.1.5-rc.1`, so a regression in the catalog fails the suite rather than a downstream user. `test/card.test.mjs` asserts that the merged card index and `lib/scan.mjs` name **exactly** the same twenty seam ids with the same severities, and that `CARD_ONLY` is exactly `['H3']` — the evidence-binding rule as a machine gate.
161
179
 
162
180
  ## Topics
163
181
 
164
- `dsh`, `dsh-plugin`, `deepseek-harness`, `deepseek`, `cordis`, `plugin-upgrade`, `migration`, `skill`, `version-card`, `scanner` (mirror `package.json` keywords; `dsh-plugin` is the ecosystem's visibility channel).
182
+ `dsh`, `dsh-plugin`, `deepseek-harness`, `deepseek`, `cordis`, `plugin-upgrade`, `migration`, `skill`, `version-card`, `scanner`, `client-slots` (mirror `package.json` keywords; `dsh-plugin` is the ecosystem's visibility channel).
165
183
 
166
184
  ## PerryLink DSH Plugin Family
167
185
 
168
- Part of the PerryLink DSH plugin family — 40 repositories covering sessions, memory, permissions, delivery, observability and developer tooling. Browse the catalog at [perrylink-dsh-catalog.perrylink.workers.dev](https://perrylink-dsh-catalog.perrylink.workers.dev) or the [`dsh-plugin` topic](https://github.com/topics/dsh-plugin).
186
+ This project is one of the [40 DeepSeek Harness plugins](https://github.com/PerryLink) maintained by [PerryLink](https://github.com/PerryLink). If this one helps you, the others likely will too:
187
+
188
+ | Plugin | One-liner |
189
+ |---|---|
190
+ | **[dsh-auto-review](https://github.com/PerryLink/dsh-auto-review)** | Second-model auto-review on the approval chain, fail-closed by default | |
191
+ | **[dsh-autotier](https://github.com/PerryLink/dsh-autotier)** | Automatic strong/cheap model-tier routing with deterministic risk guards and a `/tier` command | |
192
+ | **[dsh-background-agents](https://github.com/PerryLink/dsh-background-agents)** | Durable background child agents with a Web UI sidebar, messaging and interrupt | |
193
+ | **[dsh-budget](https://github.com/PerryLink/dsh-budget)** | Cost governance for DeepSeek Harness: budgets, carbon, and latency in one panel. | |
194
+ | **[dsh-catalog](https://github.com/PerryLink/dsh-catalog)** | DSH Desktop Market standard catalog source for the PerryLink family | |
195
+ | **[dsh-cert-mcp](https://github.com/PerryLink/dsh-cert-mcp)** | Read-only MCP server exposing the certification registry: grades, snapshots and five-dimension evidence | |
196
+ | **[dsh-checkpoint-rewind](https://github.com/PerryLink/dsh-checkpoint-rewind)** | Unified session + workspace + config checkpoints with one-shot `/rewind` | |
197
+ | **[dsh-claude-move](https://github.com/PerryLink/dsh-claude-move)** | Migrate Claude Code, Codex, OpenCode and Hermes sessions, memories and skills into DSH | |
198
+ | **[dsh-click](https://github.com/PerryLink/dsh-click)** | Cross-platform native desktop control for DeepSeek Harness — Windows first. | |
199
+ | **[dsh-composer-history](https://github.com/PerryLink/dsh-composer-history)** | Terminal-style input history for the web composer: arrows, Ctrl+R search | |
200
+ | **[dsh-data-quality](https://github.com/PerryLink/dsh-data-quality)** | Deterministic dataset profiling, cleaning and citation verification | |
201
+ | **[dsh-defend](https://github.com/PerryLink/dsh-defend)** | Prompt-injection, jailbreak, and secret-leak defense for DeepSeek Harness. | |
202
+ | **[dsh-doublecheck](https://github.com/PerryLink/dsh-doublecheck)** | Engineering-discipline guard: requirements grill, test gates, adversary review | |
203
+ | **[dsh-draw](https://github.com/PerryLink/dsh-draw)** | Unified static-image generation routing for DeepSeek Harness. | |
204
+ | **[dsh-fast](https://github.com/PerryLink/dsh-fast)** | Read-only performance diagnostics: load, spill, compaction and cache hit rate | |
205
+ | **[dsh-fund-research](https://github.com/PerryLink/dsh-fund-research)** | Chinese mutual-fund research with sealed, traceable source snapshots | |
206
+ | **[dsh-github](https://github.com/PerryLink/dsh-github)** | GitHub PR/issue/CI integration with every write approval-gated | |
207
+ | **[dsh-industry-research](https://github.com/PerryLink/dsh-industry-research)** | Industry and company research pack: chain map, policy timeline, company cards | |
208
+ | **[dsh-kit](https://github.com/PerryLink/dsh-kit)** | One-command starter pack that installs the core family | |
209
+ | **[dsh-library](https://github.com/PerryLink/dsh-library)** | Local document knowledge base with hybrid search and citation-aware injection | |
210
+ | **[dsh-local-ai](https://github.com/PerryLink/dsh-local-ai)** | Local Ollama model discovery and task-based routing with cloud fallback | |
211
+ | **[dsh-lsp-actions](https://github.com/PerryLink/dsh-lsp-actions)** | LSP diagnostics, formatting, completion, code actions, symbols and rename | |
212
+ | **[dsh-mask](https://github.com/PerryLink/dsh-mask)** | PII masking at the model boundary with a host-side restore table | |
213
+ | **[dsh-mcp-panel](https://github.com/PerryLink/dsh-mcp-panel)** | MCP management console: `/mcp` command, Settings tab and trial calls | |
214
+ | **[dsh-memento](https://github.com/PerryLink/dsh-memento)** | Approval-gated cross-session memory protocol (`ctx.memory` + SQLite) | |
215
+ | **[dsh-observe](https://github.com/PerryLink/dsh-observe)** | OpenTelemetry and Langfuse telemetry export from the session event stream | |
216
+ | **[dsh-output-styles](https://github.com/PerryLink/dsh-output-styles)** | Runtime-switchable model output styles | |
217
+ | **[dsh-permission-rules](https://github.com/PerryLink/dsh-permission-rules)** | Declarative allow/deny/ask rules plus a process-level network policy | |
218
+ | **[dsh-plugin-certification](https://github.com/PerryLink/dsh-plugin-certification)** | Community certification registry with repro-checkable grades and badges | |
219
+ | **[dsh-plugin-doctor](https://github.com/PerryLink/dsh-plugin-doctor)** | Zero-dependency static + sandbox smoke detector for DSH plugins | |
220
+ | **[dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide)** | Plugin-dev knowledge base, agent skill and the `dsh-plugin-dev` CLI toolchain | |
221
+ | **[dsh-plugin-kit](https://github.com/PerryLink/dsh-plugin-kit)** | Shared zero-runtime-dependency toolkit for the PerryLink DSH plugins | |
222
+ | **[dsh-plugin-portal](https://github.com/PerryLink/dsh-plugin-portal)** | Zero-dependency static portal rendering the whole plugin family as one page | |
223
+ | **[dsh-reach](https://github.com/PerryLink/dsh-reach)** | Multi-channel approval/question bridge: WeChat, Telegram, Feishu + a session console | |
224
+ | **[dsh-research-report](https://github.com/PerryLink/dsh-research-report)** | Verifiable research reports: evidence ledger, manifest seal, per-claim verdicts | |
225
+ | **[dsh-score](https://github.com/PerryLink/dsh-score)** | Multi-dimensional plugin quality scoring with an evidence-backed leaderboard | |
226
+ | **[dsh-session-pin](https://github.com/PerryLink/dsh-session-pin)** | Pin sessions and workspaces in the Web sidebar with per-pin colors | |
227
+ | **[dsh-session-sync](https://github.com/PerryLink/dsh-session-sync)** | Git-backed cross-device session synchronization with keep-both merges | |
228
+ | **[dsh-skill-pack-security](https://github.com/PerryLink/dsh-skill-pack-security)** | Security-audit skill pack plus the `plugin_vet` supply-chain gate | |
229
+ | **[dsh-talk](https://github.com/PerryLink/dsh-talk)** | Voice-first session loop: speech-to-text input and text-to-speech replies | |
230
+ | **[dsh-team-rooms](https://github.com/PerryLink/dsh-team-rooms)** | Cross-session team rooms: shared message bus, task board and timeline | |
231
+ | **[dsh-test-drive](https://github.com/PerryLink/dsh-test-drive)** | Isolated install-and-smoke test drives with a pass/fail matrix | |
232
+ | **[dsh-ticktick](https://github.com/PerryLink/dsh-ticktick)** | TickTick/Dida365 task bridge: session-header panel plus eleven agent tools | |
233
+ | **[dsh-translate](https://github.com/PerryLink/dsh-translate)** | Vendor parameter translation and deterministic JSON repair | |
234
+ | **[dsh-wechat](https://github.com/pan17/dsh-wechat)** | WeChat ↔ DSH bridge (Tencent iLink bot) developed with [pan17](https://github.com/pan17/dsh-wechat), who hosts the repo | |
235
+ | **[dsh-personal-directive](https://github.com/PerryLink/dsh-personal-directive)** | Personal directive injector with a top-bar toggle (fork of liucai2026/dsh-personal-directive) | |
236
+
237
+ Part of the PerryLink DSH plugin family — 40+ repositories covering sessions, memory, permissions, delivery, observability and developer tooling. Browse the catalog at [perrylink-dsh-catalog.perrylink.workers.dev](https://perrylink-dsh-catalog.perrylink.workers.dev) or the [`dsh-plugin` topic](https://github.com/topics/dsh-plugin).
169
238
 
170
239
  ## License
171
240
 
package/SECURITY.md CHANGED
@@ -32,7 +32,7 @@ In scope:
32
32
  Out of scope:
33
33
 
34
34
  - findings in the DeepSeek Harness itself (report those upstream);
35
- - the *content* of the upgrade card being incomplete for a repository the maintainer has
35
+ - the *content* of the corridor card being incomplete for a repository the maintainer has
36
36
  never seen — that is a bug report, not a vulnerability;
37
37
  - anything that requires the attacker to already control the machine or the repository
38
38
  being scanned.
@@ -1,7 +1,7 @@
1
1
  # Third-party notices
2
2
 
3
- `dsh-plugin-upgrade` ships **no bundled third-party code**. The published tarball contains
4
- only this repository's source, the packaged skill and its version card.
3
+ `dsh-plugin-upgrade` ships **no bundled third-party code**. The published tarball
4
+ contains only this repository's source, the packaged skill and its merged version card.
5
5
 
6
6
  The dependencies below are declared as `peerDependencies` (the host provides them at
7
7
  runtime) and as `devDependencies` (used only to run the test suite in this repository). None
@@ -12,7 +12,7 @@ of them is copied into the published artifact.
12
12
  | `@deepseek-ai/cordis` | `^4.0.2` (peer) | Plugin runtime (Context, effect, inject) | Apache-2.0 |
13
13
  | `@deepseek-ai/dsh-skill` | `>=0.1.2-rc.1 <0.2.0 \|\| >=0.1.5-alpha.1 <0.2.0` (peer) | `skills` service and `SkillRegistry` used by the tests | Apache-2.0 |
14
14
  | `@deepseek-ai/schemastery` | `^3.18.2` (peer) | `Config` schema | Apache-2.0 |
15
- | `@deepseek-ai/dsh-skill` | `0.1.5-alpha.1` (dev) | Real-registry mount test | Apache-2.0 |
15
+ | `@deepseek-ai/dsh-skill` | `0.1.5-rc.2` (dev) | Real-registry mount test against the published `0.1.5-rc.2` line (the newest published types verify the same merged seam catalog) | Apache-2.0 |
16
16
 
17
17
  The scanner (`lib/scan.mjs`) and the CLI import only Node.js built-ins (`node:fs`,
18
18
  `node:path`) and therefore add no transitive install-time dependency of their own.
package/cordis.patch.yml CHANGED
@@ -3,19 +3,19 @@
3
3
  #
4
4
  # A loader patch file is a top-level YAML array; each entry inserts (or removes)
5
5
  # composition rows. This bundle mounts one row and registers one bundled agent
6
- # skill (`plugin-upgrade-015`) through the `skills` service. It contributes no
6
+ # skill (`plugin-upgrade`) through the `skills` service. It contributes no
7
7
  # system-prompt paragraph and no tool: the model sees the skill only when a task
8
- # needs it, and the CLI (`dsh-plugin-upgrade-scan`) stays an explicit developer
9
- # action. Every key below is a Config field (Schemastery schema); invalid values
10
- # fail the profile load loudly. See README.md "Configuration".
8
+ # needs it, and the CLI (`dsh-plugin-upgrade-scan`) stays an explicit
9
+ # developer action. Every key below is a Config field (Schemastery schema);
10
+ # invalid values fail the profile load loudly. See README.md "Configuration".
11
11
  - insert:
12
12
  - id: dsh-plugin-upgrade
13
13
  name: dsh-plugin-upgrade
14
14
  config:
15
15
  # Register the packaged skill. Default true.
16
16
  enabled: true
17
- # Skill name published to the model catalog. Default 'plugin-upgrade-015'.
18
- skillName: plugin-upgrade-015
17
+ # Skill name published to the model catalog. Default 'plugin-upgrade'.
18
+ skillName: plugin-upgrade
19
19
  # Skill root inside the package; must contain <skillName>/SKILL.md.
20
20
  # Default: the package's own ./skills directory.
21
21
  # skillsRoot: /absolute/path/to/skills