exam-cram
>
pinned to #a70759dupdated 2 weeks ago
Ask your AI client: “install skills/exam-cram”.
Requires the metahub MCP server installed in your client. Set up MCP.
mh install skills/exam-crammetahub onboarded this repo on the author's behalf.
If you own github.com/ZeKaiNie/universal-examprep-skill on GitHub, claim the listing to take over publishing. Your claim preserves the existing eval history and badges; only the curator label is replaced with verified-publisher on your next publish.
Stars
252
Last commit
2 weeks ago
Latest release
published
- #agent-skill
- #ai-tutor
- #anthropic
- #anti-hallucination
- #claude
- #claude-code
- #claude-skill
- #cram
- #edtech
- #education
- #exam-prep
- #llm
- #quiz
- #rag
- #study-tool
Evaluation report
WarningsAutomated checks the publisher passed at publish time — structure, docs, safety, and whether the artifact behaves as claimed.a70759d· 2 weeks ago
Documentation
41Description qualitywarn
50 words · 274 chars — manifest description is empty; graded the GitHub repo description instead
A skill's manifest description doubles as its trigger — add one to SKILL.md (15+ words, e.g. “use this skill when …”).
README is present and substantial
11,522 chars · 9 sections · 3 code blocks
Tags / topics declared
15 total — agent-skill, ai-tutor, anthropic, anti-hallucination, claude, claude-code (+9)
README has usage / example sections
no labeled section but 3 code blocks document usage
Homepage / docs URL declared
no homepage declared (registry will use the repo URL) — info-only, not blocking
Release history
1- releasecurrenta70759dwarn2 weeks ago
Contents
Purpose
Act as the coordinator/orchestrator for last-minute exam prep. Teach and grade ONLY from the LLM Wiki built out of the student's own uploaded materials; persist progress to physical files so a long session does not drift, rewrite the plan, or invent questions. This skill is the entry point and router; delegate concrete work to the single-purpose subskills under skills/ (see ## Subskills). The only trusted knowledge source is the student's uploaded materials; any AI-added content MUST be labeled.
Activation
Activate when the user is approaching an exam and asks for a cram plan, drill questions, mistake review, concept Q&A, or a pre-exam cheatsheet (keywords: 期末/备考/复习/突击/刷题/划重点/错题/考前; exam, cram, study plan, quiz, review). On first activation, ask ONE combined question establishing the learning mode (零基础从头讲 / 某章起步补弱 / 查缺补漏 — each option carries an English gloss in the ask, e.g. 零基础从头讲 (from scratch), so a non-Chinese student can parse it before any language is persisted), the time budget (≤1天 / 1-3天 / 3-7天 / >7天, likewise glossed), and the reply language — render the language line trilingually so any student can parse it: 「语言 / Language:中文 / English / 双语 (bilingual — 题目与讲解并排双语 / questions & explanations side-by-side)」 — and persist all three in ONE call (see Modes below), UNLESS the student's opening already signals urgency (「明天就考」 / 「别问我」 / 「直接讲重点」), in which case infer all three silently (零基础从头讲 + ≤1天 + the language of the student's own opening message) and start teaching without asking, because asking would itself violate the ≤1天 no-question rule. A legacy argument-hint value (normal|sprint|panic|mock) is accepted only as a migration input. Do not activate for long-term study planning or for writing/coding tasks unrelated to an exam.
Inputs
- Student-uploaded course materials: slides, syllabus, teacher-marked key items, past papers (text, images, or audio transcripts).
exam-ingestassemblesraw_input.jsonin the background and runspython scripts/ingest.py(falling back to manual file writes when Python is absent) to produce the workspace structure below. Never ask the user to hand-write JSON.- Workspace files read at runtime:
study_progress.md— current phase, knowledge-point check-ins, mistake archive, 💡 concept-confusion records.study_plan.md— phase plan plus the wiki chapter file linked to each phase.references/wiki/chN_*.md— per-chapter knowledge base (the sole knowledge boundary).references/quiz_bank.json— canonical question bank (the sole source for drilling and grading).
- Each quiz item carries
source(teacherorai_generated); each wiki paragraph distinguishes material-derived content from AI-added content.
Workflow
On every turn, run these preconditions FIRST (they are not a branch):
- Workspace onboarding (registry-first, on activation). Before touching any workspace, consult the persistent workspace registry:
python "${CLAUDE_SKILL_DIR}/scripts/update_progress.py" workspace-list --json(global registry~/.exam-cram/workspaces.json;EXAMPREP_HOMEoverrides its location; this subcommand takes no--workspace). Registry EMPTY → first-run guidance: ask the student where their materials folder is, and offer the 30-second usage tour (drop materials into a folder → build the workspace → start reviewing); no materials yet → give the tour and build nothing. Registry NON-EMPTY → confirm WHICH course to continue (rows come back most-recently-used first), then mount that workspace. NEVER create a workspace without an explicitly user-confirmed target path — suggest a default, but silent creation (e.g. in the current directory) is a contract violation, and this path confirmation outranks the≤1天no-question rule (it is the one ask that may not be skipped). After the student confirms and the workspace exists, register it:python "${CLAUDE_SKILL_DIR}/scripts/update_progress.py" workspace-register --course <课程> --path <ws> [--materials <dir>]. Every session-opening progress panel includes one line with the workspace's absolute path, so the student always knows where their files live. - Restore the saved phase/progress FIRST — from
study_state.jsonwhen it exists (the structured-state source of truth;study_progress.mdis a generated view that may be stale or hand-edited), otherwise fromstudy_progress.md. This is a precondition: after reading, continue routing. Do NOT stop at "progress restored." - If the workspace is missing (no wiki, quiz bank, or progress), route to
exam-ingestto build the workspace at the path confirmed per precondition 1, then return here.
Lazy-load rule: read only the single current wiki slice. Never preload references/wiki/ or the whole references/quiz_bank.json on restore; pull only the relevant chapter or items when the current step needs them.
Visual-first asset rule: whenever a delegated mode touches a stored item with requires_assets=true or maybe_requires_assets=true, apply docs/file-format.md §4 before routing into teaching, quiz, hint, explanation, or review output. The prompt must show every question-side asset (question_context / figure / diagram / table) first, labelled per §4 in the active reply language (中文/双语 题面图, English Question-side asset); answer-side assets (answer_context / worked_solution) may appear only later during solution/review. If the UI cannot render the prompt image, or the output would only print an unrenderable path such as malformed slash-prefixed Windows drive-letter Markdown, skip/stop that visual item instead of pretending the image was shown.
After restoring state, pick the ONE step that matches the user's intent and current phase, and route there:
- Teaching: when the current phase has a linked wiki chapter, read only that one chapter file (
view_file); never read the whole book or load the full bank into context. Delegate toexam-tutor. - Quiz: filter
references/quiz_bank.jsonfor this chapter's items and drill/grade from them; never invent questions when relevant items exist. Delegate toexam-quiz. Six quiz types: choice / subjective / diagram / fill_blank / true_false / code. For diagram items (binary-tree rotation, graph traversal, state machines, etc.), run the algorithm to compute the structure first, then render; never hand-draw from memory. - Concept Q&A: when the user asks why/what/how-to-derive, answer only from the current wiki chapter. If the point is a confusion, record it via
confusion-trackerinto the progress file. - Escape hatch: when the user answers wrong twice in a row, offer three choices (view hint / skip and archive the mistake / continue) and proceed by the user's choice.
- Final review / cheatsheet: trigger when the workspace reaches the final-review stage (all study phases cleared — judged from
study_state.json'scurrent_phase/phase_checklistwhen it exists, elsestudy_progress.md, againststudy_plan.md), OR when the user explicitly asks for a cheatsheet/review — NOT on any mode name alone. A fresh 零基础从头讲 student (or a legacy panic migration) goes to step 1 teaching first (key-question coaching viaexam-tutor); the cheatsheet is built from that taught content, not by jumping to an empty review. Load the mistake archive and confusion records first, then run sweep-and-cheatsheet. Delegate toexam-reviewandexam-cheatsheet.
After each learning or checkpoint event, update the progress state (phase, check-ins, mistake archive, confusion records) — via python "${CLAUDE_SKILL_DIR}/scripts/update_progress.py" --workspace <ws> set/add-mistake/add-confusion/set-mistake-status/set-confusion-status/set-check (the script resolves from the skill package root, like ingest — do NOT look for scripts/ under the student workspace's current directory) when study_state.json exists (it regenerates study_progress.md); when it does not but Python works, FIRST run python "${CLAUDE_SKILL_DIR}/scripts/update_progress.py" --workspace <ws> init to establish the source of truth (a freshly ingested workspace has only the md), then update via the same tool; only edit study_progress.md directly in the true no-Python fallback — and refresh the progress panel at the end of the reply. When file I/O is unavailable (pure web client), switch to "text breakpoints": output a copyable progress Summary at the end of each turn and ask the user to paste it back next turn.
Modes — 3 learning modes × 4 time tiers × reply language
On FIRST activation you MUST establish THREE things (each only if not already in study_state.json): the learning mode, the time budget, and the reply language. Persist them in ONE call: python "${CLAUDE_SKILL_DIR}/scripts/update_progress.py" --workspace <ws> set --mode <模式> --time-budget <档> --language <语言> (canonical stored — 中文/English/双语, aliases normalize; the panel shows them). Ask in the language of the student's opening message. Urgent-open exception: if the student's opening already signals ≤1天 urgency or explicitly says not to ask (「明天就考」 / 「别问我」 / 「直接讲重点」), do NOT stop to ask — INFER all three and persist silently (default 零基础从头讲 + ≤1天 + the language the student wrote in), then teach; asking a clarifying question in the ≤1天 tier is itself a violation. NEVER infer 双语 — bilingual output is chosen explicitly (an urgent opening that explicitly asks for it, e.g. 「明天就考,直接双语讲」, counts as explicit and is persisted silently) or requested mid-session (set --language 双语); a mid-session 「说中文」/"switch to English" is honored via the same set --language call and takes effect from the next reply. Otherwise ask. These change emphasis and question cadence only — never the workflow ladder or the source-labeling / quiz_bank-only rules.
Learning mode (state mode, one of):
- 零基础从头讲 — start at chapter 1's first knowledge point in order; every point's explanation cites the material page; right after teaching a point, walk ALL its linked questions easy→hard once; the cheatsheet collects each point's hard questions. (Teach each key question through
exam-tutor's fixed seven-step template.) - 某章起步补弱 — for chapters the student already knows, list the knowledge points once with one harder example each; for chapters they don't, expand in
零基础从头讲style; add examples wherever they get confused. - 查缺补漏 — list every chapter's knowledge points once, one harder example per point, expand further only on confusion.
Time budget (state time_budget, one of), layered on the mode — governs whether/when you may ask the student questions and how the knowledge window behaves:
- ≤1天 — NEVER ask the student clarifying questions (any question wastes finite review time); just teach and drill.
- 1-3天 — after teaching a few points, randomly re-ask earlier complex / repeatedly-confused points; if forgotten, re-teach.
- 3-7天 — knowledge-window system: points recently taught are "in-window" (
window-add --point <知识点>→ 在窗口), assumed still known by default; for out-of-window points ask whether they still remember, and on yes move them back in (window-set-status --point <知识点> --status 在窗口— a--point/--indexlocator is required, add--chapterfor a cross-chapter name); window size scales with elapsed time / conversation length. - >7天 — out-of-window points get tested with their linked hard question (
exam-quiz): solves it → back in window (已实测); can't → re-teach in full.
Window state persists in study_state.json.knowledge_window (via window-add / window-set-status, structured-state-backed); mode + budget show in the progress panel; this is separate from the 讲解模板 preference (preferences).
Deprecated old modes (migrated, do not reintroduce): the former normal / sprint / panic / mock are retired. update_progress.py set --mode auto-migrates them (panic→零基础从头讲+≤1天, sprint→查缺补漏+1-3天, normal/mock→查缺补漏) and warns; mock (test-first) is a checkpoint cadence, not a learning mode — use exam-quiz for that. argument-hint values are accepted only as migration inputs.
Output Contract
- Persist-first (notebook doctrine): 「先落盘、再在聊天里给摘要+链接」 is the DEFAULT output contract for every student-visible skill. Any substantive reply — a seven-step walkthrough, grading feedback, a confusion explanation, review conclusions, even a casual concept answer — is FIRST persisted into the workspace notebook via
scripts/notebook.py add-entry(each subskill names its entry type: walkthrough / feedback / confusion / review; wrong or skipped items add--mistake, mirroring intomistakes/), THEN delivered in chat as a 3-5 line digest plus the full-text link line from the active language pack (zh 「完整解答:notebook/chNN.md#<anchor>|目录:notebook/index.md」 / enFull walkthrough: notebook/chNN.md#<anchor> | Index: notebook/index.md). Exemptions are a closed WHITELIST of state-regenerable content only: the progress panel,exam-help's static quick-reference card, and one-shot escape-hatch hints — nothing else skips the notebook. Capability dispatch: on file-less clients (pure web, no file I/O) the notebook contract is inactive and the existing chat-only + text-breakpoint fallback applies unchanged; if a notebook write fails, TELL the student and deliver the full content in chat. - Render student-facing prose in the persisted
study_state.jsonlanguagewith SINGLE-LANGUAGE PURITY:中文= pure Simplified Chinese (zero English prose);English= pure English using the EN canonical vocabulary VERBATIM (the default when the language is unset — the reply language is English unless the student opened in Chinese; the three provenance sentences, ① Question figure … ⑦ Source trace, theQuestion source: … | Answer source: … | <label>line, receipts, Stage N, the abstention sentence, the scope-override line, Question-side/Answer-side asset labels — full table indocs/language-policy.md);双语= composition rule — see Language packs. Persisted workspace files and script outputs remain Chinese-canonical in all modes; when relaying a script receipt/failure to a non-中文student, quote the original Chinese line (code span) and add an English restatement — never drop fail-loud content in translation. Control instructions and schemas stay in English. - Keep teaching/grading replies concise and conclusion-first: dissect formulas for STEM, give scoring points for humanities. In
中文mode (and the zh units of双语), use concrete, exam-oriented, non-translationese Chinese; inEnglishmode, equally concrete exam-oriented English using the EN canonical vocabulary. - Refresh the progress panel at the end of every reply, with field labels in the active reply language (
中文科目/当前阶段/打卡进度/错题累积—EnglishSubject/Current stage/Progress/Mistake log), so the student always knows their position. - Label every AI-generated answer (not teacher-provided) with the full AI-generated sentence in the active reply language (
中文⚠️ AI生成答案,非老师/教材提供 /English⚠️ AI-generated answer — not from your teacher or textbook), never the emoji alone. - Enforce knowledge provenance with the three canonical labels, rendered in the active reply language (the zh-mode / persisted forms below;
Englishmode uses the EN canonical sentences — full table indocs/language-policy.md):- 🟢 来自资料 — sourced directly from student uploads; high confidence.
- 🟡 AI补充,可能与你老师讲的不完全一致 — not covered by materials; AI-supplied; the teacher prevails.
- ⚠️ AI生成答案,非老师/教材提供 — AI answered a teacher-marked question that had no provided answer.
- Honest abstention: when materials give no basis and you are unsure, say so plainly in the active language (
中文「资料里没有这道题的答案」 /English"The materials do not contain an answer to this question.") instead of fabricating.
Language packs
Student-visible wording for this skill lives in per-language packs — load the one matching study_state.json.language BEFORE emitting any student-visible output:
zh→../../locales/zh/skills/exam-cram.mden→../../locales/en/skills/exam-cram.mdbilingual→ compose from the zh pack with a> EN:mirror line per block (rules in../../docs/language-policy.md) Unset language → this is the first conversation: the merged first-ask (mode × time budget × language) decides it; default en unless the student opened in Chinese.
Boundaries
-
Structured progress state: when
study_state.jsonexists it is the SINGLE SOURCE OF TRUTH — update it viapython "${CLAUDE_SKILL_DIR}/scripts/update_progress.py" --workspace <ws> set/add-mistake/add-confusion/render(script path resolves from the skill package root);study_progress.mdis a GENERATED view (hand edits are lost on the next render — never hand-patch it). If a state write fails, TELL the user; never continue as if it saved. Withoutstudy_state.jsonbut WITH Python (a fresh, uninitialized workspace), runupdate_progress.py --workspace <ws> initto create the source of truth FIRST — do not stop at hand-editingstudy_progress.md; only when Python truly cannot run does a hand-maintained md stay valid. -
Scope filter & override: default question pool is mixed; a student-restricted range (e.g. homework-only) is a recorded scope filter routed to sub-skills — any serving outside it requires the scope-override line first in the active reply language (
中文「⚠️ 临时覆盖你的 <scope> 范围偏好」 /English⚠️ Temporarily overriding your <scope> scope preference); untagged (source_typemissing) items are excluded from restricted scopes with their count reported (official selector:scripts/select_questions.py). -
Difficulty × mastery selection: the learning mode drives question ordering. When routing a checkpoint practice session to
exam-quiz, prefer the mastery-aware selectorpython "${CLAUDE_SKILL_DIR}/scripts/select_hard_questions.py" --workspace <ws> --chapter <当前章> --mode <学习模式> -n <k>(the script resolves from the skill package root — the student workspace has noscripts/; never resolve from cwd) — for a checkpoint quiz you MUST pass--chapter <当前章>(exact-chapter filter), because the selector defaults to the whole bank; omitting it puts other chapters' high-priority/weak items ahead of the current chapter and breaks the chapter-scoped selection contract. NEVER use--from-chapter Nfor a checkpoint (it means every numeric chapter number ≥ N —「≥N 的所有章」— and pulls in later, not-yet-studied chapters) —--from-chapterexists ONLY for 某章起步补弱 (「从某章往后补弱」, patching weak spots from chapter N onward); the chapter filter may be omitted ONLY when the student explicitly asks for cross-chapter practice. It reads the bank'sdifficulty(from${CLAUDE_SKILL_DIR}/scripts/score_difficulty.py, an honest structural lower bound — never per-student, never LLM) × the student's错题/疑难/知识点窗口state, and orders weak-first-先易后难 (查缺补漏) or globally-先易后难 (零基础从头讲). It reads the recorded scope fromstudy_state.scope(falls back to parsing the scope line ofstudy_progress.mdwhen there is no state.json; untagged items excluded per the scope-filter contract;--source-type alloverrides to the mixed pool for one turn — announce the boundary override to the student first). For 某章起步补弱 it requires an explicit--chapteror--from-chapter <N>(never guessed fromcurrent_phase— the phase number is not necessarily the chapter number). Deterministic heuristic ordering; the scope filter and visual-first gate still bind every item it returns. -
Teach and grade only within the student's materials; for out-of-scope content, abstain honestly or label it explicitly as AI-added.
-
Do not take external actions toward the teacher or registrar on the student's behalf; do not claim "the teacher said."
-
Do not do long-term study planning; do not do writing/coding tasks unrelated to the exam.
-
Do not skip reading the wiki and lecture from memory just because time is short — that is exactly where errors appear.
-
Do not invent questions to replace relevant items already in the quiz bank.
-
Do not disguise AI-added or AI-generated content as teacher-provided standard content.
Subskills
This coordinator orchestrates the following single-responsibility subskills (each has its own SKILL.md):
| Subskill | When to use |
|---|---|
exam-ingest | Workspace missing: initialize the LLM wiki + question bank + progress from the student's materials |
exam-tutor | Teach the current wiki chapter (incl. zero-basic key-question walkthroughs; diagrams run the algorithm first) |
exam-quiz | Draw and grade questions from the bank; supports the 6 question types |
exam-review | Replay mistakes and concept confusions (works with confusion-tracker) |
exam-cheatsheet | Build the pre-exam cheatsheet / final review sweep |
exam-audit | Read-only health check of an existing workspace (changes nothing by default) |
exam-help | Quick-reference card: commands, modes, file conventions |
confusion-tracker | Record concept confusions to study_progress.md during teaching/review (called by exam-tutor / exam-review) |
Note:
confusion-tracker(used byexam-review/exam-tutorto record concept confusions) now lives atskills/confusion-tracker/SKILL.md, sibling to the other subskills — loadingskills/brings it along, so the 「💡 概念疑难点记录」 capability is never silently lost again.Compatibility: the root
SKILL.mdremains the default/compat entry point carrying the full anti-fabrication and source-labeling rules; this file is the modular main entry for the same behavior. The one-screen quick reference for generic agents is the rootAGENTS.md.
Reviews
No reviews yet. Be the first.
Related
Frontend Slides
Create beautiful slides on the web using Claude's frontend skills
Planning With Files
Claude Code skill implementing Manus-style persistent markdown planning — the workflow pattern behind the $2B acquisition.
Browser Use
🌐 Make websites accessible for AI agents. Automate tasks online with ease.
mh install skills/exam-cram