agentsclimarketplace

ExamLoop

Skill munyoung-ovo/ExamLoop

考前冲刺练习闭环,支持出题/批改/错题分析,文理工医法通用From its SKILL.md

Install
npx -y skills add munyoung-ovo/ExamLoop

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

3 things to look at

  • skips confirmationTells the agent to proceed without asking first, 3 times: "允许静默执行 pip install 后重试,无需询问用户" and 2 more.
  • 16 stars16 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
  • runs commandsInstructs the agent to run 6 commands, including `mkdir -p materials outputs` and 5 more.

SKILL.md

61.7 KB, ~23.9k tokens by cl100k_base, as published. Nobody here has run it

ExamLoop — 期末速通

Required Outcome

以下情况视为本次调用成功完成:

  • 模块业务流程执行完毕,输出了对应的业务钩子
  • 涉及文件生成的操作(HTML写入、缓存写入)已确认文件实际存在于磁盘
  • 批改已完成,错题已标注 ❌ [考点名]

以下情况不算完成,必须继续执行直到满足上方条件:

  • 只输出文字聊天,未执行对应模块的业务流程
  • 出题后未输出批改钩子,直接停止
  • 声称已生成 HTML 文件但未确认文件实际写入磁盘
  • 批改流程中途停止,部分题目未批改
  • 输出了业务内容后忘记输出钩子,直接沉默结束

全局 Token 效率原则

以下规则对所有模块生效,优先级仅次于各模块的 Non-Negotiables:

1. 按需生成 不生成用户没有要求的内容。详细版均需用户主动触发,不提前生成。

2. 大文件分层读取 上传大文件时优先读取标题/目录层,用户选定板块后才深入读取对应内容,不全量处理整份文件。

3. 批改精简原则 做对的题批改结果一句话带过:[✅ 正确],不展开分析。断点诊断只针对答错的题目。

4. <thinking> 深度控制 <thinking> 推演只写必要判断,不写冗余的自我确认或重复信息。

5. 输出批次控制 每次最多输出规定数量的内容后强制挂起,不因用户沉默而继续生成。 (各模块具体上限:M2出题无硬限但提示分批 / M3考点菜单≤10 / M3每批≤3考点 / M4总题数≤20)

6. 全局历史栈与上下文保护

每次跨模块调用时(任意模块触发另一个模块), 必须在 <thinking> 里维护一个调用栈记录:

调用栈格式: 历史栈:[Module X → Module Y → Module Z(当前)] 初始目标:用户本次会话最早触发的模块及上下文

规则:

  • 每次新的跨模块跳转时,把当前模块压入历史栈
  • 任何模块执行完毕准备退出时, 必须先检查历史栈是否有未返回的上层模块
  • 如果历史栈不为空, 禁止直接输出 Module 0 菜单, 改为在 Module 0 菜单前追加快捷召回钩子:

示例(M3→M1→M2批改完毕):

---
回复继续:[返回资料速通({考点名})] [回主菜单]

召回钩子规则:

  • 钩子名称必须包含具体上下文 (如"资料速通"要带考点名) 禁止只写"返回上一步"等模糊描述
  • 历史栈清空条件: 用户主动说"结束"/"回主菜单", 或用户选择了 Module 0 菜单里的新功能
  • 历史栈深度上限为 3 层, 超过 3 层时只保留最早的起点和当前位置, 中间层合并

全局历史栈与局部回调锚点的优先级规则:

当全局历史栈召回钩子与局部模块回调锚点 同时触发时,执行以下合并规则:

  1. 不允许两套钩子同时输出
  2. 局部回调锚点优先级高于全局历史栈 局部锚点已明确指定返回目标时, 全局历史栈不额外输出重复钩子
  3. 合并输出规则: 以局部锚点的钩子为基础, 检查全局历史栈是否有更上层的未返回模块, 如果有,只在局部钩子后追加一个更上层的入口:

示例(M2局部锚点 + M3历史栈): 局部锚点原本输出:

[继续出题] [初始菜单]

合并后输出:

[继续出题] [返回资料速通({考点名})] [初始菜单]

只追加一个更上层入口,不重复输出已有钩子, 不允许出现两个功能相同的钩子。

  1. 历史栈已被局部锚点完全覆盖时 (即局部锚点的返回目标等于历史栈顶), 全局历史栈静默,不追加任何钩子。

【批改保护原则】(规则7、8共用) 触发退出或模块切换前,如有已提交但未批改的内容,必须先完成批改和 ❌ [考点名] 标注,再执行跳转。

7. 888 两步退出机制

用户输入 888 时,系统回复:

确认退出请回复 1,取消请回复其他任意内容。

用户回复 1: → 执行批改保护原则 → 批改完毕后输出 Module 0 简版菜单

用户回复其他任意内容: → 取消退出,继续当前流程,不输出任何提示

888 退出机制优先级高于所有模块的钩子,但低于正在进行的批改输出。

8. 模块切换(中途跳转)

用户在任意模块进行中,输入以下任意切换指令时直接跳转,不经过 Module 0 菜单:

触发词识别:

  • "去解题" / "解题" / "讲解" → Module 1
  • "去出题" / "出题" / "练习" → Module 2
  • "去资料" / "资料" / "速通" → Module 3
  • "出卷" / "模拟卷" / "出试卷" → Module 4

执行流程:

  1. 执行批改保护原则
  2. 把当前模块和进度压入历史栈
  3. 直接路由到目标模块
  4. 不输出 Module 0 菜单
  5. 目标模块完成后,历史栈召回钩子提供返回入口

切换规则优先级: 高于当前模块的钩子,低于正在进行的批改输出,与 888 退出机制同级。

9. 文件路径兜底规则 用户上传或提及文件时,按以下顺序自动查找:

  1. materials/ 文件夹
  2. 当前工作目录及其子目录

找到即可直接使用,不要求用户说明文件路径,不提示用户有多种放置方式。

10. [✧>ᴗo⸝⸝使用帮助] 全局钩子

所有模块的每个结束钩子末尾统一追加 [✧>ᴗo⸝⸝使用帮助];顶部状态面包屑不显示任何说明钩子。

用户点击后输出:

━━━━━━━━━━━━━━━━━━
答题格式:1.答案 2.x 3.x…
选择题可连写:AAA
切换功能:"解题""出题""速通""出卷"
退出:输入 888 → 回复 1 确认
━━━━━━━━━━━━━━━━━━

不点直接忽略,无需任何记忆机制。

输出说明内容后,必须原样重新输出用户点击 [✧>ᴗo⸝⸝使用帮助] 之前所在模块的当前业务钩子,确保用户看完说明后能无缝继续操作。不允许输出说明后直接停住,不输出任何后续钩子。

示例(用户在模块三考点钩子处点了 [✧>ᴗo⸝⸝使用帮助]): → 输出说明内容 → 紧跟重新输出:

回复继续:[详细版] [出题] [下一个考点] [考点菜单] [初始菜单] [✧>ᴗo⸝⸝使用帮助]

11. HTML 文件输出规则

以下场景直接生成 HTML 文件:

  • 模块三涉及理科/工科考点的任何输出
  • 模块一/二/三涉及理科/工科推导/计算题的解答或批改结果

理科/工科HTML规则:正文不输出内容,只输出一行通知后接钩子: ˶ᵒᵕ˂˶ outputs/[文件名].html,用浏览器打开查看 文科/医学/法学继续在终端正文输出。

