@zerowall/dsh-plugin-skills 0.1.0-preview.3 → 0.1.0-preview.5

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.
Files changed (35) hide show
  1. package/README.i18n.yaml +2 -2
  2. package/README.md +2 -0
  3. package/README.zh.md +2 -0
  4. package/dsh.bundle.patch.yml +4 -0
  5. package/lib/client.js +74 -10
  6. package/lib/index.js +5 -2
  7. package/lib/typert.host.js +5 -3
  8. package/lib/typert.remote-client.d.ts.map +1 -1
  9. package/lib/typert.remote-client.js +4 -2
  10. package/lib/types/client/instruction-pages.d.ts +20 -0
  11. package/lib/types/client/locales.d.ts +2 -0
  12. package/lib/types/client/panel.d.ts +5 -1
  13. package/lib/types/host/index.d.ts +4 -0
  14. package/lib/types/shared/types.d.ts +2 -0
  15. package/package.json +2 -1
  16. package/resources/plugin-instructions.json +95 -0
  17. package/zerowall.plugin.json +1 -1
  18. package/resources/plugin-help/dsh-imagecreate/gpt-image-generator.md +0 -95
  19. package/resources/plugin-help/dsh-plugin-mcp/zerowall-aichem.md +0 -1
  20. package/resources/plugin-help/dsh-plugin-mcp/zerowall-bio-tools.md +0 -1
  21. package/resources/plugin-help/dsh-plugin-mcp/zerowall-bio.md +0 -17
  22. package/resources/plugin-help/dsh-plugin-mcp/zerowall-ketcher.md +0 -5
  23. package/resources/plugin-help/dsh-plugin-mcp/zerowall-mcp-guide.md +0 -5
  24. package/resources/plugin-help/dsh-plugin-mcp/zerowall-r-files.md +0 -84
  25. package/resources/plugin-help/dsh-plugin-mcp/zerowall-r-packages.md +0 -55
  26. package/resources/plugin-help/dsh-plugin-mcp/zerowall-rmcp.md +0 -73
  27. package/resources/plugin-help/dsh-plugin-mcp/zerowall-rplatform.md +0 -76
  28. package/resources/plugin-help/dsh-plugin-mcp/zerowall-scimaster.md +0 -1
  29. package/resources/plugin-help/dsh-plugin-mineru/mineru-document-parser.md +0 -29
  30. package/resources/plugin-help/dsh-plugin-python/local-env-setup.md +0 -10
  31. package/resources/plugin-help/dsh-plugin-python/zerowall-python-packages.md +0 -17
  32. package/resources/plugin-help/dsh-pptcreate/zerowall-presentation.md +0 -62
  33. package/resources/plugin-help/dsh-zotero/pubmed-literature.md +0 -15
  34. package/resources/plugin-help/dsh-zotero/pyzotero.md +0 -115
  35. package/resources/plugin-help/official-office/zerowall-spreadsheet.md +0 -11
package/README.i18n.yaml CHANGED
@@ -12,8 +12,8 @@
12
12
  en: 21744e6415a744df
13
13
  zh: 054ba34c61b48ecd
14
14
  /zerowall-dsh-plugin-skills/sources-and-state:
15
- en: 0aadfc4c1c6b1d89
16
- zh: c0f4b9af1cff8c21
15
+ en: 337af80caaa23ebf
16
+ zh: 6bbd33e85d5344fc
17
17
  /zerowall-dsh-plugin-skills/limits:
18
18
  en: ae5577470ed2d396
19
19
  zh: 8c498bd4e294a958
package/README.md CHANGED
@@ -15,6 +15,8 @@ Folder, ZIP, Markdown and public GitHub imports require a preview. GitHub source
15
15
 
16
16
  ## Sources and state
17
17
 
18
+ Plugin-owned instructions appear in the owning plugin's Usage instructions section. Its switch controls model instructions independently of plugin activation. Bundled entries declare `metadata.ownerPackage`; `providerOwners` maps official providers without modifying official packages. Owners without a bundle page receive a package-named detail entry, generated from the registry; bundle pages are not duplicated. Entries refresh after plugin management changes and are released with their client scope. Project and user overrides remain in Skills according to their actual source. The registry still supplies enabled instructions to the Skill tool, PPT lazy tools and Claude projection. `resources/plugin-instructions.json` records the retired duplicate help copies; active guidance and third-party notices remain with their owners.
19
+
18
20
  The shared registry supplies plugin, project and user sources, winner selection and enablement. Disabled and shadowed entries remain visible. Standard DSH consumers and Claude use the same policies. Plugin-owned instructions remain with their owning plugin; the curated package provides no duplicate navigation Skill.
19
21
 
20
22
  The bundle disables the profile's `skill` row and mounts this package's `./registry` subpath as the sole active registry. The standard filesystem provider and Skill tool remain enabled. It ships the extended registry under the ZeroWall package name and retains the DSH MIT license; no modified official version is republished.
package/README.zh.md CHANGED
@@ -15,6 +15,8 @@ description: "通过 DSH 共享注册表管理整理后的科研工作流与导
15
15
 
16
16
  ## 来源与状态
17
17
 
18
+ 插件说明显示在所属插件详情的“使用说明”中,开关仅控制向模型提供的说明,与插件启停独立。内置条目通过 `metadata.ownerPackage` 声明归属,`providerOwners` 映射官方 provider,无需修改官方包。没有组合包页面的所属包,会根据注册表生成以包名标识的详情入口;已有组合包页面不会重复显示。入口随插件管理变更刷新,并随客户端作用域释放。项目和用户覆盖项仍按实际来源显示在 Skills 中。注册表继续向 Skill 工具、PPT 按需工具和 Claude 投影提供已启用的说明。`resources/plugin-instructions.json` 记录已整理的重复副本,活动说明与第三方声明由所属包维护。
19
+
18
20
  共享注册表提供插件、项目和用户来源、同名胜出选择及启停策略。停用和被覆盖的条目仍可查看。标准 DSH 和 Claude 消费方采用相同策略。插件使用说明由所属插件提供,整理包不提供重复的导航 Skill。
