dsh-plugin-toolkit 0.13.2 → 0.13.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/CHANGELOG.md +19 -0
- package/README.md +2 -0
- package/README.zh.md +2 -0
- package/lib/verify.mjs +31 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,22 @@
|
|
|
1
|
+
## 0.13.4
|
|
2
|
+
|
|
3
|
+
- **`docs/why-it-exists.md`**: the five failures that shaped these checks, each
|
|
4
|
+
with the exact error text, the root cause, the check that catches it now, and
|
|
5
|
+
how to reproduce it. Linked from both READMEs.
|
|
6
|
+
- **A release for the GitHub Action** (`v1.0.0`), so the action can be published
|
|
7
|
+
to the Marketplace.
|
|
8
|
+
|
|
9
|
+
## 0.13.3
|
|
10
|
+
|
|
11
|
+
- **`verify` no longer fails a correct plugin.** The check that calls a client
|
|
12
|
+
module's `apply()` before its services exist handed it `{}`, so
|
|
13
|
+
`ctx.inject(...)` — the cordis API every plugin uses — threw
|
|
14
|
+
`ctx.inject is not a function` and the plugin was reported as broken. The
|
|
15
|
+
probe now models a real context: `inject`, `on`, `effect`, `logger`, `get`,
|
|
16
|
+
`set` and `provide` exist; only the services are absent.
|
|
17
|
+
- Found by this repository's own example plugin, whose CI went red on the
|
|
18
|
+
previous release. That is the whole point of the example.
|
|
19
|
+
|
|
1
20
|
## 0.13.2
|
|
2
21
|
|
|
3
22
|
- **A table of the four ways a plugin installs and still does nothing** — red
|
package/README.md
CHANGED
|
@@ -73,6 +73,8 @@ Releasing one plugin fifteen times taught me three things the ecosystem's toolin
|
|
|
73
73
|
2. **The market index is a second release, done by hand.** Each version needs an entry carrying `publishTimestamp` from the registry and `engines.dsh` from the manifest. Forget the range and the index validator rejects the PR with `Engines mismatch` — after the tag is already public.
|
|
74
74
|
3. **Reading a manifest is not the same as checking it.** A plugin can have a valid `package.json` and still be uninstallable: `files` that omit the entry the manifest points at, a bundle patch that does not exist, a README that never states the host range it declares.
|
|
75
75
|
|
|
76
|
+
The five failures behind these checks — a red dot with no panel, a row the host drops, an app that disables every plugin after one unguarded `apply()`, a tab nothing can open, and a checker that was wrong — are written up with their exact error text and how to reproduce each one: [Five plugins that installed and did nothing](https://github.com/WJDdidi-1/dsh-plugin-toolkit/blob/main/docs/why-it-exists.md).
|
|
77
|
+
|
|
76
78
|
### Four ways a plugin installs and still does nothing
|
|
77
79
|
|
|
78
80
|
Each of these shipped in a real version of this toolkit before the check below existed. A manifest check passes on all four.
|
package/README.zh.md
CHANGED
|
@@ -44,6 +44,8 @@ npx dsh-plugin-toolkit@latest release --pr --merge # 打 tag、等
|
|
|
44
44
|
|
|
45
45
|
前三条是静态的:`doctor` 和 `verify` 不用开应用就能抓到。第四条是 UI 契约,必须把面板挂起来、检查注册出去的参数——那是 [`testkit`](#不用浏览器测面板) 的活。
|
|
46
46
|
|
|
47
|
+
这五个事故——红点没有面板、宿主丢掉一行、一行没加保护的 `apply()` 让应用禁用全部插件、注册了却没人能打开的标签、以及一个判错了的检查器——都写了原始报错和复现步骤:[插件装上了,却什么都不做](https://github.com/WJDdidi-1/dsh-plugin-toolkit/blob/main/docs/why-it-exists.md)。
|
|
48
|
+
|
|
47
49
|
## 安装要求
|
|
48
50
|
|
|
49
51
|
- Node.js 18 或更新(CI 在 18/20/22 × ubuntu/macos/windows 上跑)。
|
package/lib/verify.mjs
CHANGED
|
@@ -39,8 +39,37 @@ function packTarball(dir, destination) {
|
|
|
39
39
|
* What cordis hands a plugin that declares no `inject`: every undeclared
|
|
40
40
|
* property read throws. A plain `{}` hides the bug this is looking for.
|
|
41
41
|
*/
|
|
42
|
+
// cordis itself is present on every context — `ctx.inject`, `ctx.on`,
|
|
43
|
+
// `ctx.effect` and the logger. What can be absent is the *services*.
|
|
44
|
+
function cordisApi() {
|
|
45
|
+
const noop = () => () => {};
|
|
46
|
+
const base = {
|
|
47
|
+
inject: (list, callback) => {
|
|
48
|
+
// A declared service may still be absent when apply runs: record nothing,
|
|
49
|
+
// call nothing. That is exactly what the host does before a service mounts.
|
|
50
|
+
void list;
|
|
51
|
+
void callback;
|
|
52
|
+
return () => {};
|
|
53
|
+
},
|
|
54
|
+
on: noop,
|
|
55
|
+
effect: noop,
|
|
56
|
+
logger: () => {},
|
|
57
|
+
get: () => undefined,
|
|
58
|
+
set: () => {},
|
|
59
|
+
provide: noop,
|
|
60
|
+
reflect: { get: () => undefined, set: () => {}, provide: noop },
|
|
61
|
+
};
|
|
62
|
+
return base;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** A context whose services have not mounted yet; reading one gives undefined. */
|
|
66
|
+
function absentContext() {
|
|
67
|
+
return cordisApi();
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** A context that also enforces cordis's rule: an undeclared read throws. */
|
|
42
71
|
function undeclaredContext() {
|
|
43
|
-
const base =
|
|
72
|
+
const base = cordisApi();
|
|
44
73
|
return new Proxy(base, {
|
|
45
74
|
get(target, key) {
|
|
46
75
|
if (key in target) return target[key];
|
|
@@ -212,7 +241,7 @@ export async function verify({ dir, mount = true }) {
|
|
|
212
241
|
faceProblems.push('the client module declares no inject list, so the loader calls apply() before its services exist');
|
|
213
242
|
}
|
|
214
243
|
try {
|
|
215
|
-
face.apply(
|
|
244
|
+
face.apply(absentContext());
|
|
216
245
|
} catch (error) {
|
|
217
246
|
faceProblems.push(`apply() throws when the services are absent, which fails the web boot: ${error.message}`);
|
|
218
247
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-plugin-toolkit",
|
|
3
|
-
"version": "0.13.
|
|
3
|
+
"version": "0.13.4",
|
|
4
4
|
"description": "Preflight, release and test DeepSeek Harness plugins: check a folder or any GitHub repository, wait for npm to actually serve the version, and keep the market index honest.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|