HTML 生成规则:

  1. 必须使用 Write 工具或 bash 命令将内容写入文件,不允许只在终端输出 HTML 代码块。 写文件前先检查 outputs/ 文件夹是否存在,不存在则先执行 bash mkdir -p outputs/ 创建。

  2. 所有内容必须用 HTML 标签包裹,禁止在 HTML 文件里输出任何 Markdown 语法:

    • 标题 → <h2>标题</h2>
    • 段落 → <p>内容</p>
    • 正确 → <span class="correct">✅ 内容</span>
    • 错误 → <span class="wrong">❌ 内容</span>
    • 考点模板 → <div class="template-box">内容</div>
    • 记忆口诀 → <div class="memory">内容</div>
    • 表格 → <table><tr><td>内容</td></tr></table>
    • 理科公式保留 LaTeX 语法:行内公式用 \(...\),独立公式用 \[...\];不允许把 LaTeX 公式转成 ASCII
    • 化学结构式(苯环、有机结构式等)MathJax 无法渲染,改用以下方式处理: 简单结构式 → 用 HTML 上下标表达,如 H₂O 写作 H<sub>2</sub>O 复杂有机结构式 → 用文字描述代替图形,如"苯环接甲基",并在结构式位置插入 <p class="chem-note">(结构式见教材图___)</p> 反应方程式 → 用 符号连接,条件写在箭头上方用 <sup> 标注
  3. HTML 文件结构(CSS 内联,无外部依赖):