19
21
 
20
22
  组合配置停用 profile 的 `skill` 行,并将本包的 `./registry` 入口挂载为唯一活动注册表。标准文件系统提供方与 Skill 工具保持启用。扩展后的注册表随 ZeroWall 包发行,并保留 DSH 的 MIT 许可;不重复发行修改过的官方版本。
@@ -9,3 +9,7 @@
9
9
  name: '@zerowall/dsh-plugin-skills/registry'
10
10
  - id: zerowall-skills
11
11
  name: '@zerowall/dsh-plugin-skills'
12
+ config:
13
+ providerOwners:
14
+ dsh-office: '@deepseek-ai/dsh-skill-office'
15
+ dsh-windows-acl: '@deepseek-ai/dsh-sandbox-windows-acl'
package/lib/client.js CHANGED
@@ -57,13 +57,13 @@ function SkillsFeedback({ useStore, actions, t }) {
57
57
  const toast = useStore((state) => state.toast);
58
58
  return toast ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dsh_client_ui_primitives.Toast, { text: t(toast.key), ...toast.success ? { tone: "success" } : {}, onDone: actions.clear }, toast.id) : null;
59
59
  }
60
- function SkillsPanel({ request, pickDirectory, t, actions, view }) {
60
+ function SkillsPanel({ request, pickDirectory, t, actions, view, ownerPackage }) {
61
61
  const [entries, setEntries] = (0, import_react.useState)([]);
62
62
  const [complete, setComplete] = (0, import_react.useState)(true);
63
63
  const [query, setQuery] = (0, import_react.useState)("");
64
64
  const [source, setSource] = (0, import_react.useState)("");
65
65
  const [cwd, setCwd] = (0, import_react.useState)();
66
- const [scope, setScope] = (0, import_react.useState)("workspace");
66
+ const [scope, setScope] = (0, import_react.useState)(ownerPackage ? "global" : "workspace");
67
67
  const [preview, setPreview] = (0, import_react.useState)();
68
68
  const [replace, setReplace] = (0, import_react.useState)(false);
69
69
  const [content, setContent] = (0, import_react.useState)();
@@ -111,11 +111,12 @@ function SkillsPanel({ request, pickDirectory, t, actions, view }) {
111
111
  }
112
112
  }
113
113
  if (view !== void 0 && view !== "page") return null;
114
- const visible = entries.filter((row) => `${row.name} ${row.description}`.toLowerCase().includes(query.toLowerCase()));
114
+ const visible = entries.filter((row) => (ownerPackage ? row.kind === "plugin-instructions" && row.ownerPackage === ownerPackage : row.kind !== "plugin-instructions") && `${row.name} ${row.description}`.toLowerCase().includes(query.toLowerCase()));
115
115
  const topics = [...new Set(visible.map((row) => row.topic))];
116
+ if (ownerPackage && !visible.length && !failure) return null;
116
117
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", { className: panel_default.root, "aria-label": t("title"), "aria-busy": busy, children: [
117
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h2", { children: t("title") }),
118
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { children: t("description") }),
118
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h2", { children: t(ownerPackage ? "plugin" : "title") }),
119
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { children: t(ownerPackage ? "pluginDescription" : "description") }),
119
120
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: panel_default.toolbar, children: [
120
121
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dsh_client_ui_primitives.Input, { "aria-label": t("search"), placeholder: t("search"), value: query, onChange: (event) => setQuery(event.target.value) }),
121
122
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dsh_client_ui_primitives.Button, { disabled: busy, onClick: () => {
@@ -140,7 +141,7 @@ function SkillsPanel({ request, pickDirectory, t, actions, view }) {
140
141
  ] })
141
142
  ] }),
142
143
  !complete && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { role: "status", children: t("incomplete") }),
143
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("details", { className: panel_default.import, children: [
144
+ !ownerPackage && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("details", { className: panel_default.import, children: [
144
145
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("summary", { children: t("preview") }),
145
146
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { children: t("importNote") }),
146
147
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: panel_default.toolbar, children: [
@@ -207,7 +208,7 @@ function SkillsPanel({ request, pickDirectory, t, actions, view }) {
207
208
  row.license
208
209
  ] })
209
210
  ] }),
210
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dsh_client_ui_primitives.Switch, { label: `${t("enable")}: ${row.name}`, checked: row.enabled, disabled: busy || !row.effective || scope === "workspace" && !cwd, onChange: (enabled2) => {
211
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dsh_client_ui_primitives.Switch, { label: `${t(ownerPackage ? "enableInstructions" : "enable")}: ${row.name}`, checked: row.enabled, disabled: busy || !row.effective || scope === "workspace" && !cwd, onChange: (enabled2) => {
211
212
  void operate({ action: "set-enabled", name: row.name, enabled: enabled2 });
212
213
  } }),
213
214
  row.removable && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dsh_client_ui_primitives.Button, { disabled: busy, onClick: () => {
@@ -223,15 +224,21 @@ function SkillsPanel({ request, pickDirectory, t, actions, view }) {
223
224
  ] }),
224
225
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("pre", { children: content.text })
225
226
  ] }),
226
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("small", { children: t("removeNote") })
227
+ !ownerPackage && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("small", { children: t("removeNote") })
227
228
  ] });
228
229
  }
