18 KiB
name, description
| name | description |
|---|---|
| class-feedback-report | 按班组整理 OJ 课堂反馈:自动定位课程与章节、拉取全班逐生逐次提交(代码+编译报错+状态),产出「第N次提交错在哪 → 整体分析 → 建议」的学生诊断报告草稿(MD+HTML+PDF),供带班教师审核后使用。老师说「引导我进行操作」「帮我处理本项目」「整理课堂反馈」「学生分析报告」时使用本技能;引导模式会带着老师一步步完成环境检查、账号配置与报告生成。 |
Skill: 班级课堂反馈与提交诊断
按班级生成每位学生的提交诊断报告(第一次提交错在哪、第二次错在哪……整体分析、建议), 数据全部来自 HydroOJ 课程插件的只读 API,评价与建议由 AI 起草、教师审核后才能发给学生/家长。
关键词:课堂反馈、提交诊断、错误分析、班级报告、学生分析、整理反馈、引导我进行操作、帮我处理本项目
操作引导模式(老师第一次使用,或说「引导我进行操作」「帮我处理本项目」时从这里开始)
面向不熟悉命令行的老师:AI 按下面清单逐步执行并代替老师敲命令,每完成一步简短汇报再进行下一步。 老师只需要回答问题(用哪个站、账号密码、哪个班级)。
- 仓库准备(第一次必做,老师只回答问题):问老师姓名/工号 → 仓库地址默认
https://git.qonnwolf.com/<工号>/ClassFeedback(机构仓库名统一 ClassFeedback, git 服务 git.qonnwolf.com)。- 已有本地克隆 → 进入仓库目录
git pull; - 没有 → 引导老师在 git.qonnwolf.com 网页生成访问令牌(设置 → 应用 → 访问令牌,
勾选 repository 读写),令牌让老师填进仓库根
.env的GIT_TOKEN(见第 3 步), 然后git clone https://git.qonnwolf.com/<工号>/ClassFeedback(公共克隆不需要令牌, 推送时才用),新老师还没有仓库 → 引导网页建仓(名字必须是 ClassFeedback)或 本地git init+remote add origin+ 首推; - 结构自检:
.claude/memory/class/、skills/class-feedback-report/、AGENTS.md、CLAUDE.md、.gitignore、.env缺失则按包内repo-template/补建 (.env从.env.example复制,填好后永不入库)。
- 已有本地克隆 → 进入仓库目录
- 环境自检(自动执行,无需老师操作):
node -v需 ≥18;确认本 skill 的scripts/fetch-class-data.mjs、scripts/check-login.mjs、scripts/mkpdf.mjs存在; Windows 确认 Edge 已安装(PDF 用)。有缺项先解决缺项再继续。 - 配置凭据(.env,一次性;站点固定为 qonnwolf):脚本自动读取仓库根
.env, 请老师自行编辑填写以下字段(推荐老师自己填,密码不经过对话;老师愿意口述时 AI 可代填,填完提醒「.env 不入库」):填好后运行OJ_BASE_URL=https://oj.qonnwolf.com OJ_USERNAME=你的OJ用户名 OJ_PASSWORD=你的OJ密码 GIT_USER=你的工号 GIT_TOKEN=你的访问令牌 GIT_REPO_URL=https://git.qonnwolf.com/你的工号/ClassFeedbacknode scripts/check-login.mjs(脚本自动读 .env,无需命令行传凭据)验证; 输出OK|登录成功…才继续;失败按「异常处理」回应老师。 令牌的 git 配置一次性执行:git remote set-url origin https://<GIT_USER>:<GIT_TOKEN>@git.qonnwolf.com/<工号>/ClassFeedback(存在本地 .git/config,不入库),之后git push不再需要令牌。 - 收集班级组名:请老师提供完整班组名(如「克力周日0830CSP02」)。
老师不确定时:先跑 fetch(不带 --group 会报错,带 --group 才扫课程),或用
GET /course/api/list列出课程标题让老师指认,再从课程页确认组名。 - 确认章节与花名册(先取小组成员,再分析):跑 fetch 后,向老师展示并请其确认:
「班组-课次号」标识(如 克力周日0830CSP02-04)、章节名、班组花名册(N 人 + 姓名列表),
以及班组花名册(N 人 + 姓名列表)。老师确认无误后才进入逐生分析写报告;成员有出入时先解决报名/分组问题。
⚠️ 报告编号用「课次号」(第几次课),不用 OJ 章节号——章节号(章节标题前缀数字,如「03 二维数组」)
是教材进度,课次号是实际上课序数,两者常差 1~2,混用会与内部正本
YYYYMMDD_课程编号-课次.md对不上。 - 执行生成(每个学生五件事,缺一不可):
① 家长版报告 md/html →
.claude/memory/class/<班组>/<学生名>/<姓名>-<班组>-<课次号>-反馈报告.{md,html}; ② PDF 同目录本地生成(git 忽略,不入库); ③ 内部课评正本 → 同目录feedback/YYYYMMDD_课程编号-课次.md(校宝核查口径:每位学生每次课有且仅有一个文件;请假加(请假)、补课加(补课-去XX); 内容为简明事实:日期、班组、状态、本讲要点、订正情况); ④ 更新画像 →.claude/memory/class/<班组>/<学生名>/profile.md(追加本讲表现要点、刷新能力评估); ⑤ 班级汇总 →.claude/memory/class/<班组>/summaries/YYYYMMDD_班组-课次号_班级反馈.md。 - git 同步:
git add .claude/memory/class .claude/skills docs(*.pdf 被 .gitignore 自动排除)→git commit -m "课评: <班组>-<课次号> <日期>"→git push; 推送失败(令牌过期/无权限)→ 引导老师重新生成令牌并更新凭据。 - 交付:汇报每个学生三件套的文件路径 + 内部正本 + 画像更新情况 + 班级汇总, 并明确提醒:家长版报告是草稿,审核措辞后才能发学生/家长。
异常处理(引导模式中随时可能触发):
- 登录失败 → 请老师核对账号密码;确认是教师账号或拥有该班成绩查看权限(普通学生账号不行)。
- 「没有找到包含班组的课程」→ 班组名不全或该班不在所选站;列出可见课程标题协助老师确认。
- analysis 响应慢 → 正常现象(全班粒度重接口),等待即可,不要并发重试。
前置条件(跳过引导、直接使用时自行满足)
- Node 18+(自带 fetch);出 PDF 需要 Edge 或 Chrome 浏览器;git(同步课评仓库)。
- 凭据统一放仓库根
.env(从.env.example复制;已被 .gitignore 排除,绝不提交):OJ 账号需要「教师或授权校区查看者」权限(普通学生账号只能看到自己的数据)。 脚本自动向上查找并加载OJ_BASE_URL=https://oj.qonnwolf.com OJ_USERNAME=你的OJ用户名 OJ_PASSWORD=你的OJ密码 GIT_USER=你的工号 GIT_TOKEN=你的访问令牌 GIT_REPO_URL=https://git.qonnwolf.com/你的工号/ClassFeedback.env;环境变量COURSE_API_USERNAME/PASSWORD可临时覆盖。 - 凭据只在
.env和 git 凭据里,不得写进命令行参数、报告或日志。
安装(项目级,随仓库走)
方式 A(推荐):老师直接克隆自己的 ClassFeedback 仓库——新仓库模板已自带本技能
(skills/class-feedback-report/),克隆即用。
方式 B(存量仓库补装):把 class-feedback-report/ 文件夹复制到项目仓库的
skills/ 目录下(与 .claude/memory/class/ 同在 .claude/ 内),并在仓库根的 AGENTS.md /
CLAUDE.md 写明「本项目技能在 skills/ 目录」。不要装到用户级目录(/.zcode、/.claude)——
技能必须随项目仓库走,老师换 agent、换电脑都只要拉仓库。
API 使用速查
本 skill 全部基于课程插件的只读 JSON 接口(完整文档见 docs/API.md)。
鉴权方式:先 POST /login(JSON:uname + password)拿 sid Cookie,后续请求带
Cookie: sid=... 和 Accept: application/json;脚本自动从仓库根 .env 读取凭据。
| 接口 | 用途 | 权限 |
|---|---|---|
GET /course/api/list?page=N |
列出可见课程(定位班组所在课程) | 已登录 |
GET /course/api/detail/:cid |
课程与章节结构 | 可访问该课程 |
GET /course/api/v1/courses/:cid/students?group=班组名 |
按班组拉花名册 | 教师或授权查看者 |
GET /course/api/v1/courses/:cid/sections/:csid/feedback/overview?group= |
章节班级统计(完成率、首刷率) | 教师或授权查看者 |
GET /course/api/v1/courses/:cid/sections/:csid/feedback/students?group=&limit=100 |
逐生统计信号 | 教师或授权查看者 |
GET /course/api/v1/courses/:cid/sections/:csid/feedback/students/:uid |
单生逐题证据(无代码) | 教师或授权查看者 |
GET /course/api/analysis/:cid/:csid?withCode=true&withHistory=true |
全班提交历史+代码+编译报错(重接口,每次运行只调一次) | 教师或授权查看者 |
GET /p/<pid> |
客观题题干与选项(HTML,脚本已自动解析) | 可见该题 |
注意:withHistory=true 必须带上,否则 history 全空;响应为全章节全班粒度(数百 KB),按需使用。
使用流程
1. 抓取班级数据(脚本自动完成)
node "<skill目录>/scripts/fetch-class-data.mjs" \
--group="克力周日0830CSP02" \
--base-url="https://oj.qonnwolf.com" \
--out="F:\HydroOJ\artifacts\class-feedback\digest-<班级名>.json"
- 脚本自动:定位含该班组的课程(多门时优先「秋季」并在 stderr 提示)、选最后一个有提交活动的章节、
拉花名册、调
analysis?withCode=true&withHistory=true一次性取全班提交历史; 自动识别客观题(提交内容是答案卷的题)并抓取题干与选项存入objective[pid].questions(每个问题含no/text/options[],katex 拆行已合并处理)。 - 可选参数:
--course=<cid>指定课程、--section=<csid>指定章节、--uid=<uid>只整理某个学生。 - 产出 digest JSON:每生
{stats 信号, problems:[{pid,title,submissions:[{seq,status,score,errorHead,code}]}]}。
2. 阅读原料,逐生写诊断
读 digest(大班可分生读取)。一名学生一个 MD 文件 + 一个自包含 HTML 文件(内嵌 CSS,可直接转发/打印)。
每个非 AC 提交都要给出人话结论,判定规则:
| 状态 | 判定方法 | 人话示例 |
|---|---|---|
| CE | 直接读 errorHead(gcc 报错带行号) |
变量没有定义 / 少分号 / 函数名写错(print→printf)/ 重复定义 / 输入输出符号写反 |
| WA | 读 code 对照题意;有 AC 版时做 diff,差异处即病因 |
数组开小了 / 边界条件差一个等于号 / 输出少换行 / 变量没初始化 / 输出没按题意保留小数位 |
| TLE | 读 code 看循环 |
循环条件写错死循环(1<=T 恒真)/ 方向写反 / 漏读入起点 / 算法太慢 |
| RE | 读 code |
数组越界 / 除零 |
多鼓励:报告必须有「🌟 值得表扬的地方」卡片放在最前;一遍通过的题写「一遍通过,非常不错!」; 订正到底的写韧劲;AC 版代码写得好的点名夸(如「min 用得干脆利落」)。表扬必须基于事实,不许编造。 整体分析先扬后抑:亮点在前,习惯问题在后;建议用编号列表给可执行动作。
客观题(选择/判断)特殊处理——不写提交历史,直接给错题+题目分析+选项: 这类题学生只能提交对/错,会反复试答案,所以报告直接列出「答错的题」:
- 取标准答案:用该题全部学生 AC 卷交叉比对(≥2 人一致即认定),无需教师提供答案。
- 学生 WA 卷与标准答案逐题 diff → 得出每题「答错次数」和「答案轨迹」。
- 题干与选项直接用 digest 的
objective[pid].questions(脚本已抓取);若缺失再手工 GET<base-url>/p/<pid>提取。 - 每道错题输出:题干原文 + 完整选项(逐项列出) + 你的答案轨迹 + 正确答案 + 考点分析 (一段人话讲透为什么;选项里的陷阱项要点名,如「−1.2 是诱导你按小数除法算的」)。
- 开头加一句提示:「客观题不建议反复提交试答案,错的就是没弄懂的知识点」。
整体分析要跨题目归纳习惯问题,可用的典型模式:
- 多题首刷全 CE → 没编译就直接提交,粗心;
- 变量未声明/未初始化反复出现 → 声明与初始化意识弱;
- WA 集中在边界/格式 → 审题不细,输出格式(换行、小数位)没对题面;
- 反复「交一发试试」→ 概念不清靠猜,订正态度好但方法不对;
- 大量提交后全部 AC → 订正能力强(要点名表扬的亮点);
- 一次通过率高 → 基础扎实(可建议进拓展)。
3. 按固定模板输出报告(一人一 MD + 一 HTML)
MD 结构(顺序固定):
# 学生提交诊断报告 · <姓名>
> 班级/章节/日期/审核稿声明 + 📊 总览(进度、首刷%、提交次数)
## 🌟 值得表扬的地方 ← 放最前,2~4 条事实型表扬
## 💻 编程题逐题诊断 ← 每题一个小节:第一次提交…第N次提交:通过 + 📌复盘框
## 📝 选择题 · 错题分析 ← 只列答错的题:题干/答案轨迹/正确答案/考点分析
## 📝 判断题 · 错题分析 ← 同上
## 📖 整体分析 ← 先扬后抑
## ✅ 给<姓名>的建议 ← 3~4 条可执行动作
HTML:与 MD 同名 .html,自包含单文件(内嵌 CSS、无外部依赖、可打印)。受众是家长,设计以
「读起来舒服、看得懂」为先(v2 定稿规范,经用户确认):
- 样式参考(必须先读):
samples/report-sample.html与samples/report-sample.md—— 生成任何报告前先读样例,完整复用其 CSS、卡片结构、徽章配色与文案语气,只替换内容, 确保所有 AI 产出的报告观感一致。 - 暖色纸感背景(#faf8f4)+ 白卡片,基础字号 ≥16.5px、行距 ≥1.9;max-width 820px;移动端断点适配;
- 🌟表扬绿卡前置;📊完成情况用进度条可视化(课堂/作业/拓展),不带图例行;
- 编程题时间线的状态徽章用家长能懂的话:✍️ 写错语法(CE)/ 🔄 结果不对(WA)/ ⏱️ 运行超时(TLE)/ 🎉 通过(AC);
- 客观题错题卡:题干引用块 + 选项逐项格子(正确选项绿框 ✓、孩子错选橙框)+ 答案轨迹 + 💡考点黄框;
- 结尾「📖 老师的整体评价」先扬后抑;「接下来要养的小习惯」每个分点独立成行(①②③各一段);
- 不要「写给家长的话」导读卡、不要「在家可以这样帮孩子」模块、不要小图标图例(用户已确认去掉);
- 「教师审核稿」提示缩为一行小字置顶(不放大横幅),术语尽量翻译成生活语言;
- PDF 导出(v2 定稿:单页长图式,标准宽 660px,桌面布局、单页无分页):
scripts/mkpdf.mjs <html> <pdf>两遍法——先用无头 Edge 在 660px 视口量内容真实高度,再以@page{size:660px <高度+120>px; margin:0}输出一整页 PDF(零页边距、颜色保真、自动剔除悬浮按钮与审核稿行)。 用法:node scripts/mkpdf.mjs 报告.html 报告.pdf(中文路径已内置 ASCII 临时名处理)。 - 交付三件套与命名(用户定稿):每名学生 3 个文件、统一命名
<姓名>-<班组>-<课次号>-反馈报告.{md,html,pdf}, 例:王凯平-克力周日0830CSP02-04-反馈报告.md / .html / .pdf。 「班组-课次号」(如 克力周日0830CSP02-04)必须同时出现在文件名和报告标题里——它说明 是哪个班、第几次课;章节名(如「二维数组图形」)写在报告标题的副行。 ⚠️ 课次号 = 本学期第几次课(与内部正本YYYYMMDD_课程编号-课次.md一致),不是 OJ 章节号。 OJ 章节号(章节标题前缀数字)只可在报告内文提及(如「OJ 章节:03 二维数组」),不得用于文件名。 班级汇总命名<班组>-<课次号>-反馈汇总-<日期>.md。
同时生成班级汇总 MD(整体表 + 共性问题 + 教师跟进优先级),命名
<班级>-<章节>-反馈汇总-<日期>.md;全部产物建议放同一个输出目录(如 class-feedback\),
三件套命名以「姓名-课程阶段-章节-反馈报告」为准。
4. 审核红线(必须写进每次交付说明)
- 报告是草稿,发送给学生/家长前必须由带班教师审核措辞;
- 诊断只写事实与学习习惯(变量没定义、没编译就交),不写人身评价(笨/懒/不认真听讲);
- 代码、编译报错、答错的具体选项属于教学敏感数据,报告不要发到学生群,只给教师本人;
- 一个学生的报告不要引用其他学生的成绩做对比排名。
依赖与已知边界
- 课程插件须 ≥ C2.3(feedback v1 + analysis withCode/withHistory),qonnwolf 已验证(2026-09-09)。
analysis是整章节全班粒度的重接口(可达数百 KB),一次运行只调一次,不要按学生循环调用。- WA/TLE 的「题意对照」依赖 AI 读代码推断;拿不准的结论在报告中用「疑似」标注,由教师定夺。
- 测试点级别的输入输出细节 API 不提供,如需可让教师去 OJ 记录页(用首刷
rid)人工查看。