---
name: edulab
description: "面向中高考数学的可视化解题工具：空间几何题生成可交互 3D 解题演示（建系向量法 + sympy 校验 + Three.js），函数表达式生成参数可控的 2D 图形（滑块实时联动）。产物为单文件自包含交互式 HTML。适用：用户给出立体几何题要 3D 演示解题步骤、要函数图像并能拖滑块看参数变化、要数学可视化教学素材。触发词：/edulab、立体几何、空间几何题、线面角、二面角、点到平面距离、异面直线距离、外接球、内切球、三视图、函数图像、函数可视化、二次函数、数学可视化。用法：/edulab <题目或函数>。"
---

# edulab

## Purpose

中高考数学可视化：把中文立体几何题或函数表达式，变成单文件、可离线打开、可交互的 HTML 演示。几何走"读题 -> spec JSON -> 建系向量法求解（sympy 校验）-> Three.js 场景"；函数走"函数族 + 参数 -> Canvas2D 绘图 + 参数滑块实时联动"。

## When to Use

- 用户给出立体几何题（中高考风格），需要 3D 演示解题过程。
- 用户想要函数图像，并希望调参看变化（滑块联动）。
- 用户需要离线可开的数学可视化教学素材。
- 触发词：`/edulab <题目或函数>`、立体几何、空间几何题、线面角、二面角、外接球、内切球、三视图、函数图像、数学可视化。

## When NOT to Use

- 用户要的是概念讲解而非数学演示 -> 交给 `teach-eli5`（可视化教学页）。
- 用户要设计课程或教案 -> 交给 `curriculum-design`。
- 用户要信息卡片、封面等设计产物 -> 交给 `infocard` / `mckinsey-cover`。
- 题目超出 13 种 query.type 覆盖范围 -> 先说明不支持，不要硬套近似题型交付。

## Workflow

> **路径约定**：下文 `<skill>` 指本技能安装目录（如 `~/.claude/skills/edulab`）。运行脚本前先 `cd` 到该目录，或替换为实际路径。Python 需装 sympy（建议 `python3 -m venv .venv && .venv/bin/pip install sympy`）。

### 几何模块

1. 读题，确定立体类型与参数，写入 spec JSON（契约见 `references/schema.md`；题型清单见 `references/taxonomy.md`）。
2. 求解：
   ```
   cd <skill>/scripts/geometry
   python3 geometry_solver.py <spec.json> <scene.json>
   ```
   检查 steps 与 result 是否与标准答案一致；不一致则修 spec 重跑，不得静默交付错误答案。
3. 生成 HTML（`--offline` 内联 Three.js，无网环境可打开）：
   ```
   python3 build_html.py <scene.json> <out.html> [--offline]
   ```
4. 用 `present_files` 打开 out.html。

### 函数模块

1. 确定函数族（quadratic / linear / inverse / trig / exp / log / power，或 custom 自由表达式、multi 多曲线对比）。
2. 生成 scene：
   ```
   cd <skill>/scripts/function
   python3 function_engine.py <family> <params.json> <scene.json>
   ```
3. `python3 build_html.py <scene.json> <out.html>`，然后用 `present_files` 打开。

完整命令配方见 `examples/quickstart.md`。

## Decision Rules

- 输入是立体几何题 -> 几何模块；输入是函数/表达式/参数 -> 函数模块；两者混合 -> 拆成两个产物分别生成。
- `query.type` 支持 13 种：line_plane_angle / line_line_angle / dihedral_angle / point_plane_distance / volume_tetra / parallel_perp / skew_distance / circumsphere / insphere / three_views / surface_shortest_path / net / surface_volume。
- 立体支持 8 种：cube / cuboid / tetra / prism3 / pyramid4 / cylinder / cone / sphere。
- 自定义表达式（custom）-> params 传 `{"expr": "sin(x)/x"}`，只走 `safe_expr.py`，非法输入直接拒绝。
- 多曲线对比（multi）-> params 传 `{"items": [{"expr":..., "label":...}]}`。
- 需要 JSON 契约字段 -> 读 `references/schema.md`。
- 需要确认某题型/函数族/立体是否支持 -> 读 `references/taxonomy.md`。
- 需要架构决策、阶段规划或已知边界 -> 读 `references/design.md`。
- 无网环境 -> 必须加 `--offline`，否则 CDN 版打不开。

## Constraints

- **几何答案必须经 sympy 计算并独立核验，不符不交付**；禁止用手算或近似值糊弄。
- **前端零求值**：自由表达式只允许走 `safe_expr.py`（禁 `eval`/`Function`）。
- **scene JSON 是唯一中间契约**：模板只消费 scene，不得在模板里写求解逻辑。
- 文件写入禁 Box Drawing 等 Unicode 装饰字符（防乱码）；中文标签走 DOM/Canvas 文本。
- 离线打包依赖 `assets/vendor/three.min.js`、`assets/vendor/OrbitControls.js`、`assets/vendor/CSS2DRenderer.js`（`--offline` 时内联）。
- 产出 HTML 写到用户指定路径或工作目录，不要写回技能目录。

