zekainie/confusion-tracker
教学过程中自动捕获和记录学习者的概念疑难点("为什么/是什么/怎么推/什么意思"类型的问题),保存到进度文件的"概念疑难点记录"区,形成考前回顾清单。
npx skills add https://github.com/ZeKaiNie/universal-examprep-skill --skill confusion-tracker
Capture the learner's concept-level confusions (why / what / how-derived questions — not quiz answers) during tutoring and record them into the 「概念疑难点记录」 section of study_progress.md, building a pre-exam review list. Used by exam-tutor (while teaching) and exam-review (during the final sweep).
study_progress.md), read at session start.关联章节 / 疑难点 (one line) / 解答要点 (≤2 sentences) / 状态 (default 待回顾). If study_state.json is absent and Python works, first run python "${CLAUDE_SKILL_DIR}/scripts/update_progress.py" --workspace <ws> init. The normal and ONLY state-backed write path is then python "${CLAUDE_SKILL_DIR}/scripts/update_progress.py" --workspace <ws> add-confusion --chapter <ch> --note <疑难点/解答要点> — the md table is a generated view and a hand-appended row is lost on the next render. Only when Python truly cannot run may the no-Python fallback append directly to the 「## 💡 概念疑难点记录」 table in study_progress.md, auto-incrementing the 序号 column. A nonzero state command while Python runs is a fail-loud write failure, not permission to hand-edit.echo <explanation body> | python "${CLAUDE_SKILL_DIR}/scripts/notebook.py" --workspace <ws> add-entry --chapter <ch> --type confusion --id <slug> --title <confusion gist> (body via STDIN; same --id replaces in place; notebook/index.md rebuilds; the script resolves from the skill package root). The receipt line then carries the pack-provided link line (zh 「完整解答:notebook/chNN.md#<anchor>|目录:notebook/index.md」, en Full explanation: notebook/chNN.md#<anchor> | Index: notebook/index.md). On a failed notebook write, TELL the student (the chat explanation already delivered stands as the copy); file-less clients keep chat-only output per exam-cram's capability dispatch.关联章节 / 疑难点 / 解答要点 / 状态) through update_progress.py add-confusion; initialize state first when Python works. Only a true no-Python fallback appends one row to the 「## 💡 概念疑难点记录」 table in study_progress.md (序号 auto-increments).notebook/chNN.md via the notebook CLI (--type confusion, Workflow step 3) — the state row records that the confusion exists, the notebook entry preserves the explanation itself; the receipt carries the pack-provided link line. File-less clients keep chat-only output.状态 in place — 待回顾 → 已回顾 when explained correctly; keep 待回顾 and re-explain otherwise. Never overwrite other skills' writes.study_state.json.language code (zh/en/bilingual) switches it per exam-cram's dispatch rule with single-language purity.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:
中文 → ../../locales/zh/skills/confusion-tracker.mdEnglish → ../../locales/en/skills/confusion-tracker.md双语 → compose the zh and en packs block by block, zh first with a > EN: mirror (rules in ../../docs/language-policy.md)Display aliases such as 中文, English, and 双语 are normalized by update_progress.py; route persisted state on zh, en, or bilingual. Unset language → the merged first-ask decides it; default English unless the student opened in Chinese.
study_state.json exists it is the SINGLE SOURCE OF TRUTH — record via python "${CLAUDE_SKILL_DIR}/scripts/update_progress.py" --workspace <ws> add-confusion, update review status via set-confusion-status --id <qid>|--index <N> --status 已回顾/待回顾; never hand-patch the generated study_progress.md. If the state write fails, TELL the user; never continue as if it saved.exam-quiz).exam-review: in state-backed workspaces both skills go through update_progress.py (append via add-confusion, status via set-confusion-status); only a true no-Python md-only workspace appends/updates study_progress.md in place. Never overwrite other skills' writes.Take zekainie/confusion-tracker from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.