230
+ function PluginInstructionsPanel({ subject, ...props }) {
231
+ const ownerPackage = subject.kind === "item" ? subject.id : subject.kind === "row" ? subject.row.moduleName.split("/").slice(0, subject.row.moduleName.startsWith("@") ? 2 : 1).join("/") : subject.pkg.name;
232
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SkillsPanel, { ...props, ownerPackage }, ownerPackage);
233
+ }
229
234
 
230
235
  // src/client/locales.ts
231
236
  var NS = "zerowall.skills";
232
237
  var en = {
233
238
  title: "Skills",
234
239
  description: "Core workflows are enabled by default. Optional topics load only when enabled. Plugin instructions stay with their owning plugin.",
240
+ pluginDescription: "These instructions help the model use this plugin. Their switch controls instructions, not plugin activation.",
241
+ enableInstructions: "Provide instructions to the model",
235
242
  search: "Search skills",
236
243
  refresh: "Refresh",
237
244
  source: "Folder, ZIP, Markdown or public GitHub URL",
@@ -277,6 +284,8 @@ var en = {
277
284
  var zh = {
278
285
  title: "Skills \u7BA1\u7406",
279
286
  description: "\u6838\u5FC3\u5DE5\u4F5C\u6D41\u9ED8\u8BA4\u542F\u7528\uFF0C\u4E13\u9898\u6309\u9700\u5F00\u542F\uFF1B\u63D2\u4EF6\u63D0\u4F9B\u7684\u4F7F\u7528\u8BF4\u660E\u968F\u63D2\u4EF6\u7BA1\u7406",
287
+ pluginDescription: "\u8FD9\u4E9B\u8BF4\u660E\u5E2E\u52A9\u6A21\u578B\u4F7F\u7528\u672C\u63D2\u4EF6\uFF1B\u5F00\u5173\u4EC5\u63A7\u5236\u8BF4\u660E\u662F\u5426\u63D0\u4F9B\u7ED9\u6A21\u578B\uFF0C\u4E0D\u63A7\u5236\u63D2\u4EF6\u542F\u505C",
288
+ enableInstructions: "\u5411\u6A21\u578B\u63D0\u4F9B\u4F7F\u7528\u8BF4\u660E",
280
289
  search: "\u641C\u7D22 Skill",
281
290
  refresh: "\u5237\u65B0",
282
291
  source: "\u6587\u4EF6\u5939\u3001ZIP\u3001Markdown \u8DEF\u5F84\u6216\u516C\u5F00 GitHub \u5730\u5740",
@@ -336,6 +345,36 @@ function createSkillsViewStore() {
336
345
  });
337
346
  }
338
347
 
348
+ // src/client/instruction-pages.ts
349
+ function createInstructionPages(options) {
350
+ const pages = /* @__PURE__ */ new Map();
351
+ let disposed = false;
352
+ let pending = Promise.resolve();
353
+ return {
354
+ refresh() {
355
+ pending = pending.then(async () => {
356
+ if (disposed) return;
357
+ const inventory = await options.load();
358
+ if (disposed) return;
359
+ const bundles = new Set(inventory.packages);
360
+ const owners = new Set(inventory.entries.flatMap((entry) => entry.kind === "plugin-instructions" && entry.ownerPackage && !bundles.has(entry.ownerPackage) ? [entry.ownerPackage] : []));
361
+ for (const [owner, dispose] of pages) if (!owners.has(owner)) {
362
+ dispose();
363
+ pages.delete(owner);
364
+ }
365
+ for (const owner of owners) if (!pages.has(owner)) pages.set(owner, options.register(owner));
366
+ }).catch(options.failed);
367
+ return pending;
368
+ },
369
+ async dispose() {
370
+ disposed = true;
371
+ await pending;
372
+ for (const dispose of pages.values()) dispose();
373
+ pages.clear();
374
+ }
375
+ };
376
+ }
377
+
339
378
  // src/client/index.ts
340
379
  var inject = ["slots", "locale", "uiWorkspace", "remote.zerowallSkills"];
341
380
  function apply(ctx) {
@@ -350,6 +389,29 @@ function apply(ctx) {
350
389
  const configuration = () => ({ request, pickDirectory: () => ctx.uiWorkspace.pickDirectory() });
351
390
  ctx.slots.inject("settings.section", () => ctx.slots.register({ name: "settings.section", id: "zerowall-skills", order: 35, label: () => ctx.locale.bind(NS)("title"), locale: NS, store, inject: configuration }, SkillsPanel));
352
391
  ctx.slots.inject("plugins.bundle.config", () => ctx.slots.register({ name: "plugins.bundle.config", key: "@zerowall/dsh-plugin-skills", locale: NS, store, inject: configuration }, SkillsPanel));
392
+ ctx.slots.inject("plugins.detail.section", () => ctx.slots.register({ name: "plugins.detail.section", id: "zerowall-plugin-instructions", locale: NS, store, inject: configuration }, PluginInstructionsPanel));
393
+ ctx.inject(["remote", "remote.pluginManager"], (scope) => {
394
+ scope.slots.inject("plugins.item", () => {
395
+ const pages = createInstructionPages({
396
+ load: async () => {
397
+ const [skills, bundles] = await Promise.all([request({ action: "list" }), scope.remote.pluginManager.listBundles()]);
398
+ if (!bundles.ok) throw new Error(bundles.error.message);
399
+ return { entries: skills.entries ?? [], packages: bundles.value.map((bundle) => bundle.name) };
400
+ },
401
+ register: (ownerPackage) => scope.effect(() => scope.slots.register({ name: "plugins.item", id: ownerPackage, order: 70, label: () => ownerPackage }, ({ view }) => view === "summary" ? scope.locale.bind(NS)("pluginDescription") : null)),
402
+ failed: (error51) => scope.logger.warn(`Plugin instruction pages could not refresh: ${String(error51)}`)
403
+ });
404
+ const refresh = () => {
405
+ void pages.refresh();
406
+ };
407
+ refresh();
408
+ const unsubscribe = scope.remote.$on("plugin-manager/changed", refresh);
409
+ return async () => {
410
+ unsubscribe();
411
+ await pages.dispose();
412
+ };
413
+ });
414
+ });
353
415
  ctx.slots.inject("shell.overlay", () => ctx.slots.register({ name: "shell.overlay", id: "zerowall-skills-feedback", locale: NS, store }, SkillsFeedback));
354
416
  }
355
417
 
@@ -15035,6 +15097,8 @@ var _zerowall_dsh_plugin_skills_zerowallSkills_request_result$schema = () => _ze
15035
15097
  "description": external_exports.string(),
15036
15098
  "source": external_exports.string(),
15037
15099
  "provider": external_exports.string(),
15100
+ "kind": external_exports.union([external_exports.literal("standalone"), external_exports.literal("plugin-instructions")]),
15101
+ "ownerPackage": external_exports.union([external_exports.undefined(), external_exports.string()]).optional(),
15038
15102
  "topic": external_exports.string(),
15039
15103
  "enabled": external_exports.boolean(),
15040
15104
  "effective": external_exports.boolean(),
@@ -15102,9 +15166,9 @@ var TYPERT_REMOTE = createTypertRemoteInfo({
15102
15166
  typeSymbol: "@zerowall/dsh-plugin-skills/types#SkillsResponse",
15103
15167
  create: _zerowall_dsh_plugin_skills_zerowallSkills_request_result$schema,
15104
15168
  description: "committed state or a read-only import preview; imported code is never executed.",
15105
- jsonSchema: { "type": "object", "properties": { "entries": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string" }, "name": { "type": "string" }, "description": { "type": "string" }, "source": { "type": "string" }, "provider": { "type": "string" }, "topic": { "type": "string" }, "enabled": { "type": "boolean" }, "effective": { "type": "boolean" }, "removable": { "type": "boolean" }, "path": { "type": "string" }, "license": { "type": "string" }, "requirements": { "type": "array", "items": { "type": "string" } } }, "required": ["id", "name", "description", "source", "provider", "topic", "enabled", "effective", "removable", "requirements"], "additionalProperties": true } }, "complete": { "type": "boolean", "enum": [false, true] }, "content": { "type": "string" }, "preview": { "type": "object", "properties": { "id": { "type": "string" }, "source": { "type": "string" }, "commit": { "type": "string" }, "skills": { "type": "array", "items": { "type": "object", "properties": { "name": { "type": "string" }, "description": { "type": "string" }, "relativePath": { "type": "string" }, "conflict": { "type": "boolean" } }, "required": ["name", "description", "relativePath", "conflict"], "additionalProperties": true } } }, "required": ["id", "source", "skills"], "additionalProperties": true }, "installed": { "type": "array", "items": { "type": "string" } }, "status": { "type": "string" } }, "required": [], "additionalProperties": true }
15169
+ jsonSchema: { "type": "object", "properties": { "entries": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string" }, "name": { "type": "string" }, "description": { "type": "string" }, "source": { "type": "string" }, "provider": { "type": "string" }, "kind": { "type": "string", "enum": ["standalone", "plugin-instructions"] }, "ownerPackage": { "type": "string" }, "topic": { "type": "string" }, "enabled": { "type": "boolean" }, "effective": { "type": "boolean" }, "removable": { "type": "boolean" }, "path": { "type": "string" }, "license": { "type": "string" }, "requirements": { "type": "array", "items": { "type": "string" } } }, "required": ["id", "name", "description", "source", "provider", "kind", "topic", "enabled", "effective", "removable", "requirements"], "additionalProperties": true } }, "complete": { "type": "boolean", "enum": [false, true] }, "content": { "type": "string" }, "preview": { "type": "object", "properties": { "id": { "type": "string" }, "source": { "type": "string" }, "commit": { "type": "string" }, "skills": { "type": "array", "items": { "type": "object", "properties": { "name": { "type": "string" }, "description": { "type": "string" }, "relativePath": { "type": "string" }, "conflict": { "type": "boolean" } }, "required": ["name", "description", "relativePath", "conflict"], "additionalProperties": true } } }, "required": ["id", "source", "skills"], "additionalProperties": true }, "installed": { "type": "array", "items": { "type": "string" } }, "status": { "type": "string" } }, "required": [], "additionalProperties": true }
15106
15170
  },
15107
- sourceLocation: { "file": "packages/plugin/src/host/index.ts", "line": 153, "column": 9 }
15171
+ sourceLocation: { "file": "packages/plugin/src/host/index.ts", "line": 155, "column": 9 }
15108
15172
  }
15109
15173
  }
15110
15174
  }, external_exports);
package/lib/index.js CHANGED
@@ -217,7 +217,7 @@ async function publishImport(prepared, destination) {
217
217
  // src/host/index.ts
218
218
  var name = "zerowall-skills";
219
219
  var inject = ["skills"];
220
- var Config = configSchema.object({ home: configSchema.string(), resources: configSchema.string() });
220
+ var Config = configSchema.object({ home: configSchema.string(), resources: configSchema.string(), providerOwners: configSchema.dict(configSchema.string()) });
221
221
  var requestSchema = z.object({ action: z.enum(["list", "detail", "set-enabled", "set-topic", "preview", "install", "remove"]), cwd: z.string().optional(), id: z.string().optional(), name: z.string().optional(), enabled: z.boolean().optional(), topic: z.string().optional(), source: z.string().optional(), scope: z.enum(["workspace", "global"]).optional(), replace: z.boolean().optional() });
222
222
  var importSchema = z.object({ id: z.string(), name: z.string(), description: z.string(), path: z.string(), root: z.string(), source: z.string(), cwd: z.string().optional(), commit: z.string().optional() });
223
223
  var stateSchema = z.object({ version: z.literal(1), overrides: z.record(z.string(), z.boolean()), workspaceOverrides: z.record(z.string(), z.record(z.string(), z.boolean())), topics: z.array(z.string()), imports: z.array(importSchema) });
@@ -231,6 +231,7 @@ var SkillsManagement = class extends (_a = TypertRemoteService, _request_dec = [
231
231
  __publicField(this, "catalog", []);
232
232
  __publicField(this, "root");
233
233
  __publicField(this, "resources");
234
+ __publicField(this, "providerOwners");
234
235
  __publicField(this, "ready");
235
236
  __publicField(this, "policyControl");
236
237
  __publicField(this, "providerControl");
@@ -238,6 +239,7 @@ var SkillsManagement = class extends (_a = TypertRemoteService, _request_dec = [
238
239
  __publicField(this, "previews", /* @__PURE__ */ new Map());
239
240
  __publicField(this, "disposed", false);
240
241
  __publicField(this, "registry");
242
+ this.providerOwners = config.providerOwners ?? {};
241
243
  this.registry = host.get("skills");
242
244
  this.root = join2(resolve2(config.home ?? resolveDshHome()), "zerowall-skills");
243
245
  const ownFile = fileURLToPath(import.meta.url).replace(/\.asar([\\/])/u, ".asar.unpacked$1");
@@ -360,7 +362,8 @@ ${content}` : content;
360
362
  const entries = snapshot.entries.map((entry) => {
361
363
  const imported = this.state.imports.find((row) => row.path === entry.skill.path);
362
364
  const curated = entry.skill.provider === "zerowall-curated" ? this.catalog.find((row) => row.name === entry.skill.name) : void 0;
363
- return { id: imported?.id ?? `${entry.skill.provider}:${entry.skill.path ?? entry.skill.name}`, name: entry.skill.name, description: entry.skill.description, source: entry.skill.source, provider: entry.skill.provider, topic: curated?.topic ?? (imported ? "imported" : "plugin"), enabled: entry.enabled, effective: entry.effective, removable: imported !== void 0, ...entry.skill.path ? { path: entry.skill.path } : {}, ...curated ? { license: curated.license } : {}, requirements: curated?.requirements ?? [] };
365
+ const owner = entry.skill.source === "bundled" && !imported && !curated ? typeof entry.metadata?.ownerPackage === "string" ? entry.metadata.ownerPackage : this.providerOwners[entry.skill.provider] : void 0;
366
+ return { id: imported?.id ?? `${entry.skill.provider}:${entry.skill.path ?? entry.skill.name}`, name: entry.skill.name, description: entry.skill.description, source: entry.skill.source, provider: entry.skill.provider, kind: owner ? "plugin-instructions" : "standalone", ...owner ? { ownerPackage: owner } : {}, topic: curated?.topic ?? (imported ? "imported" : "plugin"), enabled: entry.enabled, effective: entry.effective, removable: imported !== void 0, ...entry.skill.path ? { path: entry.skill.path } : {}, ...curated ? { license: curated.license } : {}, requirements: curated?.requirements ?? [] };
364
367
  });
365
368
  if (input.action === "detail") {
366
369
  const item = entries.find((row) => row.id === input.id);
@@ -23,6 +23,8 @@ const _zerowall_dsh_plugin_skills_zerowallSkills_request_result$schema = () => (
23
23
  'description': z.string(),
24
24
  'source': z.string(),
25
25
  'provider': z.string(),
26
+ 'kind': z.union([z.literal("standalone"), z.literal("plugin-instructions")]),
27
+ 'ownerPackage': z.union([z.undefined(), z.string()]).optional(),
26
28
  'topic': z.string(),
27
29
  'enabled': z.boolean(),
28
30
  'effective': z.boolean(),
@@ -91,9 +93,9 @@ const $remote = createTypertRemoteInfo({
91
93
  typeSymbol: '@zerowall/dsh-plugin-skills/types#SkillsResponse',
92
94
  create: _zerowall_dsh_plugin_skills_zerowallSkills_request_result$schema,
93
95
  description: 'committed state or a read-only import preview; imported code is never executed.',
94
- jsonSchema: {"type":"object","properties":{"entries":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"source":{"type":"string"},"provider":{"type":"string"},"topic":{"type":"string"},"enabled":{"type":"boolean"},"effective":{"type":"boolean"},"removable":{"type":"boolean"},"path":{"type":"string"},"license":{"type":"string"},"requirements":{"type":"array","items":{"type":"string"}}},"required":["id","name","description","source","provider","topic","enabled","effective","removable","requirements"],"additionalProperties":true}},"complete":{"type":"boolean","enum":[false,true]},"content":{"type":"string"},"preview":{"type":"object","properties":{"id":{"type":"string"},"source":{"type":"string"},"commit":{"type":"string"},"skills":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"relativePath":{"type":"string"},"conflict":{"type":"boolean"}},"required":["name","description","relativePath","conflict"],"additionalProperties":true}}},"required":["id","source","skills"],"additionalProperties":true},"installed":{"type":"array","items":{"type":"string"}},"status":{"type":"string"}},"required":[],"additionalProperties":true},
96
+ jsonSchema: {"type":"object","properties":{"entries":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"source":{"type":"string"},"provider":{"type":"string"},"kind":{"type":"string","enum":["standalone","plugin-instructions"]},"ownerPackage":{"type":"string"},"topic":{"type":"string"},"enabled":{"type":"boolean"},"effective":{"type":"boolean"},"removable":{"type":"boolean"},"path":{"type":"string"},"license":{"type":"string"},"requirements":{"type":"array","items":{"type":"string"}}},"required":["id","name","description","source","provider","kind","topic","enabled","effective","removable","requirements"],"additionalProperties":true}},"complete":{"type":"boolean","enum":[false,true]},"content":{"type":"string"},"preview":{"type":"object","properties":{"id":{"type":"string"},"source":{"type":"string"},"commit":{"type":"string"},"skills":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"relativePath":{"type":"string"},"conflict":{"type":"boolean"}},"required":["name","description","relativePath","conflict"],"additionalProperties":true}}},"required":["id","source","skills"],"additionalProperties":true},"installed":{"type":"array","items":{"type":"string"}},"status":{"type":"string"}},"required":[],"additionalProperties":true},
95
97
  },
96
- sourceLocation: {"file":"packages/plugin/src/host/index.ts","line":153,"column":9},
98
+ sourceLocation: {"file":"packages/plugin/src/host/index.ts","line":155,"column":9},
97
99
  },
98
100
  },
99
101
  }, z)
@@ -129,7 +131,7 @@ export const TYPERT = {
129
131
  },
130
132
  {
131
133
  "name": "ManagedSkill",
132
- "declaration": "export interface ManagedSkill {\n id: string;\n name: string;\n description: string;\n source: string;\n provider: string;\n topic: string;\n enabled: boolean;\n effective: boolean;\n removable: boolean;\n path?: string;\n license?: string;\n requirements: string[];\n}"
134
+ "declaration": "export interface ManagedSkill {\n id: string;\n name: string;\n description: string;\n source: string;\n provider: string;\n kind: 'standalone' | 'plugin-instructions';\n ownerPackage?: string;\n topic: string;\n enabled: boolean;\n effective: boolean;\n removable: boolean;\n path?: string;\n license?: string;\n requirements: string[];\n}"
133
135
  },
134
136
  {
135
137
  "name": "SkillsRequest",
@@ -1 +1 @@
1
- {"version":3,"file":"typert.remote-client.d.ts","names":["request"],"sources":["../src/host/index.ts"],"sourcesContent":[null],"mappings":";;;;;;;;;;IAwJQA,O;;;IAAAA,wB","ignoreList":[]}
1
+ {"version":3,"file":"typert.remote-client.d.ts","names":["request"],"sources":["../src/host/index.ts"],"sourcesContent":[null],"mappings":";;;;;;;;;;IA0JQA,O;;;IAAAA,wB","ignoreList":[]}
@@ -23,6 +23,8 @@ const _zerowall_dsh_plugin_skills_zerowallSkills_request_result$schema = () => (
23
23
  'description': z.string(),
24
24
  'source': z.string(),
25
25
  'provider': z.string(),
26
+ 'kind': z.union([z.literal("standalone"), z.literal("plugin-instructions")]),
27
+ 'ownerPackage': z.union([z.undefined(), z.string()]).optional(),
26
28
  'topic': z.string(),
27
29
  'enabled': z.boolean(),
28
30
  'effective': z.boolean(),
@@ -91,9 +93,9 @@ export const TYPERT_REMOTE = createTypertRemoteInfo({
91
93
  typeSymbol: '@zerowall/dsh-plugin-skills/types#SkillsResponse',
92
94
  create: _zerowall_dsh_plugin_skills_zerowallSkills_request_result$schema,
93
95
  description: 'committed state or a read-only import preview; imported code is never executed.',
94
- jsonSchema: {"type":"object","properties":{"entries":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"source":{"type":"string"},"provider":{"type":"string"},"topic":{"type":"string"},"enabled":{"type":"boolean"},"effective":{"type":"boolean"},"removable":{"type":"boolean"},"path":{"type":"string"},"license":{"type":"string"},"requirements":{"type":"array","items":{"type":"string"}}},"required":["id","name","description","source","provider","topic","enabled","effective","removable","requirements"],"additionalProperties":true}},"complete":{"type":"boolean","enum":[false,true]},"content":{"type":"string"},"preview":{"type":"object","properties":{"id":{"type":"string"},"source":{"type":"string"},"commit":{"type":"string"},"skills":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"relativePath":{"type":"string"},"conflict":{"type":"boolean"}},"required":["name","description","relativePath","conflict"],"additionalProperties":true}}},"required":["id","source","skills"],"additionalProperties":true},"installed":{"type":"array","items":{"type":"string"}},"status":{"type":"string"}},"required":[],"additionalProperties":true},
96
+ jsonSchema: {"type":"object","properties":{"entries":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"source":{"type":"string"},"provider":{"type":"string"},"kind":{"type":"string","enum":["standalone","plugin-instructions"]},"ownerPackage":{"type":"string"},"topic":{"type":"string"},"enabled":{"type":"boolean"},"effective":{"type":"boolean"},"removable":{"type":"boolean"},"path":{"type":"string"},"license":{"type":"string"},"requirements":{"type":"array","items":{"type":"string"}}},"required":["id","name","description","source","provider","kind","topic","enabled","effective","removable","requirements"],"additionalProperties":true}},"complete":{"type":"boolean","enum":[false,true]},"content":{"type":"string"},"preview":{"type":"object","properties":{"id":{"type":"string"},"source":{"type":"string"},"commit":{"type":"string"},"skills":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"relativePath":{"type":"string"},"conflict":{"type":"boolean"}},"required":["name","description","relativePath","conflict"],"additionalProperties":true}}},"required":["id","source","skills"],"additionalProperties":true},"installed":{"type":"array","items":{"type":"string"}},"status":{"type":"string"}},"required":[],"additionalProperties":true},
95
97
  },
96
- sourceLocation: {"file":"packages/plugin/src/host/index.ts","line":153,"column":9},
98
+ sourceLocation: {"file":"packages/plugin/src/host/index.ts","line":155,"column":9},
97
99
  },
98
100
  },
99
101
  }, z)
@@ -0,0 +1,20 @@
1
+ /** Keep instructions reachable for providers whose packages have no bundle detail page. */
2
+ import type { ManagedSkill } from '../shared/types.js';
3
+ interface InstructionPagesOptions {
4
+ load(): Promise<{
5
+ entries: readonly ManagedSkill[];
6
+ packages: readonly string[];
7
+ }>;
8
+ register(ownerPackage: string): () => void;
9
+ failed(error: unknown): void;
10
+ }
11
+ /**
12
+ * Reconcile package-owned instruction pages and release all contributions on teardown.
13
+ * @param options - Inventory reader, page registration and error reporting owned by the client scope.
14
+ * @returns Serialized refresh and teardown operations; failed reads retain current pages.
15
+ */
16
+ export declare function createInstructionPages(options: InstructionPagesOptions): {
17
+ refresh(): Promise<void>;
18
+ dispose(): Promise<void>;
19
+ };
20
+ export {};
@@ -4,6 +4,8 @@ export declare const NS = "zerowall.skills";
4
4
  export declare const en: {
5
5
  readonly title: "Skills";
6
6
  readonly description: "Core workflows are enabled by default. Optional topics load only when enabled. Plugin instructions stay with their owning plugin.";
7
+ readonly pluginDescription: "These instructions help the model use this plugin. Their switch controls instructions, not plugin activation.";
8
+ readonly enableInstructions: "Provide instructions to the model";
7
9
  readonly search: "Search skills";
8
10
  readonly refresh: "Refresh";
9
11
  readonly source: "Folder, ZIP, Markdown or public GitHub URL";
@@ -1,4 +1,5 @@
1
1
  import type { InjectFace, PropsLocale, PropsStore } from '@deepseek-ai/dsh-client-ui-slots';
2
+ import type { PluginDetailProps } from '@deepseek-ai/dsh-client-ui-plugin-manager/client';
2
3
  import type { SkillsRequest, SkillsResponse } from '../shared/types.js';
3
4
  import type { NS } from './locales.js';
4
5
  import type { createSkillsViewStore } from './view-store.js';
@@ -10,9 +11,12 @@ export interface SkillsFace {
10
11
  type FeedbackProps = PropsStore<ReturnType<typeof createSkillsViewStore>> & PropsLocale<typeof NS>;
11
12
  type PanelProps = FeedbackProps & InjectFace<SkillsFace> & {
12
13
  view?: string;
14
+ ownerPackage?: string;
13
15
  };
14
16
  /** Render feedback in the shell so it survives panel dismissal. */
15
17
  export declare function SkillsFeedback({ useStore, actions, t }: FeedbackProps): import("react").JSX.Element | null;
16
18
  /** Render the complete management page without exposing Cordis services to components. */
17
- export declare function SkillsPanel({ request, pickDirectory, t, actions, view }: PanelProps): import("react").JSX.Element | null;
19
+ export declare function SkillsPanel({ request, pickDirectory, t, actions, view, ownerPackage }: PanelProps): import("react").JSX.Element | null;
20
+ /** Show registry-owned instructions on their installed plugin's detail page. */
21
+ export declare function PluginInstructionsPanel({ subject, ...props }: Omit<PanelProps, 'ownerPackage'> & PluginDetailProps): import("react").JSX.Element;
18
22
  export {};
@@ -8,14 +8,17 @@ export declare const inject: string[];
8
8
  export declare const Config: configSchema<Schemastery.ObjectS<NoInfer<{
9
9
  home: configSchema<string, string, "plain">;
10
10
  resources: configSchema<string, string, "plain">;
11
+ providerOwners: configSchema<import("@deepseek-ai/cosmokit").Dict<string, string>, import("@deepseek-ai/cosmokit").Dict<string, string>, "plain">;
11
12
  }>>, Schemastery.ObjectT<NoInfer<{
12
13
  home: configSchema<string, string, "plain">;
13
14
  resources: configSchema<string, string, "plain">;
15
+ providerOwners: configSchema<import("@deepseek-ai/cosmokit").Dict<string, string>, import("@deepseek-ai/cosmokit").Dict<string, string>, "plain">;
14
16
  }>>, "plain">;
15
17
  /** Configured storage and shipped resource roots; neither depends on an installation directory. */
16
18
  export interface Config {
17
19
  home?: string;
18
20
  resources?: string;
21
+ providerOwners?: Record<string, string>;
19
22
  }
20
23
  declare module '@deepseek-ai/cordis' {
21
24
  interface Context {
@@ -30,6 +33,7 @@ export declare class SkillsManagement extends TypertRemoteService {
30
33
  private catalog;
31
34
  private readonly root;
32
35
  private readonly resources;
36
+ private readonly providerOwners;
33
37
  private readonly ready;
34
38
  private policyControl?;
35
39
  private providerControl?;
@@ -5,6 +5,8 @@ export interface ManagedSkill {
5
5
  description: string;
6
6
  source: string;
7
7
  provider: string;
8
+ kind: 'standalone' | 'plugin-instructions';
9
+ ownerPackage?: string;
8
10
  topic: string;
9
11
  enabled: boolean;
10
12
  effective: boolean;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zerowall/dsh-plugin-skills",
3
- "version": "0.1.0-preview.3",
3
+ "version": "0.1.0-preview.5",
4
4
  "description": "Curated scientific skills, imports and shared enablement management.",
5
5
  "type": "module",
6
6
  "main": "./lib/index.js",
@@ -111,6 +111,7 @@
111
111
  "files": [
112
112
  "lib",
113
113
  "resources",
114
+ "!resources/plugin-help/**",
114
115
  "locale",
115
116
  "plugin-detail.md",
116
117
  "plugin-detail.zh.md",
@@ -0,0 +1,95 @@
1
+ {
2
+ "description": "Usage guidance is maintained in the owning plugin. Legacy duplicate copies are excluded from this package; upstream notices remain in THIRD-PARTY-LICENSES.",
3
+ "retired": [
4
+ {
5
+ "name": "gpt-image-generator",
6
+ "owner": "@zerowall/dsh-imagecreate",
7
+ "sha256": "3a10dcf871a3f474510ae9864bbf8affcc89d4f1ab29682e5ae502c56680519e"
8
+ },
9
+ {
10
+ "name": "zerowall-aichem",
11
+ "owner": "@zerowall/dsh-plugin-mcp",
12
+ "sha256": "9edf74f36789a063e4fa4d441ffdd4ce680f15c9955d5768ee042ba1d25d9720"
13
+ },
14
+ {
15
+ "name": "zerowall-bio-tools",
16
+ "owner": "@zerowall/dsh-plugin-mcp",
17
+ "sha256": "8e51c1e6cb827b1e60ec361cab776cebb5ab433739a1b556a81bc8d4644b9b04"
18
+ },
19
+ {
20
+ "name": "zerowall-bio",
21
+ "owner": "@zerowall/dsh-plugin-mcp",
22
+ "sha256": "5434944ed89b2b1d0f4b8bd03d334568ff48d137947aeecd551d32972e76c662"
23
+ },
24
+ {
25
+ "name": "zerowall-ketcher",
26
+ "owner": "@zerowall/dsh-plugin-mcp",
27
+ "sha256": "eeb5c2b8b6971796e894517161e45df56e6cae48bc3fad06f55c245d2cea8941"
28
+ },
29
+ {
30
+ "name": "zerowall-mcp-guide",
31
+ "owner": "@zerowall/dsh-plugin-mcp",
32
+ "sha256": "1f28dfce6c62baf04e4f5167571c7c089c1857d87344c4b37e33667d9f563cb3"
33
+ },
34
+ {
35
+ "name": "zerowall-r-files",
36
+ "owner": "@zerowall/dsh-plugin-mcp",
37
+ "sha256": "040ec9e7a0ddac619c8c6b554466adaab9951ab98d2f2f6d62ec31d1e37aafcb"
38
+ },
39
+ {
40
+ "name": "zerowall-r-packages",
41
+ "owner": "@zerowall/dsh-plugin-mcp",
42
+ "sha256": "a5e7c26240426524fc3f98d06e31a70496fcf2f44503d79de822302a4d273bbe"
43
+ },
44
+ {
45
+ "name": "zerowall-rmcp",
46
+ "owner": "@zerowall/dsh-plugin-mcp",
47
+ "sha256": "07c14c0f8eaf3e812e24d5b24a3fa7b18d1289d6a96f2d436f9b86e6df0b8b31"
48
+ },
49
+ {
50
+ "name": "zerowall-rplatform",
51
+ "owner": "@zerowall/dsh-plugin-mcp",
52
+ "sha256": "2941173336aa825c4cb19ab7a5d84e92d66989449f69d31a01f7f4980612fa65"
53
+ },
54
+ {
55
+ "name": "zerowall-scimaster",
56
+ "owner": "@zerowall/dsh-plugin-mcp",
57
+ "sha256": "c8b0258310d68e1f53fb415b54bb1e9d8a06a5f5ff2e9e6dc36b0603f6c7cab0"
58
+ },
59
+ {
60
+ "name": "mineru-document-parser",
61
+ "owner": "@zerowall/dsh-plugin-mineru",
62
+ "sha256": "9e61b026b8cf143ca74b821202c20aad79552099b892570237e1a1b7576a7129"
63
+ },
64
+ {
65
+ "name": "local-env-setup",
66
+ "owner": "@zerowall/dsh-plugin-python",
67
+ "sha256": "eeb63cb779d1d9a845a6664f97dfe6a280535dbfb991bd3947da5c4d20755169"
68
+ },
69
+ {
70
+ "name": "zerowall-python-packages",
71
+ "owner": "@zerowall/dsh-plugin-python",
72
+ "sha256": "689555de7e5005ae1a264d6e62a1907ca0ad1a0c93279a6ae2110c9f44621c04"
73
+ },
74
+ {
75
+ "name": "zerowall-presentation",
76
+ "owner": "@zerowall/dsh-pptcreate",
77
+ "sha256": "a1ba96e3b4d2a15145be7bf5f7cb6088d559cfa4e0237e735f47c5b7f7f44086"
78
+ },
79
+ {
80
+ "name": "pubmed-literature",
81
+ "owner": "@zerowall/dsh-zotero",
82
+ "sha256": "e88992d1d8bc9aeb437d691d5a2775abb49c7337542fcc937ebac790f9f647bc"
83
+ },
84
+ {
85
+ "name": "pyzotero",
86
+ "owner": "@zerowall/dsh-zotero",
87
+ "sha256": "f0175f09556017723eb2fbe6ecb9cb1335ffd050d72cf43bf99c7846cd3f42da"
88
+ },
89
+ {
90
+ "name": "zerowall-spreadsheet",
91
+ "owner": "@deepseek-ai/dsh-skill-office",
92
+ "sha256": "268b3a8535f6028727b228ff9a89dc367fe4b2f06d00267fef60c0a2ea02d13e"
93
+ }
94
+ ]
95
+ }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zerowall/dsh-plugin-skills",
3
- "version": "0.1.0-preview.3",
3
+ "version": "0.1.0-preview.4",
4
4
  "host": "./lib/index.js",
5
5
  "client": "./lib/client.js",
6
6
  "remote": "./lib/typert.remote-client.js",