## Priority

1. 答案正确性 > 交付速度：sympy 校验不一致时先修 spec，绝不静默交付。
2. 安全 > 便利：自由表达式只走 `safe_expr.py`，任何绕过解析器的写法都禁止。
3. 离线可开 > 产物体积：无网环境优先 `--offline`，接受约 +630KB 内联开销。

## Stop Conditions

- 同一 spec 最多修正并重跑 3 次；仍与标准答案不一致则报告差异、列出已尝试的 spec，不交付错误答案。
- 题型不在 13 种之内且无法拆解为多步查询 -> 停止并说明限制，不近似硬套。
- 用户只要求"先看效果" -> 跑通一个样例即可，不继续扩展全部题型。

## Verification

交付前逐项确认：

- [ ] steps 与 result 已与标准答案核对一致（几何）。
- [ ] scene JSON 结构符合 `references/schema.md`。
- [ ] HTML 为单文件自包含，浏览器直接打开可交互。
- [ ] 无网环境已用 `--offline` 验证可打开。
- [ ] 自由表达式经 `safe_expr.py` 解析，注入样例被拒绝。
- [ ] 产物与模板文件内无 U+FFFD、无 Box Drawing 字符。
- [ ] 已用 `present_files` 向用户展示产物。

## Output

- **Outcome**：一个单文件交互式 HTML —— 几何为可旋转的 3D 解题演示（含步骤与精确结果），函数为带参数滑块、实时联动的 2D 图形。
- **Done when**：HTML 已生成并展示，且通过 Verification 清单（几何另需 sympy 校验一致）。
- **Evidence**：`scene.json`（中间契约）+ `out.html`；几何产物含 steps 数组与精确值/数值双结果；函数产物含参数滑块与联动性质（顶点/零点/渐近线等）。

## References

按需加载，不要预先全读：

- `references/schema.md` — 写 spec 或读取 scene、需要字段契约时读。
- `references/taxonomy.md` — 需要确认题型 / 函数族 / 立体的支持状态时读。
- `references/design.md` — 需要架构决策、渲染要点、阶段规划、验证记录或已知边界时读。

## Examples

按需加载：

- `examples/quickstart.md` — 第一次跑通或需要完整命令配方与样例清单时读。
- 几何样例 spec：`examples/geom_line_plane_angle.json`、`examples/geom_line_line_angle.json`、`examples/geom_dihedral_angle.json`、`examples/geom_point_plane_distance.json`、`examples/geom_skew_distance.json`、`examples/geom_volume_tetra.json`、`examples/geom_parallel_perp.json`、`examples/geom_circumsphere.json`、`examples/geom_insphere.json`、`examples/geom_three_views.json`、`examples/geom_net.json`、`examples/geom_surface_path.json`、`examples/geom_surface_volume.json`、`examples/geom_pyramid_apex_angle.json` — 需要构造同类题目时读，改造其 solid/params/query 即可。
- 函数样例 spec：`examples/func_quadratic.json`、`examples/func_custom.json`、`examples/func_multi.json` — 需要函数产物的参数写法时读。

## Scripts

按调用链使用，不要跳步：

- `scripts/geometry/geometry_solver.py` — `python3 geometry_solver.py <spec.json> <scene.json>`；返回 scene JSON（points/edges/steps/result 等）。
- `scripts/geometry/build_html.py` — `python3 build_html.py <scene.json> <out.html> [--offline]`；返回单文件 HTML 路径。
- `scripts/geometry/solids.py` — 立体积木库（8 种立体的参数化标准顶点 labeling 与 edges）；新增立体在此加 vertices/edges。
- `scripts/geometry/template_3d.html` — Three.js r128 + CSS2DRenderer 中文标签模板，含数据注入占位。
- `scripts/function/function_engine.py` — `python3 function_engine.py <family> <params.json> <scene.json>`；返回函数 scene JSON，支持 custom 与 multi。
- `scripts/function/build_html.py` — `python3 build_html.py <scene.json> <out.html>`；返回单文件 HTML（前端零求值）。
- `scripts/function/function_families.py` — 7 个函数族的参数定义（默认/范围/步长）；新增函数族在此加项。
- `scripts/function/safe_expr.py` — 递归下降 AST 安全表达式解析器；`SafeExpr(expr).eval({"x": v})`。
- `scripts/function/template_2d.html` — Canvas2D + 参数滑块模板，含 `f()` / `computeProps()` 分支。

## Related Skills

- `teach-eli5` — 把概念讲给外行听的教学页；本技能产出可交互演示，它产出图文讲解。
- `curriculum-design` — 课程与教案设计，本技能可作为课堂互动素材。
- `grasp` — 十维认知框架与学习路线图，用于学习者的系统自学。
