@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.
- package/README.i18n.yaml +2 -2
- package/README.md +2 -0
- package/README.zh.md +2 -0
- package/dsh.bundle.patch.yml +4 -0
- package/lib/client.js +74 -10
- package/lib/index.js +5 -2
- package/lib/typert.host.js +5 -3
- package/lib/typert.remote-client.d.ts.map +1 -1
- package/lib/typert.remote-client.js +4 -2
- package/lib/types/client/instruction-pages.d.ts +20 -0
- package/lib/types/client/locales.d.ts +2 -0
- package/lib/types/client/panel.d.ts +5 -1
- package/lib/types/host/index.d.ts +4 -0
- package/lib/types/shared/types.d.ts +2 -0
- package/package.json +2 -1
- package/resources/plugin-instructions.json +95 -0
- package/zerowall.plugin.json +1 -1
- package/resources/plugin-help/dsh-imagecreate/gpt-image-generator.md +0 -95
- package/resources/plugin-help/dsh-plugin-mcp/zerowall-aichem.md +0 -1
- package/resources/plugin-help/dsh-plugin-mcp/zerowall-bio-tools.md +0 -1
- package/resources/plugin-help/dsh-plugin-mcp/zerowall-bio.md +0 -17
- package/resources/plugin-help/dsh-plugin-mcp/zerowall-ketcher.md +0 -5
- package/resources/plugin-help/dsh-plugin-mcp/zerowall-mcp-guide.md +0 -5
- package/resources/plugin-help/dsh-plugin-mcp/zerowall-r-files.md +0 -84
- package/resources/plugin-help/dsh-plugin-mcp/zerowall-r-packages.md +0 -55
- package/resources/plugin-help/dsh-plugin-mcp/zerowall-rmcp.md +0 -73
- package/resources/plugin-help/dsh-plugin-mcp/zerowall-rplatform.md +0 -76
- package/resources/plugin-help/dsh-plugin-mcp/zerowall-scimaster.md +0 -1
- package/resources/plugin-help/dsh-plugin-mineru/mineru-document-parser.md +0 -29
- package/resources/plugin-help/dsh-plugin-python/local-env-setup.md +0 -10
- package/resources/plugin-help/dsh-plugin-python/zerowall-python-packages.md +0 -17
- package/resources/plugin-help/dsh-pptcreate/zerowall-presentation.md +0 -62
- package/resources/plugin-help/dsh-zotero/pubmed-literature.md +0 -15
- package/resources/plugin-help/dsh-zotero/pyzotero.md +0 -115
- 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:
|
|
16
|
-
zh:
|
|
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 许可;不重复发行修改过的官方版本。
|
package/dsh.bundle.patch.yml
CHANGED
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":
|
|
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
|
-
|
|
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);
|
package/lib/typert.host.js
CHANGED
|
@@ -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":
|
|
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":";;;;;;;;;;
|
|
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":
|
|
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?;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zerowall/dsh-plugin-skills",
|
|
3
|
-
"version": "0.1.0-preview.
|
|
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
|
+
}
|