@restregular/dsh-skill-center 0.0.0-stage → 0.1.8
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/LICENSE +21 -0
- package/README.md +330 -2
- package/client/client.js +767 -0
- package/cordis.patch.yml +7 -0
- package/lib/index.js +691 -0
- package/package.json +55 -4
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 RestRegular
|
|
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,331 @@
|
|
|
1
|
-
#
|
|
1
|
+
# dsh-skill-center · 技能中心
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://www.npmjs.com/package/@restregular/dsh-skill-center)
|
|
4
|
+
[](./LICENSE)
|
|
5
|
+
[](package.json)
|
|
6
|
+
[](https://github.com/RestRegular/dsh-skill-center)
|
|
7
|
+
|
|
8
|
+
**English** · [中文](#中文)
|
|
9
|
+
|
|
10
|
+
A Skill Center panel for **DeepSeek Harness**: browse every skill the current session can see,
|
|
11
|
+
read its `SKILL.md`, flip the model/user invocation switches, create and delete skills — without
|
|
12
|
+
leaving the app and without hand-editing frontmatter.
|
|
13
|
+
|
|
14
|
+
> [!NOTE]
|
|
15
|
+
> The npm name `dsh-skill-center` is taken by an unrelated project, so this plugin is published as
|
|
16
|
+
> **`@restregular/dsh-skill-center`**. The plugin id stays `dsh-skill-center` / `skill-center`.
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
Sidebar Main area
|
|
20
|
+
├ New session ┌───────────────────────────────────────────────┐
|
|
21
|
+
├ Plugins ← order 0 │ Skill Center 8 skills · session scope Back│
|
|
22
|
+
├ Skill Center ← order 1 (this) ├──────────────┬────────────────────────────────┤
|
|
23
|
+
├ Workspaces / Sessions │ auth0-quick… │ auth0-quickstart │
|
|
24
|
+
└ Settings │ discover-… │ provider / source / root │
|
|
25
|
+
│ office-docx │ path / size │
|
|
26
|
+
│ … │ [model invocable ●] [user ●] │
|
|
27
|
+
│ │ [Read body] [Delete] │
|
|
28
|
+
└──────────────┴────────────────────────────────┘
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Features
|
|
32
|
+
|
|
33
|
+
| Capability | Detail |
|
|
34
|
+
|---|---|
|
|
35
|
+
| Browse | Lists every skill visible in the **current session scope**, including skills embedded in plugins, each with provider, source root and invocation policy |
|
|
36
|
+
| Search / filter | Search by name or description; filter by provider source |
|
|
37
|
+
| Read body | Renders the raw `SKILL.md` Markdown inside the panel (no right-hand resource pane needed) |
|
|
38
|
+
| Invocation switches | Toggles `disable-model-invocation` / `user-invocable` by rewriting the frontmatter; the host pushes the refreshed catalog to the model immediately |
|
|
39
|
+
| Create | Creates `<name>/SKILL.md` under the user Agents or user DSH skills root |
|
|
40
|
+
| Delete | Moves the skill to `.trash/<timestamp>-<name>` in the same root — recoverable, never a hard delete |
|
|
41
|
+
| Read-only guard | Skills embedded in plugins (e.g. `office-docx`) are labelled *embedded* and their switches/deletion are disabled |
|
|
42
|
+
| Security | Every write is confined to managed skill roots that really exist on disk; requests from non-loopback origins get `403` |
|
|
43
|
+
|
|
44
|
+
## Requirements
|
|
45
|
+
|
|
46
|
+
- **DeepSeek Harness** desktop build that provides the `ctx.skills` registry and the loopback web server.
|
|
47
|
+
- **Node.js ≥ 22.13.0** for the package metadata/engine field (the plugin itself is plain ESM and has **zero runtime dependencies**).
|
|
48
|
+
|
|
49
|
+
## Install
|
|
50
|
+
|
|
51
|
+
### From the plugin marketplace (GUI)
|
|
52
|
+
|
|
53
|
+
1. Open the **Plugins** entry in the sidebar.
|
|
54
|
+
2. Search for `@restregular/dsh-skill-center` and install it.
|
|
55
|
+
3. Restart the host (or reload the profile) so the host half mounts.
|
|
56
|
+
|
|
57
|
+
### Manually
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
# inside your DSH profile directory, e.g. ~/.dsh/profiles/desktop
|
|
61
|
+
pnpm add @restregular/dsh-skill-center
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Then add the package to the profile's bundle list and restart:
|
|
65
|
+
|
|
66
|
+
```jsonc
|
|
67
|
+
// <profile>/package.json
|
|
68
|
+
{
|
|
69
|
+
"dsh": { "profile": { "bundles": [/* … */ "@restregular/dsh-skill-center"] } },
|
|
70
|
+
"dependencies": { "@restregular/dsh-skill-center": "^0.1.4" }
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
The package ships its own `cordis.patch.yml`, so no manual loader edit is required — it inserts the
|
|
75
|
+
host plugin (`id: skill-center`) and the client half. The sidebar row appears **below Plugins**,
|
|
76
|
+
because the client registers `sidebar.panellist` with `order: 1`.
|
|
77
|
+
|
|
78
|
+
To uninstall: remove the bundle entry and the dependency, then restart.
|
|
79
|
+
|
|
80
|
+
## Usage
|
|
81
|
+
|
|
82
|
+
1. Open a session (or stay on the home screen — see *Known limits*).
|
|
83
|
+
2. Click **Skill Center** in the sidebar.
|
|
84
|
+
3. Pick a skill on the left; the right pane shows provider, source, path, size and the two invocation switches.
|
|
85
|
+
4. Toggle a switch to rewrite the frontmatter, press **Read body** for the Markdown, or **Create** / **Delete** to manage files.
|
|
86
|
+
|
|
87
|
+
## HTTP API
|
|
88
|
+
|
|
89
|
+
The host half mounts a **loopback-only** route at `/dsh-skill-center/api`:
|
|
90
|
+
|
|
91
|
+
| Method | `op` | Parameters | Purpose |
|
|
92
|
+
|---|---|---|---|
|
|
93
|
+
| GET | `ping` | — | liveness probe |
|
|
94
|
+
| GET | `diagnose` | `sessionId?` `cwd?` | is the host mounted, did the client half reach the browser module graph, resolved skill roots |
|
|
95
|
+
| GET | `list` | `sessionId?` `cwd?` | skill catalog + read metadata |
|
|
96
|
+
| POST | `read` | `name` | raw `SKILL.md` text |
|
|
97
|
+
| POST | `setInvocation` | `name` `modelInvocable?` `userInvocable?` | rewrite invocation policy |
|
|
98
|
+
| POST | `create` | `name` `description` `body?` `rootId?` | create a skill bundle |
|
|
99
|
+
| POST | `delete` | `name` | move to `.trash` |
|
|
100
|
+
|
|
101
|
+
Requests from anything other than `127.0.0.1` / `::1` are rejected with `403`.
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
# list the catalog for a session
|
|
105
|
+
curl "http://127.0.0.1:19387/dsh-skill-center/api?op=list&sessionId=<session-id>"
|
|
106
|
+
|
|
107
|
+
# turn off model invocation for one skill
|
|
108
|
+
curl -X POST "http://127.0.0.1:19387/dsh-skill-center/api" \
|
|
109
|
+
-H 'Content-Type: application/json' \
|
|
110
|
+
-d '{"op":"setInvocation","sessionId":"<id>","name":"web-react","modelInvocable":false}'
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
```powershell
|
|
114
|
+
# PowerShell equivalent (UTF-8 safe)
|
|
115
|
+
$body = '{"op":"setInvocation","sessionId":"<id>","name":"web-react","modelInvocable":false}'
|
|
116
|
+
Invoke-RestMethod -Method POST -Uri "http://127.0.0.1:19387/dsh-skill-center/api" `
|
|
117
|
+
-ContentType 'application/json; charset=utf-8' -Body ([Text.Encoding]::UTF8.GetBytes($body))
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
## Architecture
|
|
121
|
+
|
|
122
|
+
Two halves, no shared imports:
|
|
123
|
+
|
|
124
|
+
**Host half** — [`lib/index.js`](lib/index.js)
|
|
125
|
+
|
|
126
|
+
- Reads the catalog through `ctx.skills`, resolving scope with the same three-tier fallback as the
|
|
127
|
+
official `ctx.remote.skills`: live agent → session-recorded preset scope (`agentPresets.acquireScope`)
|
|
128
|
+
→ global registry. The first two tiers decide whether the preset's `skill-filesystem` mount is visible
|
|
129
|
+
(with the global tier only, embedded skills are all you see).
|
|
130
|
+
- Writes only touch files that live in a managed skill root **and** exist on disk:
|
|
131
|
+
`<projectRoot>/.dsh/skills`, `<projectRoot>/.agents/skills`, `$DSH_HOME/skills`, `$DSH_AGENTS_HOME/skills`.
|
|
132
|
+
- Frontmatter edits are string-level: only the invocation keys are touched, everything else is preserved
|
|
133
|
+
byte for byte, including line-ending style.
|
|
134
|
+
- Delete is a `rename` into `.trash`.
|
|
135
|
+
|
|
136
|
+
**Browser half** — [`client/client.js`](client/client.js)
|
|
137
|
+
|
|
138
|
+
Registers two slots and requires no Harness client package:
|
|
139
|
+
|
|
140
|
+
```js
|
|
141
|
+
ctx.slots.inject('sidebar.panellist', () => ctx.slots.register({
|
|
142
|
+
name: 'sidebar.panellist', id: 'skill-center', order: 1, // 1 → right below plugins (order 0)
|
|
143
|
+
label: () => t('panel'), locale: NS,
|
|
144
|
+
}, SkillCenterIcon));
|
|
145
|
+
|
|
146
|
+
ctx.slots.inject('main', () => ctx.slots.register({
|
|
147
|
+
name: 'main', key: 'skill-center', locale: NS, // `main` is keyed: use `key`
|
|
148
|
+
}, Page));
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
Styles use host theme tokens only (`--dsw-alias-*`, `--dsw-radius-*`, `--dsw-focus-ring-*`), and the
|
|
152
|
+
`<style>` tag carries `data-plugin="dsh-skill-center"` so the host's ownerless-style sweep does not
|
|
153
|
+
reclaim it.
|
|
154
|
+
|
|
155
|
+
## Development
|
|
156
|
+
|
|
157
|
+
```bash
|
|
158
|
+
git clone https://github.com/RestRegular/dsh-skill-center.git
|
|
159
|
+
cd dsh-skill-center
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
| Change | Takes effect |
|
|
163
|
+
|---|---|
|
|
164
|
+
| `client/client.js` | after a **page reload** — the host's `/plugins/<id>/client.js` route re-reads from disk and bumps the rev URL when ctime/size change |
|
|
165
|
+
| `lib/index.js` (host) | after a **host restart**. Source-level HMR must be configured *before launch*: add `config: { root: ['.', '<abs path to this repo>'] }` to the profile's `hmr` entry — changing it while running has no effect |
|
|
166
|
+
| `package.json` `dsh.*` | after a **host restart** |
|
|
167
|
+
|
|
168
|
+
For local development the repo can be mounted as a junction instead of being installed:
|
|
169
|
+
|
|
170
|
+
```powershell
|
|
171
|
+
# profile is <DSH_HOME>\profiles\desktop
|
|
172
|
+
New-Item -ItemType Junction -Path "$env:USERPROFILE\.dsh\profiles\desktop\node_modules\dsh-skill-center" `
|
|
173
|
+
-Target "D:\path\to\dsh-skill-center"
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
Self-checks (both run against the local host route with a mini React shim):
|
|
177
|
+
|
|
178
|
+
```powershell
|
|
179
|
+
$env:ELECTRON_RUN_AS_NODE = 1
|
|
180
|
+
$exe = "C:\path\to\DeepSeek Harness.exe"
|
|
181
|
+
$here = "D:\path\to\dsh-skill-center"
|
|
182
|
+
$env:DSH_SMOKE_SESSION = "<session-id>"; & $exe "$here\client-smoke.mjs" # client half + real loopback route
|
|
183
|
+
& $exe "$here\verify-compose.mjs" # client half accepted by the module graph
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
> Renaming or relocating the package: the client module table caches package metadata by
|
|
187
|
+
> `(loader baseUrl, loader line name)` — no file timestamps — so a running host keeps the old path.
|
|
188
|
+
> The browser side uses the in-memory snapshot taken at activation and keeps working after a reload;
|
|
189
|
+
> the new path is only resolved after a host restart.
|
|
190
|
+
|
|
191
|
+
## Known limits
|
|
192
|
+
|
|
193
|
+
- While the panel occupies the main area, the right-hand `dsh-resource://` preview is unavailable
|
|
194
|
+
(the host throws when `sidebarRight.openResource` is called without a session surface), so body
|
|
195
|
+
preview goes through this plugin's own route and renders raw Markdown in-panel.
|
|
196
|
+
- Only **filesystem-backed** skills can be managed; skills embedded in plugins are read-only.
|
|
197
|
+
- With no session selected the panel degrades to "read by working directory" and can only see
|
|
198
|
+
embedded skills plus that cwd's project skills; the footer shows the effective cwd and scope tier.
|
|
199
|
+
- Catalog replacement is all-or-nothing: one switch change makes the host resend the whole skill
|
|
200
|
+
catalog message (a Harness design choice, not this plugin's).
|
|
201
|
+
|
|
202
|
+
## License
|
|
203
|
+
|
|
204
|
+
[MIT](./LICENSE)
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
## 中文
|
|
209
|
+
|
|
210
|
+
**DeepSeek Harness 的技能管理面板**:在首页侧栏「新会话」下方的「插件」入口下面加一行「技能中心」,
|
|
211
|
+
点开后中央区域显示面板,用来查看和改写当前会话能看到的技能。
|
|
212
|
+
|
|
213
|
+
> [!NOTE]
|
|
214
|
+
> npm 上的 `dsh-skill-center` 已被另一个无关项目占用,所以本插件发布为
|
|
215
|
+
> **`@restregular/dsh-skill-center`**;插件 id 仍是 `dsh-skill-center` / `skill-center`。
|
|
216
|
+
|
|
217
|
+
### 功能
|
|
218
|
+
|
|
219
|
+
| 能力 | 说明 |
|
|
220
|
+
|---|---|
|
|
221
|
+
| 浏览 | 列出**当前会话作用域**下模型/用户能看到的所有技能(含插件内嵌技能),带提供方、来源根、调用策略 |
|
|
222
|
+
| 搜索 / 筛选 | 按名称或描述搜索;按来源(provider source)筛选 |
|
|
223
|
+
| 查看正文 | 面板内直接读 `SKILL.md` 原文(Markdown 原文,不经过右栏) |
|
|
224
|
+
| 调用开关 | 切换 `disable-model-invocation` / `user-invocable`,直接改写 frontmatter;监听器会立刻把新目录推给模型 |
|
|
225
|
+
| 新建 | 在「用户 Agents 技能」或「用户 DSH 技能」根下创建 `<name>/SKILL.md` |
|
|
226
|
+
| 删除 | 移动到同根目录的 `.trash/<时间戳>-<名字>`(可手工恢复,不硬删) |
|
|
227
|
+
| 只读保护 | 插件内嵌技能(如 `office-docx`、`diagnose-windows-sandbox-acl`)标注「内嵌」,开关与删除按钮禁用 |
|
|
228
|
+
| 安全 | 写操作只落在**真实存在于磁盘**的受管技能根内;非回环来源一律 `403` |
|
|
229
|
+
|
|
230
|
+
### 安装
|
|
231
|
+
|
|
232
|
+
**市场安装**:侧栏「插件」→ 搜索 `@restregular/dsh-skill-center` → 安装 → 重启宿主。
|
|
233
|
+
|
|
234
|
+
**手工安装**(在 profile 目录里,例如 `~/.dsh/profiles/desktop`):
|
|
235
|
+
|
|
236
|
+
```bash
|
|
237
|
+
pnpm add @restregular/dsh-skill-center
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
然后把包加进 profile 的 bundle 清单并重启:
|
|
241
|
+
|
|
242
|
+
```jsonc
|
|
243
|
+
// <profile>/package.json
|
|
244
|
+
{
|
|
245
|
+
"dsh": { "profile": { "bundles": [/* … */ "@restregular/dsh-skill-center"] } },
|
|
246
|
+
"dependencies": { "@restregular/dsh-skill-center": "^0.1.4" }
|
|
247
|
+
}
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
包自带 `cordis.patch.yml`,**不需要**手改 loader:它会插入宿主半边(`id: skill-center`)与浏览器半边。
|
|
251
|
+
侧栏那一行排在「插件」下方,因为客户端以 `order: 1` 注册 `sidebar.panellist`。
|
|
252
|
+
|
|
253
|
+
卸载:删掉上面两处清单项,重启即可。
|
|
254
|
+
|
|
255
|
+
### 它怎么接进 Harness
|
|
256
|
+
|
|
257
|
+
**宿主半边**(`lib/index.js`)挂载一条**仅回环**的 HTTP 路由 `/dsh-skill-center/api`:
|
|
258
|
+
|
|
259
|
+
- 用 `ctx.skills` 读目录,作用域解析与官方 `ctx.remote.skills` 同源三级兜底:
|
|
260
|
+
活 Agent → 会话记录的预设作用域(`agentPresets.acquireScope`)→ 全局层。
|
|
261
|
+
前两级决定预设内挂载的 `skill-filesystem` 是否可见(只有全局层时只能看到内嵌技能)。
|
|
262
|
+
- 写操作只针对**落在受管技能根里、真实存在于磁盘**的文件:
|
|
263
|
+
`<projectRoot>/.dsh/skills`、`<projectRoot>/.agents/skills`、`$DSH_HOME/skills`、`$DSH_AGENTS_HOME/skills`。
|
|
264
|
+
- frontmatter 改写是字符串级编辑,只动与调用策略相关的键,其余逐字保留(含行尾风格)。
|
|
265
|
+
- 删除只 rename 进 `.trash`。
|
|
266
|
+
|
|
267
|
+
**浏览器半边**(`client/client.js`)注册两处槽位,不 require 任何 Harness Client 包:
|
|
268
|
+
|
|
269
|
+
```js
|
|
270
|
+
ctx.slots.inject('sidebar.panellist', () => ctx.slots.register({
|
|
271
|
+
name: 'sidebar.panellist', id: 'skill-center', order: 1, // 1 → 排在 plugins(order 0)后面
|
|
272
|
+
label: () => t('panel'), locale: NS,
|
|
273
|
+
}, SkillCenterIcon));
|
|
274
|
+
|
|
275
|
+
ctx.slots.inject('main', () => ctx.slots.register({
|
|
276
|
+
name: 'main', key: 'skill-center', locale: NS, // main 是 keyed 槽,用 key
|
|
277
|
+
}, Page));
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
样式只用宿主主题令牌 `--dsw-alias-*` / `--dsw-radius-*` / `--dsw-focus-ring-*`,
|
|
281
|
+
`<style>` 带 `data-plugin="dsh-skill-center"`(避免被宿主的无主样式回收误删)。
|
|
282
|
+
|
|
283
|
+
### API 示例
|
|
284
|
+
|
|
285
|
+
```powershell
|
|
286
|
+
# 列目录(带会话作用域)
|
|
287
|
+
Invoke-RestMethod "http://127.0.0.1:19387/dsh-skill-center/api?op=list&sessionId=<session-id>"
|
|
288
|
+
|
|
289
|
+
# 关掉某技能的模型调用
|
|
290
|
+
$body = '{"op":"setInvocation","sessionId":"<id>","name":"web-react","modelInvocable":false}'
|
|
291
|
+
Invoke-RestMethod -Method POST -Uri "http://127.0.0.1:19387/dsh-skill-center/api" `
|
|
292
|
+
-ContentType 'application/json; charset=utf-8' -Body ([Text.Encoding]::UTF8.GetBytes($body))
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
非回环来源一律 403。
|
|
296
|
+
|
|
297
|
+
### 开发
|
|
298
|
+
|
|
299
|
+
| 改动 | 生效方式 |
|
|
300
|
+
|---|---|
|
|
301
|
+
| `client/client.js` | **刷新页面**即可(宿主的 `/plugins/<id>/client.js` 路由每次请求都读盘,文件 ctime/size 变化会合成新的 rev URL) |
|
|
302
|
+
| `lib/index.js`(宿主) | 需要**重启宿主**。模块源码热替换必须在**启动前**配置:profile patch 里给 `hmr` 行加 `config: { root: ['.', '<本仓库绝对路径>'] }`;运行中改这项无效(见 `@deepseek-ai/dsh-hmr` README「before launching」) |
|
|
303
|
+
| `package.json` 的 `dsh.*` | 同样需要重启 |
|
|
304
|
+
|
|
305
|
+
自检脚本:
|
|
306
|
+
|
|
307
|
+
```powershell
|
|
308
|
+
$env:ELECTRON_RUN_AS_NODE = 1
|
|
309
|
+
$exe = "C:\path\to\DeepSeek Harness.exe"; $here = "D:\path\to\dsh-skill-center"
|
|
310
|
+
# 客户端半侧:迷你 React 装载真实 bundle,并真的打本机宿主路由
|
|
311
|
+
$env:DSH_SMOKE_SESSION = "<session-id>"; & $exe "$here\client-smoke.mjs"
|
|
312
|
+
# 客户端半侧是否会被浏览器模块图接受(复现 dsh-client-modules 的合成校验)
|
|
313
|
+
& $exe "$here\verify-compose.mjs"
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
> 搬迁/改名注意:客户端模块表按 `(loader baseUrl, loader 行名)` 缓存包元信息,不含文件时间戳。
|
|
317
|
+
> 把包挪到别处后,运行中的宿主仍握着旧路径;浏览器端用的是激活时读进内存的快照,
|
|
318
|
+
> 所以刷新页面照常可用,**下次重启宿主**才会解析新路径。
|
|
319
|
+
|
|
320
|
+
### 已知边界
|
|
321
|
+
|
|
322
|
+
- 面板占中央区域时,右栏的 `dsh-resource://` 预览不可用(宿主规定:无会话面时 `sidebarRight.openResource` 抛错)。
|
|
323
|
+
因此正文预览走本插件自己的路由,在面板内渲染原文。
|
|
324
|
+
- 只能管理**文件系统来源**的技能;插件内嵌技能只读。
|
|
325
|
+
- 没有选中会话时退化为「按工作目录读取」,此时只能看到内嵌技能 + 该 cwd 的项目技能;
|
|
326
|
+
面板底栏会显示实际使用的 cwd 与作用域级别。
|
|
327
|
+
- 目录整体替换制:一次开关改动会让模型的技能目录消息整条重发(这是 Harness 自身的设计)。
|
|
328
|
+
|
|
329
|
+
### 许可
|
|
330
|
+
|
|
331
|
+
[MIT](./LICENSE)
|