dsh-update-status 0.4.0 → 0.4.2
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/README.md +10 -8
- package/README.zh.md +10 -8
- package/docs/platform-acceptance.md +4 -4
- package/docs/service-supervision.md +14 -7
- package/lib/client.js.map +1 -1
- package/lib/index.js +3 -2
- package/lib/{plan-BornHBEZ.js → plan-D9Ybaj-3.js} +184 -25
- package/lib/service-cli.d.ts +36 -0
- package/lib/service-cli.js +152 -63
- package/package.json +3 -2
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,20 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project are documented here.
|
|
4
4
|
|
|
5
|
+
## 0.4.2 — 2026-10-15
|
|
6
|
+
|
|
7
|
+
Verified DeepSeek Harness: `0.2.1-alpha.3` (the current release), also `0.2.1-alpha.1`, `0.2.0-rc.2`, `0.2.0-rc.1`, `0.1.7-rc.2`, `0.1.7-rc.1` and `0.1.7-alpha.2`. Release notes: [`docs/releases/v0.4.2.md`](docs/releases/v0.4.2.md).
|
|
8
|
+
|
|
9
|
+
- **Compatibility declaration only; no functional code changed.** The peer range `>=0.1.7-alpha.2 <0.3.0` already admits DSH `0.2.1-alpha.3`, the active profile loads it without a compatibility refusal, and the status RPC, settings form, sidebar-brand slot, overlay and settings-section slot remain available.
|
|
10
|
+
- **The visible effect:** DSH `0.2.1-alpha.3` now appears as verified compatible rather than compatibility unverified. The test suite, build, shadowed-peer guard and packed artifact all pass unchanged in behavior.
|
|
11
|
+
|
|
12
|
+
## 0.4.1 — 2026-10-09
|
|
13
|
+
|
|
14
|
+
Verified DeepSeek Harness: `0.2.1-alpha.1` (the current release, and the one this profile runs), also `0.2.0-rc.2`, `0.2.0-rc.1`, `0.1.7-rc.2`, `0.1.7-rc.1` and `0.1.7-alpha.2`. Release notes: [`docs/releases/v0.4.1.md`](docs/releases/v0.4.1.md).
|
|
15
|
+
|
|
16
|
+
- **The service definition now uses one audited, cross-platform PATH instead of package-manager guesses.** `install` snapshots its current PATH by default, puts the selected Node directory first, removes empty/relative/duplicate entries, keeps missing absolute directories with warnings, and persists the final value, source, capture time, PATHEXT (Windows) and warnings in the receipt. `--path-source minimal` preserves a fixed deployment, while `--service-path` supplies an explicit value. macOS launchd, Linux systemd and the Windows wrapper consume that same persisted result; preflight uses it too, and later actions locate the receipt from DSH_HOME instead of recapturing a different terminal environment. `plan --dry-run` prints the exact PATH and warnings. Old receipts retain their historical behaviour (macOS/Linux minimal PATH; Windows Task Scheduler login environment). Tests cover POSIX/Windows separators, drive/UNC/Unicode/quoted paths, PATHEXT, systemd percent escaping, warnings, length limits, native command discovery and lifecycle persistence; only macOS receives native service verification in this environment.
|
|
17
|
+
- **Receipt-backed lifecycle operations are safer and independent of the invoking terminal.** The receipt persists an absolute launchctl/systemctl/schtasks path; later actions never search the caller's PATH. Status, stop and uninstall need only DSH_HOME and continue to work after the old Node/DSH/workspace was moved or deleted, while activate still requires usable launch files. Stored artifact paths must exactly match paths re-derived from the fixed service identity, platform and current home; uninstall deletes only those canonical paths, so a modified receipt cannot nominate an arbitrary file. Unknown options are rejected, XML-illegal control characters and overlong PATH/PATHEXT values are refused, and legacy Windows status honestly reports its inherited logon environment.
|
|
18
|
+
|
|
5
19
|
## 0.4.0 — 2026-10-09
|
|
6
20
|
|
|
7
21
|
Verified DeepSeek Harness: `0.2.1-alpha.1` (the current release, and the one this profile runs), also `0.2.0-rc.2`, `0.2.0-rc.1`, `0.1.7-rc.2`, `0.1.7-rc.1` and `0.1.7-alpha.2`. Release notes: [`docs/releases/v0.4.0.md`](docs/releases/v0.4.0.md).
|
package/README.md
CHANGED
|
@@ -54,7 +54,7 @@ Requirements:
|
|
|
54
54
|
|
|
55
55
|
- DeepSeek Harness with the Web profile
|
|
56
56
|
- Node.js 20 or newer
|
|
57
|
-
- Verified DSH releases: `0.2.1-alpha.
|
|
57
|
+
- Verified DSH releases: `0.2.1-alpha.3` (current), `0.2.1-alpha.1`, `0.2.0-rc.2`, `0.2.0-rc.1`, `0.1.7-rc.2`, `0.1.7-rc.1` and `0.1.7-alpha.2`
|
|
58
58
|
|
|
59
59
|
With an installed `dsh` command:
|
|
60
60
|
|
|
@@ -142,8 +142,7 @@ dsh plugin --profile web exec dsh-update-status-service install \
|
|
|
142
142
|
--workspace "$PWD"
|
|
143
143
|
|
|
144
144
|
# 3. Stop the terminal-started dsh web yourself, then activate the service.
|
|
145
|
-
dsh plugin --profile web exec dsh-update-status-service activate
|
|
146
|
-
--workspace "$PWD"
|
|
145
|
+
dsh plugin --profile web exec dsh-update-status-service activate
|
|
147
146
|
```
|
|
148
147
|
|
|
149
148
|
`activate` stops if the port is still busy instead of killing anything, so the DSH you are already using is never taken down by surprise. It also checks afterwards that the service it just started really took over; a service that begins failing immediately is reported as a failure, not as a success. From then on, **Restart** lists what is running, asks for a second confirmation when something is, and lets DSH exit; the service starts it again and the page comes back on its own.
|
|
@@ -156,7 +155,7 @@ Only one thing may start DSH Web on that port. If another tool starts its own `d
|
|
|
156
155
|
| Linux | `systemd --user` | at user login | Implemented; verify on your host | `loginctl enable-linger` is optional for running after logout and is never enabled automatically. The unit template is render-tested but has not been run on a real Linux host yet. |
|
|
157
156
|
| Windows | Task Scheduler + current-user wrapper | at user logon | Template supplied; verify on Windows before production use | No administrator account required. |
|
|
158
157
|
|
|
159
|
-
The generated service files contain absolute paths and **no secrets** — never your API keys, npm tokens, cookies or proxy credentials. Native files, logs, status and removal: [user-service supervision](docs/service-supervision.md). To check Linux or Windows on your own machine: [platform acceptance](docs/platform-acceptance.md).
|
|
158
|
+
The generated service files contain absolute paths, one audited `PATH`, and **no secrets** — never your API keys, npm tokens, cookies or proxy credentials. By default `install` saves the PATH of the terminal that ran it, so Homebrew, MacPorts, Nix, asdf, Conda, Cargo and hand-installed tools all follow the same rule; `--path-source minimal` keeps a fixed environment and `--service-path` supplies an explicit one. `plan --dry-run` shows the final value and every warning before anything is written. Native files, logs, status and removal: [user-service supervision](docs/service-supervision.md). To check Linux or Windows on your own machine: [platform acceptance](docs/platform-acceptance.md).
|
|
160
159
|
|
|
161
160
|
A restart interrupts running work and does not save it. If DSH cannot list what is running, cannot verify that your service owns the current process, or was started by hand or by the desktop app, it refuses to restart at all — a web page cannot talk it into it.
|
|
162
161
|
|
|
@@ -173,13 +172,15 @@ If you want DSH's stock policy instead (a non-loopback page never persists setti
|
|
|
173
172
|
|
|
174
173
|
## Compatibility
|
|
175
174
|
|
|
176
|
-
Current release: plugin **`0.
|
|
175
|
+
Current release: plugin **`0.4.2`** is verified against DeepSeek Harness **`0.2.1-alpha.3`** (the current release), **`0.2.1-alpha.1`**, **`0.2.0-rc.2`**, **`0.2.0-rc.1`**, **`0.1.7-rc.2`**, **`0.1.7-rc.1`** and **`0.1.7-alpha.2`**.
|
|
177
176
|
|
|
178
177
|
### Which plugin version goes with which DeepSeek Harness version
|
|
179
178
|
|
|
180
179
|
| Plugin | Verified DeepSeek Harness | On npm | What that version is |
|
|
181
180
|
| --- | --- | --- | --- |
|
|
182
|
-
| **`0.4.
|
|
181
|
+
| **`0.4.2`** | `0.2.1-alpha.3`, `0.2.1-alpha.1`, `0.2.0-rc.2`, `0.2.0-rc.1`, `0.1.7-rc.2`, `0.1.7-rc.1`, `0.1.7-alpha.2` | `latest` | Compatibility declaration for DSH `0.2.1-alpha.3`; no functional code changed, and the panel now shows this running release as verified compatible |
|
|
182
|
+
| **`0.4.1`** | `0.2.1-alpha.1`, `0.2.0-rc.2`, `0.2.0-rc.1`, `0.1.7-rc.2`, `0.1.7-rc.1`, `0.1.7-alpha.2` | published | The service saves the PATH used during installation, so tools installed by any package manager stay available after DSH is supervised |
|
|
183
|
+
| **`0.4.0`** | `0.2.1-alpha.1`, `0.2.0-rc.2`, `0.2.0-rc.1`, `0.1.7-rc.2`, `0.1.7-rc.1`, `0.1.7-alpha.2` | published | Restart you can trust: the service stops instead of restarting forever, the button needs the service to really own the process, and a disabled button shows the two commands that recover it. Settings also shows when the service started |
|
|
183
184
|
| **`0.3.2`** | `0.2.1-alpha.1`, `0.2.0-rc.2`, `0.2.0-rc.1`, `0.1.7-rc.2`, `0.1.7-rc.1`, `0.1.7-alpha.2` | published | Documentation only: the version table and every past release note are now plain language. Behaves exactly like `0.3.1` |
|
|
184
185
|
| **`0.3.1`** | `0.2.1-alpha.1`, `0.2.0-rc.2`, `0.2.0-rc.1`, `0.1.7-rc.2`, `0.1.7-rc.1`, `0.1.7-alpha.2` | published | Small polish: the settings page explains Restart too, and a long job name can no longer push the buttons away. |
|
|
185
186
|
| **`0.3.0`** | `0.2.1-alpha.1`, `0.2.0-rc.2`, `0.2.0-rc.1`, `0.1.7-rc.2`, `0.1.7-rc.1`, `0.1.7-alpha.2` | published | Adds **Restart** to the panel, plus the one-command service setup it needs. Without that service the button stays disabled and says why. |
|
|
@@ -205,6 +206,7 @@ Current release: plugin **`0.3.2`** is verified against DeepSeek Harness **`0.2.
|
|
|
205
206
|
- Match them explicitly when it matters:
|
|
206
207
|
|
|
207
208
|
```sh
|
|
209
|
+
dsh plugin --profile web add dsh-update-status@0.4.2 # DSH 0.2.1-alpha.3, 0.2.1-alpha.1, 0.2.0-rc.2, 0.2.0-rc.1, 0.1.7-rc.2, 0.1.7-rc.1 or 0.1.7-alpha.2
|
|
208
210
|
dsh plugin --profile web add dsh-update-status@0.3.2 # DSH 0.2.1-alpha.1
|
|
209
211
|
dsh plugin --profile web add dsh-update-status@0.2.0 # DSH 0.2.1-alpha.1, 0.2.0-rc.2, 0.2.0-rc.1, 0.1.7-rc.2, 0.1.7-rc.1 or 0.1.7-alpha.2
|
|
210
212
|
dsh plugin --profile web add dsh-update-status@0.1.12 # DSH 0.2.0-rc.2, 0.2.0-rc.1, 0.1.7-rc.2, 0.1.7-rc.1 or 0.1.7-alpha.2
|
|
@@ -220,9 +222,9 @@ Current release: plugin **`0.3.2`** is verified against DeepSeek Harness **`0.2.
|
|
|
220
222
|
```
|
|
221
223
|
|
|
222
224
|
- Two declarations make the verified lines load at all, and a test keeps them honest:
|
|
223
|
-
- `dsh.engines.dsh` and `peerDependencies['@deepseek-ai/dsh-settings']` both declare `>=0.1.7-alpha.2 <0.3.0`, which admits all
|
|
225
|
+
- `dsh.engines.dsh` and `peerDependencies['@deepseek-ai/dsh-settings']` both declare `>=0.1.7-alpha.2 <0.3.0`, which admits all seven verified releases. The lower bound names the alpha on purpose — under node-semver's default prerelease rule a range like `>=0.1.6-0 <0.2.0` does **not** admit `0.1.7-alpha.2`. The upper bound moved from `<0.2.0` to `<0.3.0` in `0.1.11` for the mirror-image reason: DSH refuses an incompatible bundle at profile load, and a plain `<0.2.0` excludes the `0.2.0` stable, so the day DSH `0.2.0` shipped the plugin would have been silently dropped. DSH evaluates the range with `includePrerelease: true`, so `0.2.0-rc.2` was already inside it and `0.1.12` needed no range change; conversely, a bundle that enumerates `... || 0.2.0-rc.1 || >=0.2.0 <0.3.0` is refused on rc.2, because `>=0.2.0` does not admit a `0.2.0` prerelease.
|
|
224
226
|
- `@deepseek-ai/schemastery` is a **peer**, not a plain dependency: DSH 0.1.7 resolves only a linked plugin's peer dependencies from the running installation, so a `link:` install of this directory would otherwise fail to import the Host half.
|
|
225
|
-
- Per-release notes — what changed, who is affected, what to do — are hand-written in Chinese and English and become the GitHub Release body: [`v0.
|
|
227
|
+
- Per-release notes — what changed, who is affected, what to do — are hand-written in Chinese and English and become the GitHub Release body: [`v0.4.2`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.4.2.md) · [`v0.4.1`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.4.1.md) · [`v0.4.0`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.4.0.md) · [`v0.3.2`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.3.2.md) · [`v0.3.1`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.3.1.md) · [`v0.3.0`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.3.0.md) · [`v0.2.1`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.2.1.md) · [`v0.2.0`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.2.0.md) · [`v0.1.12`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.1.12.md) · [`v0.1.11`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.1.11.md) · [`v0.1.10`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.1.10.md) · [`v0.1.9`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.1.9.md) · [`v0.1.8`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.1.8.md) · [`v0.1.7`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.1.7.md) · [`v0.1.6`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.1.6.md) · [`v0.1.5`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.1.5.md) · [`v0.1.4`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.1.4.md) · [`v0.1.3`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.1.3.md) (covers the never-published `0.1.2`).
|
|
226
228
|
|
|
227
229
|
## Configuration
|
|
228
230
|
|
package/README.zh.md
CHANGED
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
|
|
54
54
|
- 带 Web profile 的 DeepSeek Harness
|
|
55
55
|
- Node.js 20 或更新版本
|
|
56
|
-
- 已验证的 DSH 版本:`0.2.1-alpha.
|
|
56
|
+
- 已验证的 DSH 版本:`0.2.1-alpha.3`(当前)、`0.2.1-alpha.1`、`0.2.0-rc.2`、`0.2.0-rc.1`、`0.1.7-rc.2`、`0.1.7-rc.1` 与 `0.1.7-alpha.2`
|
|
57
57
|
|
|
58
58
|
已经安装 `dsh` 命令:
|
|
59
59
|
|
|
@@ -141,8 +141,7 @@ dsh plugin --profile web exec dsh-update-status-service install \
|
|
|
141
141
|
--workspace "$PWD"
|
|
142
142
|
|
|
143
143
|
# 3. 由你自己在旧终端停止直启的 dsh web,再激活服务。
|
|
144
|
-
dsh plugin --profile web exec dsh-update-status-service activate
|
|
145
|
-
--workspace "$PWD"
|
|
144
|
+
dsh plugin --profile web exec dsh-update-status-service activate
|
|
146
145
|
```
|
|
147
146
|
|
|
148
147
|
`activate` 发现端口还被占着就停手,绝不去杀进程,所以你正在用的 DSH 不会被突然掐掉;激活之后它还会确认服务真的接管了——一启动就不停失败的服务会被当作失败报出来,而不是假装成功。这之后就交给**重启**按钮:它先列出正在跑的东西,有东西在跑时再问一次,然后才让 DSH 退出;服务把新的拉起来,页面自己回来。
|
|
@@ -155,7 +154,7 @@ dsh plugin --profile web exec dsh-update-status-service activate \
|
|
|
155
154
|
| Linux | `systemd --user` | 用户登录 | 已实现;请在你自己机器上验证 | 想在登出后继续运行,可自行开启 `loginctl enable-linger`(本插件不会替你开)。 |
|
|
156
155
|
| Windows | 任务计划程序 + 当前用户 wrapper | 用户登录 | 已实现;请在你自己机器上验证 | 不需要管理员。 |
|
|
157
156
|
|
|
158
|
-
|
|
157
|
+
生成的服务文件里只有绝对路径、一条可审计的 `PATH`,以及**没有密钥**——不会带上你终端里的 API key、npm token、cookie 或代理凭据。默认情况下,`install` 会保存执行安装命令的终端 PATH,因此 Homebrew、MacPorts、Nix、asdf、Conda、Cargo 和手工安装走的是同一套规则;`--path-source minimal` 保留固定环境,`--service-path` 则使用你明确给出的完整 PATH。`plan --dry-run` 会在写文件前列出最终值和全部提示。原生文件、日志、状态与卸载见[用户服务监督说明](docs/service-supervision.md);想在 Linux 或 Windows 上自己确认,见[跨平台验收步骤](docs/platform-acceptance.md)。
|
|
159
158
|
|
|
160
159
|
重启会中断正在跑的工作,且不会保存。如果 DSH 列不出正在跑什么、无法确认当前进程确实由你装的服务拥有,或者它本来就是终端直启、桌面应用托管的,它会直接拒绝重启——网页端说什么都没用。
|
|
161
160
|
|
|
@@ -172,13 +171,15 @@ DSH 对来源不是 loopback(`localhost` / `127.0.0.1`)的页面会关闭 Ho
|
|
|
172
171
|
|
|
173
172
|
## 兼容性
|
|
174
173
|
|
|
175
|
-
当前发布:插件 **`0.
|
|
174
|
+
当前发布:插件 **`0.4.2`** 已针对 DeepSeek Harness **`0.2.1-alpha.3`**(当前发布版)、**`0.2.1-alpha.1`**、**`0.2.0-rc.2`**、**`0.2.0-rc.1`**、**`0.1.7-rc.2`**、**`0.1.7-rc.1`** 与 **`0.1.7-alpha.2`** 验证。
|
|
176
175
|
|
|
177
176
|
### 插件版本与 DeepSeek Harness 版本的对应关系
|
|
178
177
|
|
|
179
178
|
| 插件版本 | 已验证的 DeepSeek Harness | npm 发布状态 | 该版本是什么 |
|
|
180
179
|
| --- | --- | --- | --- |
|
|
181
|
-
| **`0.4.
|
|
180
|
+
| **`0.4.2`** | `0.2.1-alpha.3`、`0.2.1-alpha.1`、`0.2.0-rc.2`、`0.2.0-rc.1`、`0.1.7-rc.2`、`0.1.7-rc.1`、`0.1.7-alpha.2` | `latest` | 为 DSH `0.2.1-alpha.3` 追加兼容声明;功能代码不变,面板会将当前运行版显示为已验证兼容 |
|
|
181
|
+
| **`0.4.1`** | `0.2.1-alpha.1`、`0.2.0-rc.2`、`0.2.0-rc.1`、`0.1.7-rc.2`、`0.1.7-rc.1`、`0.1.7-alpha.2` | 已发布 | 安装服务时保存当时使用的 PATH,不论工具由哪种包管理器安装,受托管后仍能找到 |
|
|
182
|
+
| **`0.4.0`** | `0.2.1-alpha.1`、`0.2.0-rc.2`、`0.2.0-rc.1`、`0.1.7-rc.2`、`0.1.7-rc.1`、`0.1.7-alpha.2` | 已发布 | 重启变得靠得住:服务连续失败会停下而不是无限重启;按钮要求系统服务真正托管当前进程;禁用时会给出两条可复制的恢复命令。设置页还能看到服务启动时间 |
|
|
182
183
|
| **`0.3.2`** | `0.2.1-alpha.1`、`0.2.0-rc.2`、`0.2.0-rc.1`、`0.1.7-rc.2`、`0.1.7-rc.1`、`0.1.7-alpha.2` | 已发布 | 只改文档:版本对照表和历史发布说明都改成人话。功能与 `0.3.1` 完全一样 |
|
|
183
184
|
| **`0.3.1`** | `0.2.1-alpha.1`、`0.2.0-rc.2`、`0.2.0-rc.1`、`0.1.7-rc.2`、`0.1.7-rc.1`、`0.1.7-alpha.2` | 已发布 | 小补丁:设置页也说明了重启前提,长任务名不再把按钮挤走。 |
|
|
184
185
|
| **`0.3.0`** | `0.2.1-alpha.1`、`0.2.0-rc.2`、`0.2.0-rc.1`、`0.1.7-rc.2`、`0.1.7-rc.1`、`0.1.7-alpha.2` | 已发布 | 面板新增**重启**,以及它需要的那条服务安装命令;没装服务时按钮保持禁用并说明原因。 |
|
|
@@ -204,6 +205,7 @@ DSH 对来源不是 loopback(`localhost` / `127.0.0.1`)的页面会关闭 Ho
|
|
|
204
205
|
- 需要精确对应时显式指定版本:
|
|
205
206
|
|
|
206
207
|
```sh
|
|
208
|
+
dsh plugin --profile web add dsh-update-status@0.4.2 # DSH 0.2.1-alpha.3、0.2.1-alpha.1、0.2.0-rc.2、0.2.0-rc.1、0.1.7-rc.2、0.1.7-rc.1 或 0.1.7-alpha.2
|
|
207
209
|
dsh plugin --profile web add dsh-update-status@0.3.2 # DSH 0.2.1-alpha.1
|
|
208
210
|
dsh plugin --profile web add dsh-update-status@0.2.0 # DSH 0.2.1-alpha.1、0.2.0-rc.2、0.2.0-rc.1、0.1.7-rc.2、0.1.7-rc.1 或 0.1.7-alpha.2
|
|
209
211
|
dsh plugin --profile web add dsh-update-status@0.1.12 # DSH 0.2.0-rc.2、0.2.0-rc.1、0.1.7-rc.2、0.1.7-rc.1 或 0.1.7-alpha.2
|
|
@@ -219,9 +221,9 @@ DSH 对来源不是 loopback(`localhost` / `127.0.0.1`)的页面会关闭 Ho
|
|
|
219
221
|
```
|
|
220
222
|
|
|
221
223
|
- 有两处声明让已验证的版本线能正常加载,并由测试守住:
|
|
222
|
-
- `dsh.engines.dsh` 与 `peerDependencies['@deepseek-ai/dsh-settings']` 都声明 `>=0.1.7-alpha.2 <0.3.0
|
|
224
|
+
- `dsh.engines.dsh` 与 `peerDependencies['@deepseek-ai/dsh-settings']` 都声明 `>=0.1.7-alpha.2 <0.3.0`,七个已验证版本都在范围内。下界特意写成这个 alpha:按 node-semver 默认的预发布规则,`>=0.1.6-0 <0.2.0` 这样的范围**并不接纳** `0.1.7-alpha.2`。上界在 `0.1.11` 从 `<0.2.0` 放宽到 `<0.3.0` 是同一件事的镜像:DSH 会在 profile 加载时拒绝不兼容的 bundle,而裸的 `<0.2.0` 恰好排除 `0.2.0` 正式版——DSH `0.2.0` 发布当天插件就会被静默丢弃。DSH 判定时使用 `includePrerelease: true`,所以 `0.2.0-rc.2` 本来就在这个范围内,`0.1.12` 无需再动范围;反过来说,把范围写成 `... || 0.2.0-rc.1 || >=0.2.0 <0.3.0` 这类枚举的插件会因为 `>=0.2.0` 不接纳 `0.2.0` 预发布而被 rc.2 拒载。
|
|
223
225
|
- `@deepseek-ai/schemastery` 是 **peer**,不是普通依赖:DSH 0.1.7 只从运行安装解析 link 插件的 peer 依赖,否则 `link:` 安装会连 Host 半边都 import 失败。
|
|
224
|
-
- 每个版本的中英文详细说明(改了什么、影响谁、需要做什么)手写后直接作为 GitHub Release 正文:[`v0.
|
|
226
|
+
- 每个版本的中英文详细说明(改了什么、影响谁、需要做什么)手写后直接作为 GitHub Release 正文:[`v0.4.2`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.4.2.md) · [`v0.4.1`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.4.1.md) · [`v0.4.0`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.4.0.md) · [`v0.3.2`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.3.2.md) · [`v0.3.1`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.3.1.md) · [`v0.3.0`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.3.0.md) · [`v0.2.1`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.2.1.md) · [`v0.2.0`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.2.0.md) · [`v0.1.12`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.1.12.md) · [`v0.1.11`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.1.11.md) · [`v0.1.10`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.1.10.md) · [`v0.1.9`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.1.9.md) · [`v0.1.8`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.1.8.md) · [`v0.1.7`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.1.7.md) · [`v0.1.6`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.1.6.md) · [`v0.1.5`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.1.5.md) · [`v0.1.4`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.1.4.md) · [`v0.1.3`](https://github.com/idoall/dsh-update-status/blob/main/docs/releases/v0.1.3.md)(含从未发布的 `0.1.2`)。
|
|
225
227
|
|
|
226
228
|
## 配置
|
|
227
229
|
|
|
@@ -10,7 +10,7 @@ Three steps, each one safe to stop at. If a step fails, the section below says w
|
|
|
10
10
|
dsh plugin --profile web exec dsh-update-status-service plan --workspace "$PWD" --dry-run
|
|
11
11
|
```
|
|
12
12
|
|
|
13
|
-
Check the printed Node path, DSH path
|
|
13
|
+
Check the printed Node path, DSH path, absolute native-service command, port and **servicePath** against what you actually run. The default `current` value should contain the directories where your terminal finds the tools you need; warnings are visible before anything is written. Override launch facts with `--node`, `--dsh`, `--port`; use `--path-source minimal` for a fixed PATH, or `--service-path` (plus `--service-pathext` on Windows when needed) for an explicit one.
|
|
14
14
|
|
|
15
15
|
## 2. Write the service definition — still starts nothing
|
|
16
16
|
|
|
@@ -18,12 +18,12 @@ Check the printed Node path, DSH path and port against what you actually run. Ov
|
|
|
18
18
|
dsh plugin --profile web exec dsh-update-status-service install --workspace "$PWD"
|
|
19
19
|
```
|
|
20
20
|
|
|
21
|
-
It runs a boot precheck that does not bind the port. If that precheck fails, nothing is written.
|
|
21
|
+
It runs a boot precheck that does not bind the port and uses the exact same PATH that will be written into the service. If that precheck fails, nothing is written. The receipt keeps that PATH, its source, capture time, PATHEXT on Windows and all warnings; later commands reuse it instead of reading the shell that happens to invoke them.
|
|
22
22
|
|
|
23
23
|
## 3. Stop your terminal's `dsh web` yourself, then
|
|
24
24
|
|
|
25
25
|
```sh
|
|
26
|
-
dsh plugin --profile web exec dsh-update-status-service activate
|
|
26
|
+
dsh plugin --profile web exec dsh-update-status-service activate
|
|
27
27
|
```
|
|
28
28
|
|
|
29
29
|
It refuses to start while the port is still busy — that is deliberate, so the DSH you are using is never pushed aside.
|
|
@@ -44,7 +44,7 @@ If **Restart** stays greyed out after activating, the running process was not re
|
|
|
44
44
|
## Removing it again
|
|
45
45
|
|
|
46
46
|
```sh
|
|
47
|
-
dsh plugin --profile web exec dsh-update-status-service uninstall
|
|
47
|
+
dsh plugin --profile web exec dsh-update-status-service uninstall
|
|
48
48
|
```
|
|
49
49
|
|
|
50
50
|
That removes only the definition this tool created. Logs are kept.
|
|
@@ -25,15 +25,14 @@ This document describes the explicit, opt-in setup. The plugin never installs a
|
|
|
25
25
|
5. Activate the staged service:
|
|
26
26
|
|
|
27
27
|
```sh
|
|
28
|
-
dsh plugin --profile web exec dsh-update-status-service activate
|
|
29
|
-
--workspace "$PWD"
|
|
28
|
+
dsh plugin --profile web exec dsh-update-status-service activate
|
|
30
29
|
```
|
|
31
30
|
|
|
32
31
|
`activate` refuses to run while the requested port is occupied, and it never kills an existing process. After starting the service it also verifies that the service really owns a running process: a service that begins crash-looping makes `activate` fail with that reason instead of reporting success.
|
|
33
32
|
|
|
34
33
|
6. Reopen the normal Web URL. The update panel should report a restart-capable supervised process. Perform the first real page restart yourself while present, then confirm that the page reconnects.
|
|
35
34
|
|
|
36
|
-
|
|
35
|
+
After `install`, the receipt under `DSH_HOME` is the source of truth. `activate`, `status`, `stop`, and `uninstall` need no workspace/profile/PATH arguments; use only `--dsh-home` when the receipt is outside the default `~/.dsh`. Unknown options are rejected instead of silently falling back to another receipt. The receipt also stores an absolute launchctl/systemctl/schtasks path, so these actions do not depend on the shell that invokes them. Status, stop and uninstall remain available even if the old Node/DSH path or workspace no longer exists; activate still checks all launch files before it starts anything. `uninstall` preserves logs and re-derives every deletion path from the validated fixed service identity, platform and current home — mutable receipt paths are never trusted.
|
|
37
36
|
|
|
38
37
|
> `dsh plugin --profile web exec` is pnpm's profile-local executable runner. Do not assume `dsh-update-status-service` is globally installed.
|
|
39
38
|
|
|
@@ -45,9 +44,12 @@ The staged definition contains only explicit, non-secret launch facts:
|
|
|
45
44
|
- profile, workspace, host, port, and `--no-open`;
|
|
46
45
|
- `DSH_HOME` when explicitly configured;
|
|
47
46
|
- an explicit `DSH_WEB_SUPERVISOR=dsh-update-status` marker;
|
|
48
|
-
- private stdout/stderr log paths
|
|
47
|
+
- private stdout/stderr log paths;
|
|
48
|
+
- one final `PATH`, its source (`current`, `minimal`, or `explicit`), capture time, Windows `PATHEXT` when applicable, and any warnings produced while resolving it.
|
|
49
|
+
|
|
50
|
+
It intentionally does **not** copy the full terminal environment. The default `current` mode snapshots only the PATH of the process that runs `plan`/`install`; no login or interactive shell startup file is executed. The selected Node directory is placed first, empty and relative entries are ignored, duplicates are removed in order, and missing absolute directories are preserved with a warning because a mount or tool directory may appear later. The result is persisted in the receipt and reused by preflight, the native definition, activation and status — later commands never recapture a different terminal PATH.
|
|
49
51
|
|
|
50
|
-
|
|
52
|
+
For a fixed deployment use `--path-source minimal`; to supply the exact value yourself use `--service-path "..."` (which implies the `explicit` source). On Windows `--service-pathext` can pin command extensions as well. `plan --dry-run` prints the final PATH, source, capture time, PATHEXT and every warning before anything is written; `install` repeats the final PATH before preflight, so running the two commands from different terminals cannot hide a changed input. A too-long value or a value containing NUL/line breaks is rejected rather than silently shortened. If your DSH startup requires other environment variables or secrets, configure them through your operating system's secret-management mechanism before activating the service; do not paste secrets into this plugin's configuration or issue tracker.
|
|
51
53
|
|
|
52
54
|
## macOS — LaunchAgent
|
|
53
55
|
|
|
@@ -57,6 +59,8 @@ The CLI stages a current-user plist at:
|
|
|
57
59
|
~/Library/LaunchAgents/com.idoall.dsh-update-status.web.plist
|
|
58
60
|
```
|
|
59
61
|
|
|
62
|
+
The plist receives the one PATH resolved above. This is package-manager-neutral: Homebrew, MacPorts, pkgsrc, Nix, asdf, Conda, Cargo and hand-installed tools work when their directory was already in the terminal PATH used for `install`; no prefix is hardcoded into the macOS renderer.
|
|
63
|
+
|
|
60
64
|
It runs at login (`RunAtLoad`) and starts a small wrapper, also staged by the CLI:
|
|
61
65
|
|
|
62
66
|
```text
|
|
@@ -89,6 +93,8 @@ The CLI stages:
|
|
|
89
93
|
~/.config/systemd/user/dsh-update-status-web.service
|
|
90
94
|
```
|
|
91
95
|
|
|
96
|
+
The unit receives the persisted POSIX PATH, with literal `%` escaped so systemd cannot treat a directory as a specifier. WSL reports itself as Linux and therefore uses the same colon-separated rules; a Windows semicolon PATH is never written into the unit.
|
|
97
|
+
|
|
92
98
|
It uses `Restart=on-failure`, so DSH's restart exit code causes systemd to relaunch it, and it bounds the loop with `StartLimitIntervalSec=300` / `StartLimitBurst=10`: ten starts inside five minutes stops the unit instead of respawning forever. It is a **user** service: normally it starts after that user logs in.
|
|
93
99
|
|
|
94
100
|
```sh
|
|
@@ -119,6 +125,8 @@ The CLI stages a current-user Task Scheduler definition and a PowerShell wrapper
|
|
|
119
125
|
%LOCALAPPDATA%\dsh-update-status\
|
|
120
126
|
```
|
|
121
127
|
|
|
128
|
+
New receipts pin both the semicolon-separated PATH and PATHEXT in the PowerShell wrapper, including drive paths, UNC shares, spaces and Unicode; PATH keys are read case-insensitively. Old receipts preserve their historical Task Scheduler logon environment instead of being narrowed during an upgrade.
|
|
129
|
+
|
|
122
130
|
The task starts at user logon with least privilege. The wrapper owns the long-running DSH child, restarts it after an intentional restart or unexpected exit, and stops after five starts that each die within 30 seconds (the same ceiling as macOS) instead of respawning forever. Use Task Scheduler to inspect the task named **DSH Update Status Web**.
|
|
123
131
|
|
|
124
132
|
Windows behavior must be verified on a Windows host before it is described as production-supported; use `plan --dry-run` to inspect the generated XML and wrapper first.
|
|
@@ -152,8 +160,7 @@ Node/NVM upgrades can change the absolute Node path captured in a service defini
|
|
|
152
160
|
To remove supervision without deleting DSH profiles, sessions, or plugin preferences:
|
|
153
161
|
|
|
154
162
|
```sh
|
|
155
|
-
dsh plugin --profile web exec dsh-update-status-service uninstall
|
|
156
|
-
--workspace "$PWD"
|
|
163
|
+
dsh plugin --profile web exec dsh-update-status-service uninstall
|
|
157
164
|
```
|
|
158
165
|
|
|
159
166
|
The command removes only the definition and receipt created by this installer. It preserves logs for diagnosis.
|