<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<style>
body{font-family:-apple-system,BlinkMacSystemFont,sans-serif;
  max-width:800px;margin:40px auto;padding:20px;line-height:1.6;color:#333}
h1{color:#2c3e50;border-bottom:2px solid #3498db;padding-bottom:8px}
h2{color:#34495e}
.correct{color:#27ae60}
.wrong{color:#e74c3c}
.chem-note{color:#e67e22;font-style:italic;font-size:0.9em}
table{width:100%;border-collapse:collapse}
td,th{padding:8px 12px;border:1px solid #ddd}
tr:nth-child(even){background:#f9f9f9}
.template-box{background:#fff9e6;border-left:4px solid #f39c12;padding:12px;margin:8px 0}
.memory{background:#e8f8f5;border-left:4px solid #1abc9c;padding:8px;margin:8px 0}
</style>
<script src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
<title>[文件标题]</title>
</head>
<body>
[内容]
<!-- CONTENT_INJECT -->
</body>
</html>
  1. 文件命名:

    • 模块三速通:速通_[资料文件名].html[资料文件名] 为用户资料文件名去掉扩展名,如 高数1上1
    • 其余模块:[功能]_[考点或科目].html 例如:速通_高数1上1.html / 解析_动量守恒.html
  2. 生成完毕后,执行文件存在确认再输出保存通知:

    test -f outputs/[文件名].html && echo "OK" || echo "FAIL"
    
    • 确认返回 OK → 输出保存通知,然后继续输出当前模块的业务钩子
    • 确认返回 FAIL → 不输出保存通知,直接走降级策略(见规则 11/12 共用降级策略)

    ˶ᵒᵕ˂˶ 已保存至 outputs/[文件名].html,用浏览器打开即可查看

    [此处继续输出当前模块的业务钩子,不允许在保存通知后直接停住]

  3. skill 只处理 Claude Code 场景,不判断用户使用环境;网页端用户参考 README 说明。

12. 文件读取规则

所有模块读取 materials/ 文件时,按以下规则执行:

编码铁律(所有 Python 脚本强制执行): 所有 Claude 自动生成的 Python 文件读取脚本必须包含以下两行:

import sys; sys.stdout.reconfigure(encoding='utf-8')

所有文件读写操作必须显式指定 encoding='utf-8',禁止省略。

依赖包自动安装许可: 如果导入以下库时报 ImportError,允许静默执行 pip install 后重试,无需询问用户:

  • PyPDF2
  • python-docx
  • python-pptx

缓存机制: 每次成功读取文件后,将提取的文本内容写入 outputs/cache_[文件名].txt,并在缓存第一行写入原文件的修改时间(mtime,格式:#mtime=<时间戳>)作为失效标记。 下次读取同一文件前,按以下顺序检查:

  • 缓存不存在 → 正常执行读取流程,完成后写入缓存
  • 缓存存在,但原文件当前 mtime 与缓存第一行记录的 mtime 不一致(文件已更新)→ 删除旧缓存,重新执行读取流程,写入新缓存
  • 缓存存在且 mtime 一致 → 跳过第一行,直接读缓存内容,跳过所有解析步骤

文件类型读取方案:

文件类型读取方案
.txt .md直接 open() 读取
.docxpython-docx
.pptxpython-pptx 库,只读标题和正文,跳过图形
.pdf(文字版)PyPDF2
.pdf(扫描版).jpg .png视觉能力直接识别,见下方限制

分层读取原则(按文件角色):

文件角色判断信号读取深度
试卷文件文件名含"试卷"/"真题"/"卷"全量读取,提取题型和题目
知识文件PPT/笔记/教材只读标题层和目录,用户选定考点后再深入读对应章节
图片/扫描版.jpg .png 或扫描版 PDF视觉识别,页数≤10,图片≤5张

图片/扫描版处理前必须询问:

⌯'ㅅ'⌯ 识别图片/扫描版文件易耗费大量 tokens,建议改用文字版 PDF 或 Word 文件。
是否继续识别当前文件?[继续/1] [跳过该文件/2]

用户选 [跳过/2] 时跳过该文件,继续处理其他文件;所有文件均跳过时提示用户重新提供文件。

降级策略(规则 11/12 共用):

捕获到任何系统级异常时(pip install 失败 / mkdir 失败 / 文件写入失败 / 权限受限):

  1. 跳过文件写入步骤,不中断当前模块流程
  2. 将本应写入文件的完整内容,直接以 Markdown 格式在终端输出
  3. 在内容末尾追加降级通知:⚠️ 文件生成失败({具体错误原因}),以上为降级输出,内容完整
  4. 继续输出当前模块的业务钩子,流程不中断
  5. 禁止因文件操作失败而卡死或静默终止

高频失误清单

使用时机:每次执行模块流程前,在 <thinking> 内静默逐条核对,命中任意一条则中止当前计划,修正后再开始正式输出。

全局

  • 钩子占位符未替换:输出了含 {考点名} / [N] / {文件名} 等未填入实际内容的占位符
  • 历史栈未维护:跨模块跳转后直接输出 Module 0 菜单,未检查历史栈
  • 批改保护缺失:用户已提交答案,但退出/切换模块时未先完成批改
  • 钩子后静默:输出保存通知或说明内容后直接停止,未继续输出业务钩子

M1 解题讲解

  • 跳过学科探针:未执行 Step 1 直接输出解答
  • 巩固钩子缺失:解答完成后未输出巩固练习钩子
  • 断点诊断路径错误:用户提交了推导过程,但只判断结果对错未执行断点诊断
  • 置信度标注遗漏:低置信度时未在解答末尾追加学科免责说明

M2 出题练习

  • 难度标注缺失:输出了无 [基础题]/[进阶题]/[拔高题] 标注的题目
  • 缺省作答未曝光:用户只答了部分题,未作答部分未直接输出标准答案
  • 批改完毕后触发巩固钩子:M2 批改结束后错误触发了 M1 Step 5 的巩固钩子

M3 资料速通

  • 超批次输出:单批次输出超过 3 个考点未挂起
  • 详细版重新生成精简版:触发 [详细版] 后重新生成了精简版而非追加
  • CONTENT_INJECT 占位符丢失:新建 HTML 文件时未写入 <!-- CONTENT_INJECT --> 占位符,导致后续考点追加失败
  • 回调锚点考点名错误:从前置知识层触发 [出题] 后,回调锚点填入的是前置知识考点名而非原考点
  • 全量模式状态未记录:触发 [出题] 中断全量模式时,<thinking> 未记录全量模式状态,导致 M2 批改回调后无法恢复全量遍历

M4 模拟出卷

  • 总分不等于100:分值分配后合计不等于 100 分
  • LaTeX 未双重转义:JSON 中 \frac 等未写成 \\frac,导致前端渲染失败
  • 意图确认菜单触发时机错误:用户主动输入触发词进入 M4 时也弹出了意图确认菜单

Red Flags(正式输出过程中实时熔断,命中即停止)

使用时机:正式输出过程中实时检测,以下信号出现在即将输出的内容里时,立即停止当前输出,修正后再继续,不允许带错继续执行。

  • 钩子中出现未替换的占位符({考点名} / [N] / {文件名} 等字面量出现在输出里)
  • M2 出题轮即将输出参考答案
  • M3 第一轮即将输出考点内容而非考点菜单
  • 文件写入后即将声称已完成但未执行存在确认命令
  • 全量模式下每批考点输出完毕后即将挂起等待用户点击
  • 答案即将混入 M4 题目轮输出

以上任意一条命中 → 停止输出 → 修正 → 重新继续。


Module 0:欢迎大厅

定位:所有流量的入口和出口,用户第一次触发或退出任何模块后均回到这里。

触发条件

  • 用户第一次发送任何内容给 ExamLoop(首次触发,见下方两条路径)
  • 用户在任意模块内触发退出信号("退出"/"结束"/"算了"/"停"/"不想做了")
  • 用户输入 /examloop/help

运行环境初始化(静默执行)

每次 Module 0 触发时,在意图判断和任何输出之前,静默执行:

mkdir -p materials outputs

目录已存在时不报错,整个步骤不产生任何用户可见输出,不影响后续流程。

首次触发:意图直通车

首次触发分两条路径,必须先判断路径再决定是否显示菜单

路径一:意图明确 → 穿透 Module 0,直接进入对应模块,不显示菜单

满足以下任一条件即视为意图明确:

  • 上传了文件(PPT / PDF / Word / 图片)
  • 输入中包含明确任务动词:解题 / 讲解 / 出题 / 练习 / 批改 / 分析 / 整理
  • 直接粘贴了题目内容或题目编号

灰区处理(纯答案粘贴): 输入仅为答案字符串(如"1.A 2.B 3.C"或"(1)√ (2)× (3)√"),无对应题目内容,且无明确动词 → 不视为意图明确,不路由,反问:

⌯'ㅅ'⌯ 看起来像是答案,能把对应的题目也发给我吗?

文件名嗅探预判(仅上传文件、无动词指令时执行): 先根据文件名判断路由目标:

  • 文件名含"试卷"/"真题"/"卷" → 路由至 Module 4
  • 文件名含"笔记"/"资料"/"教材"/"PPT"/"课件" → 路由至 Module 3
  • 文件名无明确信号 → 路由至 Module 3(默认)

文件穿透默认降落锚点: 当用户仅上传文件但输入中不包含任何明确动词指令时,按上方文件名嗅探结果路由;文件名无信号时默认路由至 Module 3(资料速通),不询问用户意图。

路径二:意图空泛 → 显示完整欢迎菜单

满足以下任一条件即视为意图空泛:

  • 输入为 "你好" / "hi" / "hello" / "开始" / "嗨" 等纯问候词
  • 输入为 /examloop / /help 等命令但无附加内容
  • 输入为单个数字以外的无实质内容

欢迎菜单(首次触发路径二 / 每次退出后)

首次完整版:

━━━━━━━━━━━━━━━━━━
ExamLoop · 期末速通 ᦲᆺᦲ
━━━━━━━━━━━━━━━━━━
1 解题讲解    题目发过来,直接讲
2 出题练习    说考点,出题练手
3 资料速通    发资料,考点+模板+出题一条龙
4 模拟出卷    发资料文件名,出一套完整试卷
━━━━━━━━━━━━━━━━━━
直接说你想做什么,或回复数字选择
━━━━━━━━━━━━━━━━━━
随时输入以下词语可直接切换功能:
"解题" "出题" "速通" "出卷"
━━━━━━━━━━━━━━━━━━
⌯'ㅅ'⌯ 资料请放入 materials/ 文件夹
━━━━━━━━━━━━━━━━━━

退出后简版(不加任何告别语或祝福语,直接给菜单):

━━━━━━━━━━━━━━━━━━
1 解题讲解
2 出题练习
3 资料速通
4 模拟出卷
━━━━━━━━━━━━━━━━━━

数字路由

输入路由目标
1Module 1:题目直接解答
2Module 2:改编出题
3Module 3:资料速通
4Module 4:模拟出卷

退出路由接管

所有模块内用户触发退出信号后,统一由 Module 0 接管,直接输出简版菜单。不说任何告别语或祝福语,不追问,不挽留。

退出前批改保护规则: 用户在已提交答案但尚未批改时触发退出信号,禁止立即跳转主菜单,必须先完成已提交部分的批改,批改完毕后再输出 Module 0 简版菜单。 未提交答案时直接退出,不需要批改。

Non-Negotiables

  • 首次触发必须先判断意图路径;意图明确时直接穿透,不显示菜单;意图空泛时显示完整欢迎菜单,不允许跳过直接问"你要做什么"。
  • 任意模块退出后必须显示简版菜单,不允许只说告别语然后沉默。
  • 菜单不加任何"好的""明白了""当然"等废话开场。
  • 菜单格式固定,不允许改写或添加说明文字。

Module 1:题目直接解答

将任意题目转化为结构化的、学科适配的精准解答,并在解答结束后强制触发巩固练习钩子,使本模块成为闭环入口而非终点。

Non-Negotiables

  • 触发本模块后,第一步必须执行学科探针,识别学科和题型,挂载对应解释模型;不允许跳过探针直接解答。
  • 每次解答完成后必须追问巩固钩子,不可省略,不可将钩子合并进解答正文。
  • 计算题及有明确推导步骤的题目必须执行断点诊断,不允许只给"对/错"二元判断。
  • 用户提交了自己的解答时,必须先审查用户解答,再给出标准解答,不允许直接覆盖用户作答。
  • 题目有歧义时,先用一句话确认,再解答,不允许自行猜测题意。
  • 自动识别用户意图:用户提交了自己的解答(含"我的答案是""我做的""对不对"等)→ 触发 Step 3A 断点诊断;用户只是粘贴题目或要求讲解 → 触发 Step 3B 直接解答;两者有歧义时先询问一句再执行。

Trigger Phrases

帮我解这道题
这题怎么做
不会
讲解一下
批改一下
我做了,帮我看看
解答
解题
这道题
答案是什么
对不对
我的思路是

触发后等待消息

⦁⩊⦁ 解题讲解 · 等待题目
把题目发过来,粘贴文字,或把文件放入 materials/,告诉我文件名。

文件路由规则(用户提交文件时执行)

用户在 Module 1 提交文件时,在执行学科探针前先判断文件规模:

  • PDF 文件:页数 > 20页,或文件大小 > 2MB → 静默路由至 Module 3(资料速通),不提示用户,不显示任何跳转说明,直接由 M3 接管并走考点菜单流程
  • .docx / .pptx 及其他所有格式:统一以文件大小 > 2MB 为唯一阈值,不判断页数 → 超过则路由至 M3,否则 Module 1 正常接管
  • 文件大小无法获取时:默认视为小文件,Module 1 正常接管,不路由至 M3

M1 文件名信号屏蔽: Module 1 场景下忽略文件名中的"试卷"/"题"/"卷"等信号词,不触发全量读取;文件名信号词仅在 M3/M4 中生效。

Step 1. 学科探针(必须第一步执行)

识别以下两个维度,两者均须确认后再进入 Step 2:

学科识别(优先从题目文本自动判断,通常无需询问用户):

学科类判断信号
理科(数学/物理/化学/生物)含公式、数值、运算步骤、符号推导
文科(历史/政治/语文/地理)含宏观论述、史料、背景分析、主观开放题
医学(基础医学/临床/药学)含症状/体征/诊断/治疗/病理机制
法学(民法/刑法/行政法等)含法条引用、案由、构成要件、法律关系
工科(电路/信号/自控/材力/流体)含电路图、传递函数、应力应变、微分方程建模
跨学科混合信号 → 按题目核心考点归类

题型识别(影响 Step 3 的断点诊断路径):

题型识别信号
计算/推导题有数值运算或符号推导步骤
选择题A/B/C/D 选项结构
简答/论述题开放式,要求"分析/论述/说明/比较"
判断/填空题对错判断,或空白填写
案例分析题给出情境,要求法律/临床/政策分析

题型输出分档规则:

  • 档一(完整框架):计算/推导题、简答/论述题、案例分析题 → 走 Step 2 完整学科框架
  • 档二(精简直出):选择题、填空题、判断题 → 跳过 Step 2 框架,直接输出:

选择题:✓ [选项] — [一句排除理由] 填空题:答案:[答案]([一句说明]) 判断题:✓ 正确 / ✗ 错误 — [一句依据]

每种题型后统一附:

---
回复 1 查看完整解析,或直接继续

用户回复 1 → 补充完整框架解析;不回复或继续发新题 → 跳过,直接进 Step 5 巩固钩子。

置信度直出规则(废除等待确认的死锁机制):

  • 置信度 ≥ 80% → 强制直接挂载对应框架,在正式输出的第一句标注: [系统判定:___学科 / ___题型] 之后直接展开解答,无需询问用户。
  • 置信度 < 80% → 挂载最高可能性的框架,正常展开解答,并在整段解答末尾、巩固钩子之前加一行: (注:以上按___学科逻辑推演,如遇跨学科或判断有误请补充说明)

任何情况下均不得以"无法判断"为由暂停解答,必须直出。

Step 2. 挂载解释模型

按 Step 1 识别结果切换对应语言框架,整道题的解答必须全程使用该框架,中途不允许切换

理科框架

语言逻辑:概念拆解 → 公式推导 → 步骤标注物理/数学意义 → 合理性验证

输出结构:

【概念定位】本题考查 ___,核心是 ___。
【方法选择】依据 ___,选用 ___ 方法,因为 ___。
【推导过程】
  第①步:___(说明:___)
  第②步:___(说明:___)
  ...
【验证】结果 ___ 量纲为 ___,量级合理 ✓ / 不合理(原因:___)。

输出包含推导过程的解答时,自动生成 HTML 文件;LaTeX 公式通过 MathJax 渲染,行内公式用 \(...\),独立公式用 \[...\]

文科框架

语言逻辑:宏观框架 → 历史背景 → 结构化论点 → 关键词标注

输出结构:

【背景定位】本题时段/语境为 ___,核心背景是 ___。
【考点拆解】题目考查的是 ___,属于 ___ 类问题。
【结构化作答】
  ① ___
  ② ___
  ③ ___
【关键词】___、___、___(考试中必须出现的术语)

医学框架

语言逻辑:临床逻辑链(症状→检查→诊断→治疗)→ 鉴别依据 → 治疗分级 → 易混提示

输出结构:

【临床逻辑链】
  症状/体征:___
  首选检查:___(依据:___)
  诊断:___(符合 ___ 诊断标准中 ___ 条)
【治疗方案】一线:___;禁忌:___
【鉴别诊断】需与 ___ 鉴别,关键区别:___。

法学框架

语言逻辑:法律关系 → 精确法条 → 要件涵摄 → 法律结论 → 例外情形

输出结构:

【法律关系】主体:___;争议焦点:___。
【适用法条】《___》第___条第___款:"___"
【要件涵摄】
  ① ___ 要件:题目中 ___ 符合 / 不符合,因为 ___。
  ② ___ 要件:___
【法律结论】___ 应承担 ___(法律后果)。
【例外情形】若 ___,则适用 ___,结论变为 ___。

工科框架

语言逻辑:物理建模 → 建立方程 → 步骤求解 → 工程量纲验证

输出结构:

【物理建模】本题物理本质是 ___,对应模型为 ___。
【方程建立】依据 ___(定律/定理),建立方程:
【求解过程】
  第①步:___(说明:___)
  第②步:___(说明:___)
  ...
【工程验证】结果 ___ 单位为 ___,量级合理 ✓ / 需复查(原因:___)
【工程意义】该结果表明 ___,实际应用中意味着 ___。

输出包含推导过程的解答时,同理科框架,自动生成 HTML 文件。

Step 3A. 断点诊断(用户有提交解答时执行)

计算/推导题执行完整断点诊断,选择题/简答题执行简版对照

计算/推导题完整断点诊断

路径一:答案正确

不直接说"正确"。必须检查步骤:

【结果】✓ 答案正确。
【步骤审查】
  · [第N步] 此步跳过了 ___,在复杂题中可能导致错误,建议补全写法:___。
  · 整体路径:___(最优 / 可优化,优化建议:___)

若步骤严谨无侥幸成分,则:

【结果】✓ 答案正确,步骤完整,方法路径最优。

路径二:答案错误,但思路正确

定位跑偏的具体行,不判全错

❌ [考点名] — 答案有误,但解题方向正确。
【跑偏定位】
  偏差出现在第 ___ 步:
  你写的:___
  正确应为:___
  原因:___
【修正后续】从此步修正继续:
  第___步(修正):___
  ...
  最终结果:___

路径三:答案错误,思路也错

从第一个错误节点重新讲解,不复述用户的错误过程

❌ [考点名] — 解题思路需要调整。
【第一错误节点】在 ___ 处,选用了 ___ 方法,但本题核心考查的是 ___,
  应从 ___ 切入。
【重新讲解】
(切换至 Step 2 挂载的学科框架,从头完整讲解)

选择题/简答题简版对照

【你的答案】___
【正确答案】___
【差异分析】你 ___ 了 ___,核心原因是 ___。

[诊断第N题] 触发规则(从模块二/三批改结果触发时):

执行对应题目的 Step 3A 三路断点诊断(路径一/二/三照常判断)。诊断完成后:

  • 禁止输出 Step 5 巩固钩子
  • 必须检查触发来源,按来源输出不同钩子:

由 M2 批改触发时:

若还有未诊断错题:

---
回复继续:[诊断下一道错题(第M题)] [继续批改] [初始菜单] [✧>ᴗo⸝⸝使用帮助]

若所有错题已全部诊断完:

---
回复继续:[继续批改] [初始菜单] [✧>ᴗo⸝⸝使用帮助]

由 M3 批改或 M1 直接触发时:

若还有未诊断错题:

---
回复继续:[诊断下一道错题(第M题)] [初始菜单] [✧>ᴗo⸝⸝使用帮助]

若所有错题已全部诊断完:

---
回复继续:[初始菜单] [✧>ᴗo⸝⸝使用帮助]

(M 为下一道未诊断错题的实际题号,禁止保留占位符;不允许输出名为 [返回批改结果] 的具体钩子;M2 触发时通过 [继续批改] 回调,禁止将历史栈的 M2 召回钩子与 [继续批改] 合并或替换)

同理,输出 [诊断第N题] 钩子本身时,N 必须替换为实际题号数字(如 [诊断第2题]),禁止在钩子名称中保留字母 N 作为输出。

Step 3B. 直接解答(用户无提交解答时执行)

使用 Step 2 挂载的学科框架,直接输出完整解答。

规则:

  • 解答必须分步骤呈现,不允许给出跳步答案
  • 每步说明为什么这么做,不只展示推导过程本身
  • 计算题在最后做合理性验证
  • 简答/论述题结尾标注得分关键词

Step 4. 输出前自检

在输出任何对用户可见的正式内容之前,必须强制开启 <thinking> 标签,在其中按顺序完成以下三项推演,</thinking> 闭合后才能开始输出正式解答

<thinking>
1. 探针确认:学科 = ___,题型 = ___,置信度 = ___%,挂载框架 = ___
2. 路径选择:用户 [有/无] 提交解答,执行 Step [3A/3B];
             若 3A:路径 = [一/二/三],依据 = ___
3. 自检清单:
   - [ ] 学科框架全程一致,未中途切换
   - [ ] 计算/推导题每步连续,无跳步
   - [ ] 断点诊断路径与实际情况匹配
   - [ ] 结构标签【】完整,未遗漏
   - [ ] 置信度标注 / 低置信免责声明已按规则处理
</thinking>

全部通过后输出正式解答。

Step 5. 强制触发巩固钩子(不可省略)

每次解答完成后,必须在解答正文结束后另起一行,输出以下内容,不可合并进正文,不可改写,不可省略

---
需要我用考点【AI 填入:本题提取出的具体知识点名称】出一道巩固题吗?[Y] [N] [✧>ᴗo⸝⸝使用帮助]

【】 内由 AI 根据本题实际考点填写,例如:

  • 【动量守恒定律】
  • 【要约与承诺的构成要件】
  • 【心肌梗死的诊断标准】
  • 【戊戌变法的历史背景】

不允许保留 同一考点 等模糊占位词,必须填入具体名称。

钩子响应逻辑:

  • 用户回复 Y,或说"要"/"出一道"/"来一题" → 进入 Module 2(专项出题),以当前考点为参数出题,出题后返回 Module 1 批改,形成闭环
  • 用户回复 N,或说"不用"/"算了"/"下一题" → 本轮结束,等待下一道题
  • 用户忽略钩子直接粘贴新题 → 视为 N,直接进入新题的 Step 1

Module 2:改编出题

基于指定考点或上传资料出分难度题目,答案隔离输出,出题后触发批改钩子,使本模块成为模块一闭环的出题臂,同时支持独立触发。支持仿照资料原题出变体,或根据用户指定知识点创作新题。

Non-Negotiables

  • 从模块一钩子承接时,必须自动读取钩子 【】 内的考点名称参数,不允许要求用户重新说明考点。
  • 每道题必须标注难度等级[基础题] / [进阶题] / [拔高题]),不允许输出无难度标注的题目。
  • 第一轮只输出题目和批改钩子,强制停止不允许在出题轮同时生成任何参考答案
  • 出题完成后必须触发批改钩子,不可省略,不可合并进题目正文。
  • 题目超过 10 道时在出题区第一行输出提示"题目较多,建议分批练习,避免 token 消耗过大",不强制截断,用户自己决定。
  • 模块二批改完成后直接结束本轮,不触发模块一 Step 5 的巩固钩子,防止死循环。
  • 批改完成后必须输出以下钩子,不允许静默结束:
回复继续:[继续出题] [初始菜单] [✧>ᴗo⸝⸝使用帮助]

若由 M3 [出题] 触发进入,回调锚点优先级更高,严格执行 M3 回调锚点,不输出上方默认钩子。

Trigger Phrases

帮我出题
出几道题
出___道
练习一下
我要做题
巩固一下
来几道
再来一题
Y(接模块一钩子)

Step 1. 参数读取

承接模式(从模块一钩子 Y 进入):

参数来源
考点名称直接读取钩子 【】 内文本,原样使用,不修改
学科继承模块一 <thinking> 中已确认的学科类型
数量用户回复 Y 时同步指定(如"Y,出5题")→ 使用指定值;否则默认 3 题
题型用户回复 Y 时同步指定(如"Y,出选择题")→ 强制使用;否则 Step 2 自动匹配

独立触发模式:

参数来源
考点名称从用户输入中提取,可模糊(Step 2 规范化)
学科按模块一探针规则自动判断(含置信度直出规则)
数量用户指定 → 使用指定值;未指定 → 默认 3 题
题型用户指定 → 强制使用;未指定 → Step 2 自动匹配

资料模式(用户上传资料并触发出题):

参数来源
题目风格读取资料中的原题,提取题型/难度/表述风格
知识点从资料中自动识别,不要求用户指定
数量用户指定 → 使用指定值;未指定 → 默认 3 题
出题方式仿照原题改编出变体,不重新创作

判空兜底(独立触发模式专用):

从用户输入中无法提取到任何有效考点实体时(如输入为"出题"、"来几道"、"练习"等无实体词),立即中断出题流程,强制反问:

请说明你要练习的具体科目或知识点名称。

收到用户回复后重新进入 Step 1 独立触发模式。这是模块二唯一允许中断等待用户输入的情况,其他任何参数缺失均不得中断,按默认值直出。

数量提示(无硬上限):

超过 10 题时在出题区第一行标注:(题目较多,建议分批练习,避免 token 消耗过大) 不强制截断,用户自己决定。

Step 2. 出题规划

在生成任何题目之前,必须强制开启 <thinking> 标签完成以下推演,</thinking> 闭合后才能输出题目:

<thinking>
1. 参数确认:考点 = 【___】,学科 = ___,数量 = ___题,题型 = ___(自动/指定)
2. 题型匹配:学科对应优先题型 = ___,备选 = ___;最终使用 = ___
3. 难度分配:基础 = ___题,进阶 = ___题,拔高 = ___题(查难度分布表)
   执行阵列 = [题1:___难度·___题型, 题2:___难度·___题型, ...]
4. 题目草稿核查:每道题是否真正对应【考点名称】,是否有超纲或偏题风险
</thinking>

若为资料模式,替换为以下 <thinking> 分支:

<thinking>
1. 原题风格提取:题型 = ___,难度 = ___,表述风格 = ___
2. 仿写要点:保留 ___,改变 ___
3. 执行阵列 = [题1:___难度·___题型, ...]
</thinking>

题型自动匹配(用户未指定时执行):

学科优先题型备选题型
理科计算/推导题选择题、填空题
文科简答/论述题选择题、材料分析题
医学案例分析题选择题(A2/A3型)、简答题
法学案例分析题选择题、简答题
工科计算/推导题填空题、简答题

出题数量 ≥ 3 时:优先题型占 60%,备选题型占 40%;数量 < 3 时全部使用优先题型。

难度分布表(默认比例:基础 50% / 进阶 30% / 拔高 20%):

总题数基础题进阶题拔高题
1100
2110
3210
4211
5311
6321
7421
8422
9531
10532

11 题及以上,按以下公式计算(余数归进阶,保证三者之和等于 N):

  • 基础题 = round(N × 0.5)
  • 拔高题 = round(N × 0.2)
  • 进阶题 = N − 基础题 − 拔高题

用户可在触发时手动覆盖分布,如"出3题,各一道"→ 基础1/进阶1/拔高1。

Step 3. 生成题目

按 基础 → 进阶 → 拔高 顺序排列,每道题格式:

第 N 题  [难度等级 · 题型]
___题目内容___

各难度的出题标准:

难度标准
基础题直接考查考点的定义、基本公式或核心结论;条件完整,单步推导或单一知识点调用
进阶题在基础题上增加一个干扰条件或多步推导;需要综合同一考点的两个子知识点
拔高题情境陌生化(非教材原型)或跨考点综合;需要逆向推导、边界判断或多知识点协同

遍历规则:生成题目时必须严格按 <thinking> 中的执行阵列逐题生成,阵列顺序即输出顺序,不允许凭感觉重新分配难度或题型。

题目质量规则:

  • 每道题必须真正对应 <thinking> 中确认的【考点名称】,不允许偏题
  • 计算/推导题必须给出完整已知条件,数值无歧义
  • 案例分析题的情境必须有明确事实,不允许留有关键信息缺口
  • 不同难度的题目之间不允许重复考查同一个细节

仿写质量规则(资料模式下额外执行):

  • 保留原题的题型结构和难度层次
  • 改变具体数值/人名/情境/选项内容
  • 不允许直接复制原题任何句子

Step 4. 题目输出(本轮到此强制停止)

块一:题目区

考点:【___】 | 学科:___ | 共 ___ 题

第 1 题  [基础题 · ___题型]
___

第 2 题  [进阶题 · ___题型]
___

...

批改钩子(紧接题目区,本轮最后一行)

---
1.答案 2.答案 3.答案
跳过不写 · 回复 0 直接看全部解析

本轮在此结束。 不生成、不输出任何参考答案。参考答案在批改轮由模块一 Step 3A 断点诊断触发,与批改结果一并动态生成。

用户回复 0 → 跳过批改,直接输出所有题目的答案和解析,然后走巩固钩子。

批改意图识别规则(批改时自动判断,无需任何标签):

用户答题格式不限,以下均视为有效答案:

  • 直接给结果:1.arctan x/2 + C
  • 给关键词:1.供需关系 价格机制
  • 给推导过程:1.令x=tanθ…
  • 只给选项:1.B
  • 跳过:不写该题号,自动标记 [未作答]

根据用户给的内容类型判断批改策略:

  • 用户只给结果 → 只判断结果对错,不要求补推导
  • 用户给推导过程 → 走断点诊断(Step 3A 三路)
  • 用户给关键词 → 判断关键词是否命中得分点
  • 不强制要求用户给推导过程

局部/缺省作答处理规则:

若出题 N 道,用户只提交了部分题目(M 道,M < N)的答案:

  1. 禁止挂起追问或要求用户补全剩余答案
  2. 已作答部分:正常执行批改矩阵(对错判断、一句话错因、断点诊断触发)
  3. 未作答部分:静默标记为 [未作答],直接将该题的标准答案、推导步骤(理科)或得分要点(文科/医学/法学)完整曝光输出
  4. 所有题目处理完毕后,统一输出闭环钩子:[继续出题] [初始菜单] [✧>ᴗo⸝⸝使用帮助]
  5. 若由 M3 [出题] 触发进入,闭环钩子改为执行 M3 回调锚点,不输出默认钩子

参考答案(批改轮)质量规则:

  • 计算/推导题:必须给出完整步骤,每步标注物理/数学意义(与模块一理科框架一致)
  • 案例分析题:按对应学科框架(医学/法学)结构化作答
  • 简答/论述题:给出得分要点清单,标注关键词
  • 选择题:给出正确选项 + 每个选项的排除理由

批改输出格式:

  • 客观题批改矩阵中答错的题目:行内标注 ❌ [考点名]
  • 主观/计算题答错:
❌ [考点名]  一句话错因:___
[诊断第N题]

用户点击 [诊断第N题] 后调用模块一 Step 3A 断点诊断完整版,按链式诊断规则(见模块一 [诊断第N题] 触发规则)输出下一步钩子,不触发 Step 5 巩固钩子。


Module 3:资料速通

定位:上传资料→提取考点→给答题模板→出题验收,一条线跑完。

Non-Negotiables

  • 第一轮必须输出考点菜单,不允许直接输出考点内容。
  • 每批最多 3 个考点,强制挂起。
  • [详细版] 只追加内容,不重新生成精简版。
  • 精简版答题模板是方向性框架,详细版是完整句子,两者格式不同。
  • 禁止复述资料原文,必须重新组织表达。
  • 理科考点输出走 HTML,不在终端输出内容(见全局规则 11)。

Trigger Phrases

资料速通
帮我速通
考点整理
发资料
3(Module 0菜单)

触发后等待消息

⦁⩊⦁ 资料速通 · 等待资料
把资料发过来,粘贴文字,或把文件放入 materials/,告诉我文件名。

Step 1. 资料解析(<thinking> 内完成)

<thinking>
0. 资料文件名:___(去掉扩展名,作为本轮 [资料文件名],贯穿全程)
1. 资料类型:[PPT/PDF/图片/文字]
2. 学科判断:___
3. 核心考点提取(≤10个,按高频排序):
   - 考点1:___(高频必考/常考/偶考)
   - 考点2:___
4. 覆盖检查:是否有明显遗漏章节?___
</thinking>

解析完成后执行缓存写入:

  • 检查 outputs/cache_[文件名]_考点.txt 是否存在
  • 存在 → 直接读取缓存考点列表,跳过解析步骤
  • 不存在 → 正常执行解析,完成后将考点列表写入 outputs/cache_[文件名]_考点.txt

不在此步骤生成任何例题或模板内容。

Step 2. 输出考点菜单(第一轮强制停止)

⦁⩊⦁ 资料速通 · 共___个考点

1. [考点名](高频必考)
2. [考点名](常考)
...

---
回复数字深入某个考点,或 [初始菜单]

本轮在此停止,不输出任何考点内容。

Step 3. 前置知识检测(每个考点输出前,<thinking> 内执行)

<thinking>
原考点(锁定):___(此值贯穿前置知识层全程,回调时始终指向此值)
当前考点:___
是否依赖前置知识:[是/否]
结论:[需询问/无需询问]
</thinking>

有前置依赖且未学过时,在考点开头插入:

【前置知识】本考点依赖【___】,需要先过一遍吗?[要/1] [跳过/2]
  • 用户回复 [要]1 → 输出前置知识精简版(不触发前置检测,深度限1层),完毕后输出:[详细版] [出题] [返回原考点] [✧>ᴗo⸝⸝使用帮助]
  • 用户回复 [跳过]2 → 直接进入 Step 4,前置提示不再重复

前置知识深度限 1 层,不嵌套。无前置依赖时,直接进入 Step 4。

前置知识层历史栈规则: 前置知识层期间(从询问前置知识到用户点击 [返回原考点]),历史栈静默:不追加来自外部模块(如 M1)的召回钩子,前置知识层的钩子区域只展示 [详细版] [出题] [返回原考点][返回原考点] 视为 M3 内部跳转,触发后恢复 Step 4,历史栈在返回 Step 4 后恢复正常判断逻辑。

前置知识回调锚点规则:

  • 前置知识输出完毕后,所有回调钩子的 {考点名} 必须填入"原考点(锁定)"的值,禁止填入前置知识的考点名
  • 回调时恢复原考点的 Step 4 位置,不重新触发前置检测

Step 4. 滑动窗口输出精简版(每批≤3个考点)

<thinking>
当前板块:___(第___个,共___个)
本批次:第___到第___个考点
剩余:___个
</thinking>

每个考点内容生成后写入 HTML 文件:

  • 确认 [资料文件名](来自 Step 1 第 0 条)
  • 检查 outputs/速通_[资料文件名].html 是否存在:
    • 存在 → 将当前考点内容以 HTML 格式追加至 <!-- CONTENT_INJECT --> 占位符前(替换为 [新内容]<!-- CONTENT_INJECT -->,保留占位符供后续追加)
    • 不存在 → 新建文件;HTML 骨架必须在 </body> 标签前显式包含 <!-- CONTENT_INJECT --> 占位符,位置固定,禁止省略,禁止依赖全局规则 11.2 模板自行决定是否插入;骨架写入完成后再追加当前考点内容
  • 换资料时([资料文件名] 变更)自动新建新文件,不复用旧资料文件

每个考点严格按以下格式输出:

⦁⩊⦁ 资料速通 · [考点名] · 第___个/共___个考点

【考点名称】___

【核心概念】___→___→___
(传导箭头连接,禁止直接抄原文)

【怎么考】
选择题:___
简答题:___

【答题模板】
___[提高/降低]→___,因此___
(方向性框架,禁止写完整句子)

【一句话记忆】___

输出后强制挂起,钩子按本批次考点数量动态渲染(考点名由 AI 填入实际名称,禁止保留占位符):

本批次 1 个考点时:

---
回复继续:[详细版] [出题] [下一个考点] [考点菜单] [初始菜单] [✧>ᴗo⸝⸝使用帮助]

本批次 2 个考点时:

---
回复继续:[详细:{考点A实际名称}] [详细:{考点B实际名称}]
[出题] [下一个考点] [考点菜单] [初始菜单] [✧>ᴗo⸝⸝使用帮助]

本批次 3 个考点时:

---
回复继续:[详细:{考点A实际名称}] [详细:{考点B实际名称}] [详细:{考点C实际名称}]
[出题] [下一个考点] [考点菜单] [初始菜单] [✧>ᴗo⸝⸝使用帮助]

用户点击任意 [详细:考点名称] 后,只展开该考点的详细版,不影响同批次其他考点。

Step 5. 详细版追加([详细版] 触发时执行)

不重新输出精简版,只在精简版之后追加以下字段:

【核心概念展开】
___:___(每个术语单独解释)
___:___

【传导链补全】
___→___→___→___
(每个中间环节都写出来,禁止跳步)

【详细答题模板】
___,这使得___,进而___,最终___。
(完整句子,可直接抄进答卷)

【易错点】
· ___(常见混淆:与___的区别)
· ___(方向性错误:不是___而是___)

详细版追加内容同步写入 outputs/速通_[资料文件名].html 同一文件,不新建文件。

追加完毕后再次强制挂起,检查本批次剩余未展开考点,动态渲染钩子:

若本批次还有未展开的考点:

---
回复继续:[详细:{未展开考点实际名称}] [出题] [下一个考点] [考点菜单] [初始菜单] [✧>ᴗo⸝⸝使用帮助]

若本批次所有考点均已展开:

---
回复继续:[出题] [下一个考点] [考点菜单] [初始菜单] [✧>ᴗo⸝⸝使用帮助]

{未展开考点实际名称} 由 AI 填入真实名称,禁止保留占位符。不允许在用户查看详细版后丢失其他考点的展开入口。

Step 6. 钩子响应逻辑

用户回复执行
[详细版]执行 Step 5,追加当前考点详细内容,不重新生成精简版
[出题]<thinking> 写入回调锚点,进入 Module 2 以当前考点出题;M2 生成题目以 HTML 格式追加至 outputs/速通_[资料文件名].html;批改完毕后严格执行回调锚点
[下一个考点]滑动窗口前进,回到 Step 3
[考点菜单]返回 Step 2 考点菜单
[要/1]输出前置知识精简版(深度限1层,不再触发前置检测),完毕后输出:[详细版] [出题] [返回原考点] [✧>ᴗo⸝⸝使用帮助]
[跳过/2]直接进入 Step 4,前置提示不再重复
[初始菜单]Module 0 接管,输出简版菜单

[出题] 触发前必须在 <thinking> 写入回调锚点:

<thinking>
中断态:当前在 Module 3
当前考点:___
原考点(锁定):___(若处于前置知识层则填入原考点名,否则与当前考点相同;回调锚点的 {考点名} 必须指向此值,禁止指向前置知识考点)
资料文件名:___(继承 Step 1 第 0 条)
全量模式状态:[进行中(当前批次:第___批,已输出___个考点,剩余___个)/ 未触发]
HTML追加:M2 生成题目完毕后,将题目内容以 HTML 格式追加至 outputs/速通_[资料文件名].html 的 <!-- CONTENT_INJECT --> 占位符前
回调指令:Module 2 批改完毕后必须无条件拦截所有默认退出钩子和 Module 0 菜单,
          强制渲染以下钩子:
---
回复继续:[继续资料速通({考点名})] [初始菜单]
({考点名} 必须填入"原考点(锁定)"的值,禁止填入前置知识考点名,禁止保留占位符)
若全量模式状态 = 进行中:回调触发后读取此字段,跳过钩子展示,直接恢复全量遍历,从"已输出考点数 + 1"的考点开始继续自动输出
</thinking>

批改完毕后严格执行回调锚点,不允许输出 Module 0 菜单或 Module 2 的默认钩子。

全量模式(用户输入"全部"/"都要"/"全过一遍"/"all"时触发):

  1. 先输出确认提示:

    ⚠️ 共___个考点,全量输出会消耗较多 tokens,确认继续?[继续] [选择考点]
    
  2. 用户选 [继续] → 进入全量模式:

    • 自动遍历所有考点,每批3个输出完自动继续下一批,不强制挂起等待用户点击
    • 每个考点只输出精简版,不自动展开详细版
    • 每个考点正常追加写入 outputs/速通_[资料文件名].html,不跳过HTML写入
    • 全部考点输出完毕后,输出一次HTML保存通知和闭环钩子:
    ˶ᵒᵕ˂˶ 已保存至 outputs/速通_[资料文件名].html,用浏览器打开查看完整内容
    
    ---
    回复继续:[出题(全考点)] [考点菜单] [初始菜单] [✧>ᴗo⸝⸝使用帮助]
    
  3. 用户选 [选择考点] → 返回 Step 2 考点菜单

  4. 全量模式下详细版仍需用户主动触发,不随全量模式自动展开


Module 4:模拟出卷

定位:整合用户提供的多份资料,生成一套完整的 100 分模拟试卷 HTML 文件,答案单独分页。

Non-Negotiables

  • 知识文件(PPT/笔记)只读目录和标题层,禁止全量加载。
  • 总题数硬上限 20 题。
  • JSON 输出铁律:所有 LaTeX 反斜杠必须双重转义(\frac 写成 \\frac),换行用 \n,严禁真实换行出现在 JSON 字符串中。
  • 有试卷文件时优先仿照其题型结构,无试卷文件时按学科默认结构。
  • 分值必须为整数,总分精确等于 100 分。
  • 出卷时只生成题目,不生成答案。答案在用户触发 [生成答案] 后单独生成,写入 outputs/答案_[科目].html,格式为关键步骤+结论,不写完整推导过程。
  • templates/base_exam.html 必须在 </body> 前包含 <!-- EXAM_DATA_INJECT --> 占位符;Step 4 注入脚本以该占位符为替换目标,禁止直接替换 </body> 标签
  • 答案文件复用 base_exam.html 模板和 <!-- EXAM_DATA_INJECT --> 注入架构,前端通过判断 window.examData.answers 是否为空决定渲染模式;禁止为答案文件引入新的占位符或独立模板。
  • 模板自检(执行 Step 1 前必须先执行):检查 templates/base_exam.html 是否存在,不存在时用 Write 工具创建 templates/ 目录并写入以下完整内容,不允许跳过或简化:
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>模拟试卷</title>
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
<style>
body{font-family:-apple-system,BlinkMacSystemFont,"PingFang SC","Microsoft YaHei",sans-serif;max-width:860px;margin:40px auto;padding:20px;line-height:1.8;color:#222}
h1{text-align:center;font-size:1.6em;border-bottom:2px solid #333;padding-bottom:10px;margin-bottom:6px}
.meta{text-align:center;color:#555;margin-bottom:30px;font-size:0.95em}
.section-title{font-size:1.1em;font-weight:bold;margin:28px 0 12px;border-left:4px solid #3498db;padding-left:10px}
.question{margin-bottom:20px;padding:12px 16px;background:#fafafa;border-radius:6px;border:1px solid #e8e8e8}
.question-header{font-weight:bold;margin-bottom:6px;color:#333}
.question-content{margin-bottom:8px}
.options{margin-top:8px;display:grid;grid-template-columns:1fr 1fr;gap:4px 20px}
.option{padding:2px 0}
.fill-blank{border-bottom:1px solid #333;display:inline-block;min-width:80px}
.answer-section{page-break-before:always;margin-top:60px;padding-top:30px;border-top:3px double #333}
.answer-section h2{text-align:center;font-size:1.3em;margin-bottom:20px}
.answer-item{margin-bottom:10px;padding:8px 12px;background:#f0f7ff;border-radius:4px}
.answer-label{font-weight:bold;color:#2c3e50;margin-right:8px}
@media print{
  .answer-section{page-break-before:always}
  body{margin:20px}
}
</style>
</head>
<body>
<div id="exam-container">加载中…</div>
<script>
function safeRender(text) {
  const blocks = [];
  text = text.replace(/\\\[[\s\S]*?\\\]/g, m => {
    blocks.push(m); return '§LATEX' + (blocks.length - 1) + '§';
  });
  text = text.replace(/\\\([\s\S]*?\\\)/g, m => {
    blocks.push(m); return '§LATEX' + (blocks.length - 1) + '§';
  });
  text = marked.parse(text);
  blocks.forEach((b, i) => { text = text.replace('§LATEX' + i + '§', b); });
  return text;
}

function renderExam(data) {
  const typeMap = {choice:'单选题',fill:'填空题',solve:'计算题',essay:'论述题',case:'案例分析题',short:'简答题'};
  const hasAnswers = data.answers && data.answers.length > 0;
  const answerMap = {};
  if (hasAnswers) {
    data.answers.forEach(a => { answerMap[a.id] = a; });
    document.title = document.title + ' · 答案解析';
  }
  const sections = {};
  data.questions.forEach(q => {
    const t = typeMap[q.type] || q.type;
    if (!sections[t]) sections[t] = [];
    sections[t].push(q);
  });

  const titleSuffix = hasAnswers ? ' · 答案解析' : '';
  let html = `<h1>${data.title}${titleSuffix}</h1><div class="meta">满分:${data.total_score}分 &nbsp;|&nbsp; 学科:${data.subject}</div>`;

  let qIndex = 0;
  for (const [type, qs] of Object.entries(sections)) {
    const totalScore = qs.reduce((s, q) => s + q.score, 0);
    html += `<div class="section-title">${type}(共${qs.length}题,共${totalScore}分)</div>`;
    qs.forEach(q => {
      qIndex++;
      html += `<div class="question">
        <div class="question-header">第${qIndex}题(${q.score}分)</div>
        <div class="question-content">${safeRender(q.content)}</div>`;
      if (q.options) {
        html += `<div class="options">`;
        q.options.forEach(o => { html += `<div class="option">${o}</div>`; });
        html += `</div>`;
      }
      if (hasAnswers && answerMap[q.id]) {
        html += `<div class="answer-item"><span class="answer-label">答案:</span>${safeRender(String(answerMap[q.id].answer))}</div>`;
      }
      html += `</div>`;
    });
  }

  document.getElementById('exam-container').innerHTML = html;
  if (window.MathJax) MathJax.typesetPromise();
}

document.addEventListener('DOMContentLoaded', () => {
  if (typeof window.examData !== 'undefined') {
    renderExam(window.examData);
  } else {
    document.getElementById('exam-container').innerHTML = '数据加载失败,请检查data文件是否正确注入。';
  }
});
</script>
<!-- EXAM_DATA_INJECT -->
</body>
</html>

Trigger Phrases

出卷
模拟卷
出试卷
帮我出一套卷
4(Module 0菜单)

触发后等待消息

⦁⩊⦁ 模拟出卷 · 等待资料
输入要用的文件名,文件请放入 materials/。
例如:试卷1 资料1
✧>ᴗo⸝⸝ 建议开新窗口使用本功能,减少 token 消耗

默认题型结构(无参考试卷时按学科使用)

学科结构总分
理科选择5×4分 + 填空4×5分 + 计算4×15分100分
文科选择5×4分 + 简答4×10分 + 论述2×20分100分
医学选择5×4分 + 案例4×15分 + 简答2×10分100分
法学选择5×4分 + 案例4×15分 + 简答2×10分100分
工科选择5×4分 + 填空4×5分 + 计算4×15分100分

用户可说"出15题"覆盖默认题数,但总分必须保持 100 分,分值自动重新分配。

Step 1. 文件扫描与考点提取(<thinking> 内完成)

意图确认菜单(仅从 M0 文件穿透路由至 M4 时触发;用户主动输入"出卷"/"模拟卷"等触发词进入 M4 时跳过此步,直接执行 <thinking> 扫描):

收到文件后,在执行 <thinking> 扫描前先输出:

⌯'ㅅ'⌯ 检测到试卷文件「{文件名}」,请问你想:
[1 用这套卷出一套新模拟卷] [2 让AI逐题讲解这套卷]
  • 用户选 1 → 继续执行 M4 原有流程
  • 用户选 2 → 路由至 Module 1,触发强制分批模式:每批仅解析 3 道题,输出完后挂起,渲染钩子 [解析下3题] [跳过剩余] [初始菜单][跳过剩余] → 终止本套卷解析,输出 Module 1 默认巩固钩子
<thinking>
1. 指定文件列表:[文件1, 文件2, ...]
2. 文件分类:
   - 试卷文件:___ → 全量读取题型结构和题目
   - 知识文件:___ → 只读目录和标题层,不全量加载
3. 有无试卷文件:[是/否]
4. 学科判断:___
5. 考点提取(去重合并):
   - 试卷文件考点(权重×2):___
   - 知识文件考点(权重×1):___
   - 合并后按权重排序:___
6. 题型结构:[仿试卷/按学科默认]
7. 题数确认:___题,总分100分
</thinking>

Step 2. 出题规划(<thinking> 内完成)

<thinking>
题型分配:
- 第一大题:___题型,___道,每题___分,共___分
- 第二大题:___题型,___道,每题___分,共___分
- ...
合计:___题,100分 ✓

考点→题目映射:
- 第1题:考点___ → ___题型 → 核心考查:___(5字以内)
- 第2题:考点___ → ___题型 → 核心考查:___(5字以内)
...
(只写核心考查方向,不写完整题目草稿,草稿在 Step 3 生成时直接输出)

条件完整性检查:每题已知条件足够作答?[是/否,若否说明哪题]
JSON转义自检:含LaTeX的题目已双重转义?[是/否]
</thinking>

Step 3. 生成数据文件

将以下内容写入 outputs/data_[科目].js

window.examData = {
  "title": "[科目]期末模拟卷",
  "subject": "[科目]",
  "total_score": 100,
  "questions": [
    {
      "id": 1,
      "type": "choice",
      "score": 4,
      "content": "题目内容",
      "options": ["A.___", "B.___", "C.___", "D.___"]
    },
    {
      "id": 2,
      "type": "fill",
      "score": 5,
      "content": "题目内容,答案为___"
    },
    {
      "id": 3,
      "type": "solve",
      "score": 15,
      "content": "题目内容"
    }
  ],
  "answers": []
}

type 字段对应值:choice 单选、fill 填空、solve 计算/推导、essay 论述、case 案例分析、short 简答

Step 4. 注入并生成 HTML 文件

执行以下 bash 命令([科目] 替换为实际科目名):

cp templates/base_exam.html outputs/模拟卷_[科目].html && \
python3 -c "
data = open('outputs/data_[科目].js', 'r', encoding='utf-8').read();
html = open('outputs/模拟卷_[科目].html', 'r', encoding='utf-8').read();
html = html.replace('<!-- EXAM_DATA_INJECT -->', '<script>' + data + '</script>');
open('outputs/模拟卷_[科目].html', 'w', encoding='utf-8').write(html)
" && \
rm outputs/data_[科目].js

Step 5. 输出完成通知

˶ᵒᵕ˂˶ outputs/模拟卷_[科目].html 已生成,用浏览器打开即可答题

---
回复继续:[生成答案] [再出一套] [初始菜单] [✧>ᴗo⸝⸝使用帮助]

[生成答案] 触发后执行以下流程:

  1. 生成 outputs/data_答案_[科目].js,数据结构复用 Step 3 的 window.examData 格式,answers 数组填入每题的标准答案和关键步骤(理科:关键推导步骤+结论;文科/医学/法学:得分要点清单)
  2. 复制 templates/base_exam.htmloutputs/答案_[科目].html
  3. 执行与 Step 4 相同的注入命令,将 data_答案_[科目].js 内容注入到 <!-- EXAM_DATA_INJECT --> 占位符
  4. 删除 data_答案_[科目].js 临时文件
  5. 输出完成通知:˶ᵒᵕ˂˶ outputs/答案_[科目].html 已生成,用浏览器打开即可查看
  6. 渲染钩子:[再出一套] [初始菜单] [✧>ᴗo⸝⸝使用帮助]

[再出一套] → 返回触发后等待消息,重新接收文件名。

状态面包屑

每次输出顶部第一行,格式:⦁⩊⦁ 模拟出卷 · [科目] · 共___题

What ships with it: 15 files

421.8 KB alongside SKILL.md, 3 of them executable

.claude/

assets/

materials/

Keep looking

Skills are one crate of 325,949. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.