🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

演示文稿生成 STARDUSTLC666/dsh-ppt

DeepSeek 客户端v0.20.3
STARDUSTLC6665 天前有提交已提供中文文档扫描:含敏感能力兼容 / 相关生态

DSH 演示文稿:HTML / 可编辑 PPTX / 工程包、工程检索与轻量编辑、数字溯源和现场推演,可选 AI…

44/100
综合分
21
GitHub 星标
9,723
npm 周下载
—/5
用户评分

数据截至 2026/10/30 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

相关生态插件(非 dsh 原生,按其对应运行时安装)
git clone https://github.com/STARDUSTLC666/dsh-ppt.git

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
生态插件
可安装,未声明 dsh 能力
装得上吗
本站已在 dsh 0.2.1-rc.5 下真实安装成功
非静态推断
L5 · 运行时冒烟等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 5 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过
展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包dsh-ppt @ 0.20.3
✓Node 引擎要求 ^22.19.0 || >=24.0.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/31 02:19:05

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 89 处,展示前 84 条)
  • 读取本地文件
    skills/dsh-ppt/scripts/deck-core.mjs:32
    const pkg = JSON.parse(readFileSync(new URL(file, import.meta.url), 'utf8'))
  • 写入本地文件
    skills/dsh-ppt/scripts/deck-core.mjs:346
    mkdirSync(outputDir, { recursive: true })
  • 读取本地文件
    skills/dsh-ppt/scripts/deck-core.mjs:350
    if (overwrite || !existsSync(first)) return first
  • 读取本地文件
    skills/dsh-ppt/scripts/deck-core.mjs:353
    if (!existsSync(candidate)) return candidate
  • 写入本地文件
    skills/dsh-ppt/scripts/deck-core.mjs:358
    writeFileSync(htmlPath, renderThemePreviewHtml(language.id), 'utf8')
  • 写入本地文件
    skills/dsh-ppt/scripts/deck-core.mjs:361
    writeFileSync(svgPath, renderThemeSvg(id, language.id), 'utf8')
  • 读取本地文件
    skills/dsh-ppt/scripts/deck-core.mjs:442
    const existing = new Set(readdirSync(outputDir).map((name) => name.toLowerCase()))
  • 删除本地文件
    skills/dsh-ppt/scripts/deck-core.mjs:912
    rmSync(item.tempPath, { force: true })
  • 读取本地文件
    skills/dsh-ppt/scripts/deck-core.mjs:919
    if (!existsSync(item.path)) continue
  • 读取本地文件
    skills/dsh-ppt/scripts/deck-core.mjs:921
    previous.set(item.path, readFileSync(item.path))
  • 写入本地文件
    skills/dsh-ppt/scripts/deck-core.mjs:931
    writeFileSync(item.tempPath, item.data, item.encoding)
  • 写入本地文件
    skills/dsh-ppt/scripts/deck-core.mjs:943
    renameSync(item.tempPath, item.path)
  • 删除本地文件
    skills/dsh-ppt/scripts/deck-core.mjs:952
    if (previousData === undefined) rmSync(item.path, { force: true })
  • 写入本地文件
    skills/dsh-ppt/scripts/deck-core.mjs:953
    else writeFileSync(item.path, previousData)
  • 读取本地文件
    skills/dsh-ppt/scripts/deck-advanced.mjs:91
    try { size = statSync(path).size } catch { fail(`${page} 图片不存在:${path}`) }
  • 读取本地文件
    skills/dsh-ppt/scripts/deck-advanced.mjs:93
    try { bytes = readFileSync(path) } catch { fail(`${page} 图片无法读取:${path}`) }
  • 删除本地文件
    skills/dsh-ppt/scripts/deck-advanced.mjs:311
    try { return commit() } finally { closeSync(fd); rmSync(lock, { force: true }) }
  • 读取本地文件
    skills/dsh-ppt/scripts/deck-advanced.mjs:354
    try { if (hash(readFileSync(paths[kind])) === manifest.artifacts[kind]) continue } catch {}
  • 写入本地文件
    skills/dsh-ppt/scripts/deck-advanced.mjs:379
    mkdirSync(normalized.outputDir, { recursive: true })
  • 读取本地文件
    skills/dsh-ppt/scripts/deck-advanced.mjs:390
    if (statSync(path).size > MAX_DOCUMENT) fail('工程文件超过 64 MiB')
  • 读取本地文件
    skills/dsh-ppt/scripts/deck-advanced.mjs:391
    const bytes = readFileSync(path)
  • 读取本地文件
    skills/dsh-ppt/scripts/deck-advanced.mjs:433
    if (hash(readFileSync(state.path)) !== state.fingerprint) fail('工程已被其他操作修改,请重新读取后重试')
  • 读取本地文件
    skills/dsh-ppt/scripts/deck-render.mjs:29
    const info = lstatSync(path)
  • 读取本地文件
    skills/dsh-ppt/scripts/deck-render.mjs:32
    const bytes = readFileSync(path)
  • 读取本地文件
    skills/dsh-ppt/scripts/deck-render.mjs:113
    try { manifest = JSON.parse(readFileSync(candidate, 'utf8')) } catch (error) { if (error.code === 'ENOENT') continue; throw error }
  • 写入本地文件
    skills/dsh-ppt/scripts/deck-render.mjs:121
    mkdirSync(dirname(base), { recursive: true })
  • 写入本地文件
    skills/dsh-ppt/scripts/deck-render.mjs:124
    try { mkdirSync(candidate); return candidate } catch (error) { if (error.code !== 'EEXIST') throw error }
  • 删除本地文件递归
    skills/dsh-ppt/scripts/deck-render.mjs:131
    if (root && owned && dirname(resolve(owned)) === resolve(root) && (basename(owned).startsWith('.partial-') || basename(owned) === 'artifacts')) rmSync
  • 删除本地文件
    skills/dsh-ppt/scripts/deck-render.mjs:132
    if (root) { try { rmdirSync(root) } catch (error) { if (!['ENOENT', 'ENOTEMPTY', 'EEXIST'].includes(error.code)) throw error } }
  • 写入本地文件
    skills/dsh-ppt/scripts/deck-render.mjs:176
    mkdirSync(staging)
  • 写入本地文件
    skills/dsh-ppt/scripts/deck-render.mjs:178
    writeFileSync(snapshot, input, { flag: 'wx' })
  • 写入本地文件
    skills/dsh-ppt/scripts/deck-render.mjs:201
    writeFileSync(manifestPath, JSON.stringify(manifest, null, 2) + '\n')
  • 删除本地文件
    skills/dsh-ppt/scripts/deck-render.mjs:214
    unlinkSync(snapshot)
  • 写入本地文件
    skills/dsh-ppt/scripts/deck-render.mjs:215
    writeFileSync(join(staging, 'render-receipt.json'), JSON.stringify(receipt, null, 2) + '\n', { flag: 'wx' })
  • 读取本地文件
    skills/dsh-ppt/scripts/deck-render.mjs:221
    if (existsSync(destination)) fail('本次渲染提交目录发生冲突')
  • 发起网络请求
    lib/client.js:292
    const response = await fetch(route, { method: 'POST', credentials: 'same-origin', cache: 'no-store', signal: controller.signal, headers: { 'content-ty
  • 发起网络请求
    lib/client.js:309
    const close = () => { void fetch(route, { method: 'POST', credentials: 'same-origin', keepalive: true, headers: { 'content-type': 'application/json',
  • 发起网络请求
    lib/client.js:808
    const response = await fetch(new URL(ROUTE, document.baseURI), { method: 'POST', credentials: 'same-origin', signal,
  • 写入剪贴板
    lib/client.js:1634
    navigator.clipboard?.writeText(text).then(() => setMessage(t("已复制示例"))).catch(() => { });
  • 读取本地文件
    skills/dsh-ppt/scripts/build-deck.mjs:102
    function readJson(value) { return JSON.parse(value.startsWith('@') ? readFileSync(resolvePath(value.slice(1)), 'utf8') : value) }
  • 读取本地文件
    skills/dsh-ppt/scripts/build-deck.mjs:148
    content = readFileSync(resolvePath(content.slice(1)), 'utf8')
  • 读取本地文件
    skills/dsh-ppt/scripts/build-deck.mjs:149
    } else if (content.trim() !== '' && existsSync(resolvePath(content.trim()))) {
  • 读取本地文件
    skills/dsh-ppt/scripts/build-deck.mjs:151
    content = readFileSync(resolvePath(content.trim()), 'utf8')
  • 读取本地文件
    lib/skill.js:48
    const text = readFileSync(join(dir, 'SKILL.md'), 'utf8');
  • 读取本地文件
    lib/workbench.js:29
    const stat = lstatSync(path);
  • 读取本地文件
    lib/workbench.js:32
    return readFileSync(path);
  • 读取本地文件
    lib/workbench.js:79
    if (!existsSync(this.catalogPath))
  • 读取本地文件
    lib/workbench.js:81
    if (lstatSync(this.catalogPath).size > 8 * 1024 * 1024)
  • 读取本地文件
    lib/workbench.js:84
    for (const line of readFileSync(this.catalogPath, 'utf8').split('\n')) {
  • 写入本地文件
    lib/workbench.js:114
    mkdirSync(dirname(this.catalogPath), { recursive: true });
  • 读取本地文件
    lib/workbench.js:115
    if (existsSync(this.catalogPath) && lstatSync(this.catalogPath).size >= 8 * 1024 * 1024)
  • 写入本地文件
    lib/workbench.js:117
    appendFileSync(this.catalogPath, JSON.stringify(row) + '\n');
  • 发起网络请求
    lib/workbench.js:390
    async fetch(request) {
  • 发起网络请求
    lib/workbench.js:433
    host.connection?.fetch?.register({ path: PPT_WORKBENCH_ROUTE, methods: ['POST'], requestBody: 'buffered', fetch: (request) => workbench.fetch(request)
  • 读取本地文件
    skills/dsh-ppt/scripts/deck-data.mjs:30
    const path = resolve(cwd, input.path), stat = lstatSync(path)
  • 读取本地文件
    skills/dsh-ppt/scripts/deck-data.mjs:34
    content = readFileSync(path, 'utf8'); name = input.name || basename(path)
  • 读取本地文件
    lib/coaching.js:40
    const path = this.path(id), stat = lstatSync(path);
  • 读取本地文件
    lib/coaching.js:43
    const run = JSON.parse(readFileSync(path, 'utf8'));
  • 写入本地文件
    lib/coaching.js:53
    mkdirSync(this.directory, { recursive: true, mode: 0o700 });
  • 删除本地文件
    lib/coaching.js:67
    unlinkSync(path);
  • 写入本地文件
    lib/coaching.js:77
    writeFileSync(tmp, serialized, { flag: 'wx', mode: 0o600 });
  • 写入本地文件
    lib/coaching.js:78
    renameSync(tmp, destination);
  • 读取本地文件
    lib/coaching.js:81
    if (existsSync(tmp))
  • 删除本地文件
    lib/coaching.js:82
    unlinkSync(tmp);
  • 读取本地文件
    lib/coaching.js:94
    if (!existsSync(this.directory))
  • 读取本地文件
    lib/coaching.js:96
    return readdirSync(this.directory).filter(name => uuid(name.slice(0, -5)) && name.endsWith('.json')).flatMap(name => { try {
  • 写入本地文件
    lib/coaching.js:148
    mkdirSync(this.directory, { recursive: true, mode: 0o700 });
  • 读取本地文件
    lib/coaching.js:149
    if (this.list(context).length >= 20 || readdirSync(this.directory).filter(f => f.endsWith('.json')).length >= 200)
  • 删除本地文件
    lib/coaching.js:279
    throw new Error('请先停止当前调用 / Stop the active call first'); this.locked(run.id, () => unlinkSync(this.path(run.id))); return { removed: true }; }
  • 读取本地文件
    lib/visual.js:9
    const stat = lstatSync(path);
  • 读取本地文件
    lib/visual.js:12
    return readFileSync(path);
  • 写入本地文件
    lib/visual.js:42
    mkdirSync(this.directory, { recursive: true, mode: 0o700 });
  • 删除本地文件
    lib/visual.js:56
    unlinkSync(path);
  • 写入本地文件
    lib/visual.js:65
    writeFileSync(temp, data, { flag: 'wx', mode: 0o600 });
  • 写入本地文件
    lib/visual.js:66
    renameSync(temp, this.path(run.id));
  • 读取本地文件
    lib/visual.js:69
    if (existsSync(temp))
  • 删除本地文件
    lib/visual.js:70
    unlinkSync(temp);
  • 读取本地文件
    lib/visual.js:107
    if (!existsSync(this.directory))
  • 读取本地文件
    lib/visual.js:109
    return readdirSync(this.directory).filter(n => n.endsWith('.json') && uuid(n.slice(0, -5))).flatMap(n => { try {
  • 写入本地文件
    lib/visual.js:163
    mkdirSync(this.directory, { recursive: true, mode: 0o700 });
  • 读取本地文件
    lib/visual.js:164
    if (this.list(context).length >= 20 || readdirSync(this.directory).filter(n => n.endsWith('.json')).length >= 200)
  • 写入本地文件
    lib/visual.js:216
    mkdirSync(root, { recursive: true, mode: 0o700 });
  • 删除本地文件递归
    lib/visual.js:364
    rmSync(root, { recursive: true, force: true });
  • 删除本地文件
    lib/visual.js:366
    this.locked(run.id, () => unlinkSync(this.path(run.id)));
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/libreoffice-kit
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

界面预览

1 张 · 点击查看大图

功能亮点

  • 导出可编辑PPTX
  • 长表格自动分页

DSH 演示文稿插件:Markdown 生成网页放映与可编辑 PPTX,长表格自动分页,内置 5 套主题、备注与转场动画。

README

由 DeepSeek 最新模型翻译生成
dsh-ppt dsh-ppt 鲸鱼娘插件封面 把材料制作成可直接交付的 HTML 放映、可编辑 PPTX 与工程包。可在 DSH 工作台轻量编辑、核对数字来源和现场推演;AI 预审、模拟答辩与看图修复均按需选择,也可直接下载成品。 downloads total downloads 下载统计说明 欢迎使用,遇到问题或有改进建议,请提交 issues 和 PR。 从 DSH 原生侧栏打开工作台;配置与操作边界见工作台说明。 功能 - 工程库按关键词搜索,按最近 / 最早更新或标题排序;返回列表时保留筛选条件。 - 生成图文、表格、原生图表和品牌化演示文稿。 - 可选数字溯源与现场推演:点击数字追到原始材料、CSV 单元格或公式;调整假设、预览影响并确认保存。HTML 保留交互,PPTX 保存静态结果及公式 / 假设,见数据说明。 - 在设置页编辑文字和图片、调整顺序、复制或删除页面,并支持撤销。 - 提供质量检查与可选的最终 PPTX 图片 / PDF 渲染。 - 可选 AI 视觉检查:看实际 PPTX 图片,标记问题区域,调整排版并另存副本,重新渲染复查;支持前后对比、停止、撤销与检查记录。见看图修复。 - 下载按页整理的 Markdown 讲稿,保留当前版本的标题与演讲备注。
展开完整文档(README 剩余 1 节)
dsh-ppt

dsh-ppt 鲸鱼娘插件封面

把材料制作成可直接交付的 HTML 放映、可编辑 PPTX 与工程包。可在 DSH 工作台轻量编辑、核对数字来源和现场推演;AI 预审、模拟答辩与看图修复均按需选择,也可直接下载成品。

downloads total downloads

下载统计说明

欢迎使用,遇到问题或有改进建议,请提交 issues 和 PR。

从 DSH 原生侧栏打开工作台;配置与操作边界见工作台说明。

功能

- 工程库按关键词搜索,按最近 / 最早更新或标题排序;返回列表时保留筛选条件。
- 生成图文、表格、原生图表和品牌化演示文稿。
- 可选数字溯源与现场推演:点击数字追到原始材料、CSV 单元格或公式;调整假设、预览影响并确认保存。HTML 保留交互,PPTX 保存静态结果及公式 / 假设,见数据说明。
- 在设置页编辑文字和图片、调整顺序、复制或删除页面,并支持撤销。
- 提供质量检查与可选的最终 PPTX 图片 / PDF 渲染。
- 可选 AI 视觉检查:看实际 PPTX 图片,标记问题区域,调整排版并另存副本,重新渲染复查;支持前后对比、停止、撤销与检查记录。见看图修复。
- 下载按页整理的 Markdown 讲稿,保留当前版本的标题与演讲备注。
- 下载时可选「分享成品包」(PPTX、离线 HTML、当前讲稿)或「完整工程包」(含 JSON 工程)。分享包仍保留已绑定的来源摘录与用户填写内容,详见下载说明。
- 可选 AI 预审与模拟答辩:复用 DSH 已配置模型,按需提问、比较改稿、另存可撤销副本,并导出问答与待补充材料清单。默认关闭,直接下载成品无需预审。
- 键盘操作:Ctrl/⌘+S 保存、Esc 取消或返回、Alt+←/→ 切换页面;有未保存修改时离开会提示。

安装

桌面版可在「插件」面板按包名 dsh-ppt 安装。已配置 dsh 命令时也可使用:

dsh plugin --profile desktop add dsh-ppt

网页版把命令中的 desktop 改为 web。安装后重启 DSH。

开始使用

1. 在目标工作区提供材料、用途、听众和页数,例如“做成可交付的演示文稿,生成 HTML、PPTX 和工程文件”。
2. 从左侧栏打开“演示文稿”,在工程库搜索或选择生成的项目。
3. 选择页面编辑文字、图片或顺序,保存后核对预览;需要时渲染当前 PPTX 检查实际画面。
4. 按需要主动开启 AI 预审、模拟答辩或看图修复;直接下载成品不要求这些步骤。
5. 下载“分享成品包”交付,或下载“完整工程包”保留编辑能力;在目标播放器或 Office 中再核对一次。

Office 中的修改不会同步回 JSON。插件检测到成品在外部修改,或旧工程没有校验记录时,会拒绝直接覆盖;可用面板「另存副本」或 ppt_edit(saveAs:true) 从 JSON 生成新文件,保留原成品。副本不包含 Office 手工修改。

成品页下方可主动开启「AI 预审」或「模拟答辩」。前者根据材料模拟质疑与回答,后者由 AI 一次问一题、你来回答。可以先选模型、听众、强度和范围,再决定是否发送。具体流程与调用上限见演练说明。AI 建议不等于事实核验;普通成品生成、编辑和下载仍不要求配置模型。

依赖与配置

普通生成不需要 Office。最终 PPTX 渲染使用可选的官方 LibreOffice Kit;依赖版本、字体环境和安装方法见使用说明。

详细配置、工具参数与排错见使用说明。从源码独立开发时,Node 要求以 package.json 为准。

文档

- 使用与排错
- 更新记录
- 验证范围与历史记录
- 问题反馈与功能建议

插件更新

需要 DSH 0.2.1-rc.3 或更新版本。更新控件直接位于原有工作台内容末尾;没有工作台的插件,位于原生插件详情页底部。检查、更新记录和偏好在原地展开,不增加独立更新页面或设置菜单。自动检查默认开启;自动安装默认关闭,明确授权后才会在空闲且没有未保存修改时安装兼容的稳定补丁。开关按插件独立保存,可关闭、推迟或忽略提醒;不会强制重启 DSH、升级 DSH 本体或替换本地源码安装。Suite 组件在当前页面底部明确说明并操作 Suite 整包更新。

旧版用户先在官方插件管理中手动更新一次,之后才会获得此入口。发布到 npm 不会直接替换用户已经安装的版本。

License

MIT
预览分享卡片长什么样 ↓STARDUSTLC666/dsh-ppt
分享 · DeepSeek Harness Hub
STARDUSTLC666/dsh-ppt

DSH 演示文稿:HTML / 可编辑 PPTX / 工程包、工程检索与轻量编辑、数字溯源和现场推演,可选 AI…

回到顶部