dsh-kid-coder
Verified@kidlab/dsh-kid-coder · v0.2.0 · MIT · Web UI
给小朋友的编程学习启蒙插件:一个包 = 一张 🐵「小教室·跑代码」卡片(真跑 Python/海龟画图)+ 五个模型工具(kid_run / kid_explain / kid_practice / kid_review / kid_steps),零第三方依赖、无构建步骤。
Install
dsh plugin add @kidlab/dsh-kid-coder Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Tags
Creators
Readme
dsh-kid-coder · 给小朋友的编程学习启蒙插件(🥇 kidlab 系列第 1 个)
为 DeepSeek Harness(@deepseek-ai/dsh-*,Cordis 插件框架)写的小插件:
把「解释概念、出题、改作业、拆步骤、真的跑代码看效果」变成小朋友听得懂、有兴趣的对话。
背景:给家里 5-18 岁的小朋友做编程入门辅导(配合《成都小学生计算机考试与竞赛》—— 低龄走 GESP / 趣味入门,学 Python/海龟画图打基础)。这个插件就是那个“老师”, 还有个能“点按钮跑代码、马上看到输出和海龟画图”的 🐵 小教室面板。
形态:一个包 = 一行插件(
dsh.bundle+dsh.client同存)。 发布物 9 个文件、零构建步骤(纯 ESM,index.js/tools.js/client.js+python/)。
它能干什么
装载后,harness 会多出 5 个工具 + 一张可折叠的常驻卡片:
| 工具 | 作用 |
|---|---|
kid_run |
真的在沙箱里跑一段 Python(含海龟画图),返回输出 + 是否出图 |
kid_explain |
用生活比喻 + 极简示例解释一个概念或一小段代码 |
kid_practice |
出一套带故事情境的编程练习题,含脚手架提示 |
kid_review |
温和地检查交上来的代码:先夸、一次只给一个改进点、给 ⭐ |
kid_steps |
把大目标拆成 3-5 个能立刻得到反馈的小步骤 |
前端卡片「🐵 小教室」:输入条上方常驻、可折叠。写代码 → 点「跑一下」→ 就地显示控制台输出和海龟画出来的 SVG 图形(/ matplotlib PNG)。打开会自动跑一个 五角星示例,让小朋友一进来就看到“哇,出图了”。
设计要点:
- 4 个教学工具只产出“脚手架 + 语气约束”,真正的讲解由模型完成,零依赖、零改文件,非常安全。
kid_run才是真的执行:macOS 上用sandbox-exec降权(禁网络、禁写临时目录以外)+python3 -I隔离模式 + 8 秒硬超时护栏,跑不完自动叫停。若沙箱在本环境不可用,自动去掉沙箱重跑一次。- 图形:本项目自带一个纯 Python 的 SVG 海龟记录器(
python/kidturtle.py), 不依赖 tkinter/matplotlib(Homebrew python 也没装 tkinter),headless 也能出图; matplotlib 若装了则顺带产出 PNG。图形输出为 base64 data URI,前端<img>内联显示。
目录结构
plugin-kid-coder/
├─ package.json # 契约核心:main/exports + dsh.bundle.patch + dsh.client
├─ cordis.patch.yml # 装载行:只 insert 一行 kid-coder
├─ index.js # host 半部:注册 5 个工具(子注入 tools)+ POST /kid-coder/run 路由
├─ tools.js # 5 个工具定义(普通对象,不 import 任何 dsh 包)+ kid_run 的沙箱执行器
├─ client.js # client 半部:🐵 小教室卡片(IIFE + __ModuleLoader__.load + fetch)
├─ python/ # 前端/模型共用的 Python 运行层(随包发布)
│ ├─ kidturtle.py # 纯 Python SVG 海龟记录器(注入成 turtle 模块)
│ ├─ kidrunner.py # 沙箱执行器:跑代码 → 捕获 stdout + 图形 → base64(JSON)
│ └─ kid.profile # sandbox-exec 降权 profile(deny network/写保护)
├─ verify.mjs # 本地自测(契约 + 五工具 + 路由 GET/POST + 沙箱跑码)
└─ legacy/old-dynamic-plugin/ # 旧「动态创作插件」存档(src/、lib/、cordis/、example/,不发布)
配置项(行 config)
在安装行上按需覆盖(默认值即下表第二列;不写 config 就是全默认):
| 字段 | 默认 | 说明 |
|---|---|---|
kidName |
小伙伴 | 称呼小朋友的名字 |
age |
8 | 5-18,决定讲解复杂度 |
language |
zh | 讲解语言 zh / en |
level |
beginner | 初始难度 beginner / intermediate |
gamified |
true | 是否积分(⭐)式鼓励 |
favoriteTopic |
空 | 偏好主题,例如 海龟画图 |
runTimeoutSec |
8 | 跑代码超时(1-30 秒) |
sandbox |
true | 是否用 sandbox-exec 隔离跑代码 |
enabled |
true | 是否注册工具(关掉后卡片仍在) |
改默认值在自己的用户层 ~/.dsh/cordis.patch.yml 里按 id 覆盖(别改本包的 patch):
- id: kid-coder
config: { kidName: 想想, age: 8, runTimeoutSec: 12 }
kid_run 的 macOS 沙箱策略
macOS 没有 Docker 式沙箱。这里用 三层兜底 应对“小朋友自己写的代码”这种低威胁模型:
- 降权:
sandbox-exec -f kid.profile——(deny default)+ 禁网络 + 只读系统库 + 只允许写临时目录。这是 macOS 内置的穷人沙箱,实测可用(不可用时自动降级为不套沙箱重跑)。 - 护栏:
python3 -I隔离模式(忽略 site-packages 与环境变量)+ Python 侧 8 秒看门狗 (threading.Timer+os._exit,绕开 GNU timeout 缺失问题)+ base64 传源码防 shell 注入。 - 封闭:只留 stdlib,图形用自带 SVG 记录器,不联网、不弹窗。
取舍:这只为保证“自家小孩玩得安全”,不是真正的安全边界。若将来要开放给陌生人的 代码,需要再上 Docker / 云端 Piston 之类的真沙箱。
怎么装载
静态 bundle,一条命令装进某个 profile(推荐,持久):
plugin_manager { action: "install_bundle", target: "/Users/baixiao/Code/deepseek-harness-dev/plugin-kid-coder" }
# 或命令行等价:dsh plugin --profile web add /Users/baixiao/Code/deepseek-harness-dev/plugin-kid-coder
- 成功的判据是返回里出现
"application": "applied"; - ⚠️ 安装本包前,用户层
~/.dsh/cordis.patch.yml里不能再有kid-coder的 insert 行 (同 id 会冲突),改成上面的「按 id 覆盖」写法; - ⚠️ 首次进客户端模块表需要重启
dsh web(会终止当前会话),内容改动只需刷新页面。
本地自检(无需 dsh):
node verify.mjs # 契约 + 五工具 + 路由 GET/POST + 沙箱跑码,全绿退出码 0
许可
MIT。