exam-ingest
>
pinned to #a70759dupdated 2 months ago
Ask your AI client: “install skills/exam-ingest”.
Requires the metahub MCP server installed in your client. Set up MCP.
mh install skills/exam-ingestmetahub 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 months 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
Automated checks the publisher passed at publish time — structure, docs, safety, and whether the artifact behaves as claimed.a70759d· 2 months ago
Behavioral checks ran but aren't published for this artifact; the static checks above ran at publish time.
Documentation
4 passed1 warningDescription 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 months ago
Contents
Purpose
Convert scattered prep materials into the fixed workspace structure that exam-cram depends on. Build the knowledge base only; do not teach or grade. Produce references/wiki/, references/quiz_bank.json, study_plan.md, and study_progress.md, then hand control back to exam-cram.
Activation
Activate when the workspace is missing — that is, any of references/wiki/, references/quiz_bank.json, or study_progress.md is absent. Also activate when the user has just uploaded courseware/syllabus/highlights/past exams, or explicitly requests 「初始化 / 建库 / 开始备考」(initialize / build the bank / start prepping).
Inputs
- Student-uploaded materials: text, textbook page images, teacher-marked highlights, past exam papers, lecture audio transcripts.
- Target workspace directory (default: current workspace root).
Workflow
- Dependency preflight (BEFORE touching the materials — never let a student discover a missing library as a mid-ingest crash). Run
python "${CLAUDE_SKILL_DIR}/scripts/check_deps.py" --materials <dir>: it is the single manifest of every optional dependency (PDF text backends / PyMuPDF page rendering / local browser for the cheatsheet PDF), probes what is installed, and prints the exactpip install …command for anything the student's materials actually NEED (exit 5 = a needed backend is missing). When something needed is missing, ask the student ONCE with the one-line consent phrasing from the language pack, install on yes, then re-run the preflight; on no, proceed only for the non-PDF part of the materials and say plainly what will be skipped. Never install silently, and never skip the preflight when the materials folder contains PDFs. - Parse the materials. Extract knowledge points, core formulas, high-frequency question types, and term definitions. Group them by chapter or phase.
- Build
raw_input.jsonin the background so it matchesscripts/ingest.py. Auto-construct an object withcourse_name,phases[], andquiz_bank[], and write it to a temp directory. Never ask the user to write or edit this JSON.- Every quiz item MUST carry
chapter(orphase); without it, chapter review cannot retrieve the item. Every item MUST carrysource:teacher(from the teacher/past exams) orai_generated(added by AI). - Set each item's type to one of six:
choice / subjective / diagram / fill_blank / true_false / code. - PDF / materials folder → use the official entry point; NEVER hand-write ad-hoc parsing scripts: when the input is a folder of lecture/homework PDFs, run
python <package-root>/scripts/build_raw_input_from_workspace.py --materials <dir> --out raw_input.json --asset-root <workspace>/references/assets --report parse_report.json. It preserves original-page provenance (source_file/source_pages), renders figure-dependent pages to full-page PNG assets, extracts lecture Example/Quiz question-solution pairs into the bank, and emits a parse report (extracted / skipped / warnings + the backend used). PDF text/rendering are optional dependencies — textpip install pypdf; renderingpip install pymupdf(bundles PNG) orpypdfium2 Pillow; when a dependency is missing the script fails with a clear message telling you what to install. Pure.txt/.mdmaterials need no dependency.--asset-rootmust point at<workspace>/references/assets(with rendering on but unset: auto skips with a warning, required errors out).Alert-takeover obligation (HARD): after build/import you MUST readparse_report.json'swarningsandskipped,ai_review_manifest.json'sentries, and the workspaceingest_report.json'smissing_answer_idsIN FULL, and handle them one by one: whatever is recoverable (re-save as UTF-8, rename with a chNN/sol marker, multimodally read the PDF/image directly to backfill knowledge points or questions) gets handled immediately; whatever is not, you MUST tell the student explicitly which materials were not imported and why. You MUST NOT silently skip a single entry — every program-side alert assumes 「AI 会接手」 (the AI takes over); if you don't take it over, it is lost forever. Common entries:likely_asset_required_but_no_image(install a rendering backend),pdf_pages_no_text/scanned_pdf(multimodal page reading to backfill),unsupported_format(read directly or convert),exam_no_markers(read the paper and extract questions directly),chapter_unassigned(check against the wiki chaptering),hw_pairing_ambiguous/hw_unpaired_solution_file(ask a human to confirm the pairing). Seedocs/file-format.md§4. - Homework auto-ingest: the official builder also recognizes homework / solution PDFs (filename patterns like
hw1.pdf+hw1_sol.pdf,作业3.pdf+作业3答案.pdf), pairs separate question/solution files automatically (inlineSolutionblocks too), and emits bank items taggedsource_type="homework"with page provenance — so homework-only scope has real inventory. Unpaired solutions / unanswered problems are fail-loud warnings in parse_report.json.
- Every quiz item MUST carry
- Run the package-root
scripts/ingest.py:python <package-root>/scripts/ingest.py --input <temp-json>. When the full package is installed in Claude Code,${CLAUDE_SKILL_DIR}points at the package root — usepython "${CLAUDE_SKILL_DIR}/scripts/ingest.py" --input <…>.- Recall cross-check AFTER ingest has created the workspace (
references/quiz_bank.jsonmust exist — this step reads it): runpython <package-root>/scripts/build_visual_index.py --workspace <workspace> --materials <dir>to build the dual visual indices (image_question_index.json+figure_page_index.json) and get the suspected-missed visual question report (source pages that ARE visual but whose items carry no visual flag/asset). If suspects are found, rerun with--apply(needs a render backend) to attach the original-page screenshot and setmaybe_requires_assets=true— never leave a figure-dependent item silently unlabeled. (In the no-Python fallback of step 4 this cross-check is unavailable — say so instead of skipping silently.)
- Recall cross-check AFTER ingest has created the workspace (
- No-Python fallback. If the script fails (e.g.
python is not recognized), switch immediately and silently: use file-write tools to build, fromlocales/<lang>/templates/(pick the pack matchingstudy_state.json.language; default zh, and fall back to the zh pack when an en template file is missing), the filesreferences/wiki/chN_*.md,references/quiz_bank.json,study_plan.md, andstudy_progress.md. - Label provenance (canonical labels in
docs/language-policy.md). In wiki paragraphs, distinguish 🟢 来自资料 from 🟡 AI补充,可能与你老师讲的不完全一致. For a question the teacher gave no answer to and AI answers instead, mark the answer ⚠️ AI生成答案,非老师/教材提供.
Output Contract
- Produce the standard workspace:
references/wiki/,references/quiz_bank.json,study_plan.md,study_progress.md. - The quiz_bank schema supports asset-aware fields for image-dependent lecture questions (e.g. a Venn diagram shown on a slide, a page figure/table):
source_file/source_pages,assets(underreferences/assets/),requires_assets,maybe_requires_assets,question_text_status. When a question depends on a figure that isn't transcribed into text: only setrequires_assets=trueormaybe_requires_assets=truewhen you actually attach a valid question-side image asset underreferences/assets/(the validator rejects visual-required items whose asset is missing/unreadable or answer-side-only). Notescripts/ingest.pyonly writesreferences/wiki/,quiz_bank.json, and the plan/progress files — it does NOT create or copyreferences/assets/. So if you reference an asset, you must write the image file under<workspace>/references/assets/yourself (file-write tools) before/after running ingest; otherwise leave the visual-required fields unset/false. If you have only a source-page reference and no image, setquestion_text_status="page_reference"withsource_file+source_pagesand leaverequires_assets/maybe_requires_assetsunset — the page reference tells the tutor to surface the page without the hard asset requirement. (The official builder takes the opposite, fail-closed stance for a figure it detected but couldn't render: it keepsrequires_assets=truewith the missing asset recorded, so the workspace won't validate until you install a render backend or supply the image. Both are intentional — hand-authoring stays graceful and never emits an invalid workspace, while the builder forces a genuinely-needed figure to surface rather than silently dropping it.) These fields are optional and backward-compatible (old banks stay valid); the official builderscripts/build_raw_input_from_workspace.pyemits them from PDF material (see Workflow step 2). Seedocs/file-format.md§4. - Emit one setup-receipt line, then hand control back to
exam-cramfor step two (teaching). - Student-facing output defaults to English (Simplified Chinese if the student opened in Chinese); a persisted
study_state.jsonlanguage(中文/English/双语) switches it per exam-cram's dispatch rule with single-language purity. The cold-start receipt follows the same dispatch; seedocs/language-policy.md.
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-ingest.mden→../../locales/en/skills/exam-ingest.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
scripts/ingest.pyandlocales/<lang>/templates/live at the package root, not insideskills/exam-ingest/. If this subskill is installed alone (CLAUDE_SKILL_DIRpoints only atskills/exam-ingest/), the script and templates are unavailable — install the whole package (including rootscripts/andlocales/), or use the step-4 no-Python fallback to build the workspace by hand.- Do not modify the logic of
scripts/ingest.py; only call it. - Use only safe filenames under
references/wiki/. The script rejects../, absolute paths, and duplicate names. - Do not fabricate a "standard answer" the teacher did not provide without the ⚠️ label. When materials are insufficient, state the gap honestly.
- Do not overwrite an existing
study_progress.md. The script does not clear it by default;--forcebacks it up first.
Reviews
No reviews yet. Be the first.
Related
Verification Before Completion
Evidence before assertions, always
Writing Plans
Turn specs into phased implementation plans
Test-Driven Development
Red → green → refactor discipline for any feature or bugfix
mh install skills/exam-ingest