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

几何画板生成器 Jack7510/ggb-plugins

DeepSeek Harness
Jack75106 天前有提交已提供中文文档扫描:含敏感能力

把文字或图片中的二维数学题变成可交互的 GeoGebra 文件。宿主 AgentCodex、DeepSeek…

31.5/100
综合分
2
GitHub 星标
—
npm 周下载
—/5
用户评分

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

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add Jack7510/ggb-plugins
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

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

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

读写/删除本地文件发起外部网络请求
查看扫描证据(共 55 处,展示前 42 条)
  • 读取本地文件
    dsh/executor.js:21
    const json = async path => JSON.parse(await readFile(path, 'utf8'));
  • 读取本地文件
    dsh/executor.js:29
    const info = await lstat(path);
  • 读取本地文件
    dsh/executor.js:33
    const bytes = await readFile(path);
  • 读取本地文件
    dsh/executor.js:57
    const info = await lstat(preview);
  • 读取本地文件
    dsh/executor.js:113
    assert.equal(hash(await readFile(context.baseRef)), context.baseSha256);
  • 读取本地文件
    dsh/executor.js:124
    assert.equal(hash(await readFile(context.baseRef)), context.baseSha256,
  • 读取本地文件
    dsh/index.js:22
    const has = (root, entry) => existsSync(join(root, entry));
  • 读取本地文件
    dsh/index.js:102
    const description = parseSkill(readFileSync(skillPath, 'utf8'), skillPath).description;
  • 读取本地文件
    dsh/index.js:117
    const raw = await readFile(skillPath, { encoding: 'utf8', signal: requestOptions?.signal });
  • 读取本地文件
    dsh/installation.js:24
    const read = file => JSON.parse(readFileSync(join(root, file), 'utf8'));
  • 读取本地文件
    dsh/installation.js:30
    .update(readFileSync(workerSkill)).digest('hex');
  • 读取本地文件
    dsh/installation.js:46
    if (!statSync(join(root, path)).isFile()) {
  • 读取本地文件
    dsh/installation.js:69
    const raw = readFileSync(installation.workerSkill, 'utf8');
  • 读取本地文件
    dsh/installation.js:88
    const runtime = JSON.parse(readFileSync(
  • 读取本地文件
    dsh/installation.js:98
    if (!statSync(file).isFile() || statSync(file).size === 0) {
  • 读取本地文件
    src/atomic-file.ts:22
    const previous = await lstat(path).catch(error => {
  • 写入本地文件
    src/atomic-file.ts:37
    await rename(temporary, path);
  • 删除本地文件
    src/atomic-file.ts:48
    await rm(temporary, {force: true}).catch(() => {});
  • 读取本地文件
    src/browser.ts:89
    const lock = JSON.parse(await readFile(resolve(root, 'runtime.lock.json'), 'utf8')) as { version: string; sha256: string };
  • 读取本地文件
    src/browser.ts:90
    const installed = JSON.parse(await readFile(resolve(root, '.runtime/runtime.json'), 'utf8')) as typeof lock;
  • 发起网络请求
    src/browser.ts:122
    await Promise.race([context.route('**/*', route => route.request().url().startsWith(service.url + '/') ? route.continue() : route.abort()), aborted]);
  • 写入本地文件
    src/delivery.ts:32
    const save = (path: string, value: unknown) => writeFile(path, json(value));
  • 读取本地文件
    src/delivery.ts:34
    const info = await stat(path);
  • 读取本地文件
    src/delivery.ts:37
    return JSON.parse(await readFile(path, 'utf8'));
  • 写入本地文件
    src/delivery.ts:139
    await mkdir(request.outputDir, { recursive: true });
  • 写入本地文件
    src/delivery.ts:145
    await mkdir(context.temp);
  • 写入本地文件
    src/delivery.ts:146
    await writeFile(join(context.run, 'request.json'), context.requestBytes);
  • 读取本地文件
    src/delivery.ts:176
    const bytes = await readFile(join(context.temp, context.file));
  • 写入本地文件
    src/delivery.ts:318
    await mkdir(request.outputDir, { recursive: true });
  • 写入本地文件
    src/delivery.ts:324
    await mkdir(context.temp);
  • 读取本地文件
    src/delivery.ts:768
    const bytes = await readFile(join(delivery, base.file));
  • 读取本地文件
    src/delivery.ts:841
    const bytes = await readFile(join(delivery, base.file));
  • 读取本地文件
    src/delivery.ts:882
    assert.equal(sha256(await readFile(join(delivery, 'request.json'))), manifest.requestSha256, 'Request checksum mismatch');
  • 读取本地文件
    src/doctor.ts:45
    const lock = JSON.parse(await readFile(join(root, 'runtime.lock.json'), 'utf8'));
  • 读取本地文件
    src/doctor.ts:46
    const pkg = JSON.parse(await readFile(join(root, 'package.json'), 'utf8'));
  • 读取本地文件
    src/ggbfile.ts:138
    const info = await stat(path).catch(() => {
  • 读取本地文件
    src/ggbfile.ts:147
    const bytes = await readFile(path);
  • 写入本地文件
    src/naming.ts:74
    await mkdir(directory);
  • 读取本地文件
    src/runtime-compatibility.ts:82
    const original = await readFile(path);
  • 读取本地文件
    src/server.ts:55
    const path = await realpath(
  • 读取本地文件
    src/server.ts:95
    let data: Buffer = await readFile(asset.path);
  • 读取本地文件
    src/server.ts:128
    const runtime = await realpath(runtimeDirectory);
扫描于 2026/11/2(1 天前) · 范围 全包扫描 · 来源 GitHub 仓库

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

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

README

由 DeepSeek 最新模型翻译生成
ggb-plugins 把文字或图片中的二维数学题变成可交互的 GeoGebra 文件。宿主 Agent(Codex、DeepSeek Harness 或 WorkBuddy)理解题意并编写原生 Algebra/CAS 程序;本项目在本地执行、逐条件核验、导出 .ggb、重新加载,并交付文件、核验报告和截图。 支持中文和英文。Agent 根据你的偏好和上下文选择工作语言,保留题目原文,且只分析条件与构图方法,不替你给出题目答案。 演示 拖动 C 时圆周角保持为圆心角的一半 拖动 C 时,圆周角保持为圆心角的一半;构造、依赖和核验结果同步更新。 需要什么 | 依赖 | 用途 | | Codex、DeepSeek Harness(DSH)或 WorkBuddy | 理解题意并编写原生 GeoGebra 程序 | | Node.js 22+ 与 pnpm 11 | 运行本地 CLI、准备依赖 | | curl 与 unzip | 下载并解压固定版本的 GeoGebra 运行时 | | Google Chrome 或 Microsoft Edge | 核验时以 headless 方式驱动 applet | 不需要额外模型密钥。安装需要网络;GeoGebra 与浏览器不随包再分发。构建发布包时另外使用 zip、tar 与 npm。
展开完整文档(README 剩余 1 节)
ggb-plugins

把文字或图片中的二维数学题变成可交互的 GeoGebra 文件。宿主 Agent(Codex、DeepSeek Harness 或 WorkBuddy)理解题意并编写原生 Algebra/CAS 程序;本项目在本地执行、逐条件核验、导出 .ggb、重新加载,并交付文件、核验报告和截图。

支持中文和英文。Agent 根据你的偏好和上下文选择工作语言,保留题目原文,且只分析条件与构图方法,不替你给出题目答案。

演示

拖动 C 时圆周角保持为圆心角的一半

拖动 C 时,圆周角保持为圆心角的一半;构造、依赖和核验结果同步更新。

需要什么

| 依赖 | 用途 |
| Codex、DeepSeek Harness(DSH)或 WorkBuddy | 理解题意并编写原生 GeoGebra 程序 |
| Node.js 22+ 与 pnpm 11 | 运行本地 CLI、准备依赖 |
| curl 与 unzip | 下载并解压固定版本的 GeoGebra 运行时 |
| Google Chrome 或 Microsoft Edge | 核验时以 headless 方式驱动 applet |

不需要额外模型密钥。安装需要网络;GeoGebra 与浏览器不随包再分发。构建发布包时另外使用 zip、tar 与 npm。

安装

当前版本为 v0.8.5,提供 Codex ZIP 与 DSH npm 包;WorkBuddy ZIP 由同一源码通过 pnpm pack:workbuddy 构建,尚未发布。
三个包都未提交公共插件目录,但 Release 归档可直接安装;版本说明见 0.8.5 发布记录。

- Codex:安装与升级说明。
- DSH:独立 headless profile 安装说明。
- WorkBuddy:插件安装与使用说明。

DSH bundle 已发布到 npm:

profile=desktop # DSH 插件中心或 Web 宿主改为 web
dsh plugin --profile "$profile" add ggb-plugins-dsh@0.8.5
node ~/.dsh/profiles/$profile/node_modules/ggb-plugins-dsh/scripts/setup-plugin.mjs

桌面用户可以把这一句安装指令粘贴到 DSH 对话框,由 DSH 代为安装。

想在 DSH 中浏览并安装,启用 Experimental plugins → Custom plugin markets,然后在 Discover → Add index source 添加:

https://cdn.jsdelivr.net/gh/Jack7510/ggb-plugins@main/docs/market/index.json

三个客户端各自安装,共用同一套执行与核验管线。三份说明都以运行依赖准备(setup-plugin,会报告实际使用的浏览器)和就绪检查(doctor)结束。

第一道题

启用插件后,在新的宿主会话中直接描述题目,图片可以随题附上。

用 GeoGebra 作三角形 ABC,取 AB 的中点 M,连接 CM,把中线标红。拖动 A 验证中点和中线联动,保存文件并打开交互预览。

构造、重载和全部自动核验都以 headless 运行,不打开中间窗口。失败或无法核验的必需条件会阻止交付,而不是被跳过;失败会保留诊断,便于下一轮修正。必要条件缺失或歧义时 Agent 先澄清;未指定坐标时它会说明自行选择的初始构型。Agent 可以自行决定什么、不能决定什么,见 Skill。

你会得到什么

成功运行写出一个交付目录:

| 文件 | 用途 |
| <题目>.ggb | 按题目命名的原生文件,可在 GeoGebra 中打开、查看并继续编辑 |
| verification.json | 逐条件结果:构造、重载与交互样本 |
| preview.png | 交付构型截图 |
| request.json、manifest.json | 输入留档与交付清单 |

报告会说明实际执行了哪些检查、有限交互样本覆盖到哪里,不会声称构成一般性证明。

交付目录位于 <outputDir>/<题目>/delivery/;<题目> 同时是 GGB 文件名,同名题目自动追加 -2、-3,不覆盖旧文件。

交互预览

预览加载同一份交付的 GGB,支持适用的点拖动、参数变化与缩放,且不回写交付文件。预览进程在页面加载后自动退出,窗口继续可用;需要重新加载时再执行一次 preview;一次性宿主退出后进程可能被回收。自动复核加 --headless。

直接使用 CLI

宿主会替你调用这个 CLI,其他本地工具也可以直接驱动:

node <installed-plugin>/dist/src/cli.js doctor
node <installed-plugin>/dist/src/cli.js inspect --ggb /absolute/base.ggb
node <installed-plugin>/dist/src/cli.js build --request /absolute/request.json
node <installed-plugin>/dist/src/cli.js preview --delivery /absolute/delivery

已有 GGB 需要改颜色、线型、填充、可见性,或继续构造(增加对象、修改独立数值或坐标)时,在请求中声明 base;inspect 列出对象清单、当前值以及请求必须写入的摘要。删除、重命名和视图修改不支持。请求编写方式见 能力契约。

从源码运行

先满足上表依赖,然后:

pnpm install --frozen-lockfile
pnpm setup:runtime
pnpm build
pnpm demo

pnpm demo 会把内置三角形示例构造到 output/。验证与维护命令、Agent 的工作规则以及发布流程都在 AGENTS.md,这里不重复。

仓库结构

- src/:CLI、执行、核验与交付管线。
- viewer/:承载 GeoGebra applet 的本地页面。
- skills/:各宿主共用的 Skill。
- codex/、dsh/、workbuddy/:各宿主的插件资产、安装说明与验收记录。
- examples/、tests/:可运行输入与回归用例。
- scripts/:依赖准备、三种打包与覆盖记录工具。
- docs/:需求与设计、重要修改记录与跨客户端验收记录;历史阶段结果见归档索引。

支持范围与边界

- 支持:二维几何、函数、方程、微积分、列表矩阵与统计,中英文均可。
- 不支持:三维构图、无法声明基线的外部 GGB 续题、一般数学证明。
- 原生命令可以接入,不等于全部命令与重载都已验收;边界见 命令覆盖记录。
- 数值采样与未决 CAS 结果是证据,不是证明。

项目采用 MIT 许可,源码位于 github.com/Jack7510/ggb-plugins。GeoGebra 的独立许可与归属见 第三方说明。
预览分享卡片长什么样 ↓Jack7510/ggb-plugins
分享 · DeepSeek Harness Hub
Jack7510/ggb-plugins

把文字或图片中的二维数学题变成可交互的 GeoGebra 文件。宿主 AgentCodex、DeepSeek…

这是你的仓库?认领条目

回到顶部