A Claude Code plugin that coaches you through learning a subject, across multiple sessions, instead of lecturing at you. It runs a Knowledge → Skills → Wisdom progression grounded in your real goal, and keeps persistent per-topic learning state so each session builds on the last.
Invoke /education:teach with an action for coached, multi-session learning, for
example /education:teach topic rust-ownership,
/education:teach codebase auth-flow, or /education:teach primer color-grading.
For a one-shot plain-language explanation, invoke /education:explain, or just
say "I don't get it" and let it auto-invoke. After Claude finishes a change,
invoke /education:quiz-me to be quizzed on what was done.
teach is the multi-session coach; explain and eli5 are its one-shot
siblings; quiz-me verifies you absorbed a completed change.
Two one-shot lanes, split by medium. explain is the adaptive prose lane: it
starts plain and climbs to high-school then peer level on request. eli5 is the
fixed visual lane: one altitude (assumes zero prior knowledge), one medium (a
diagram-led HTML artifact). Ask for a simpler wording and you want explain; ask
for the picture version and you want eli5.
/education:teach topic <subject>. Learn a general subject from external high-trust sources (books, courses, docs, communities)./education:teach codebase <topic>. Learn a concept grounded in the repository you launch it from. It discovers the repo's own docs, conventions, and source at teach-time and teaches from what it finds. Nothing about the project is assumed./education:teach primer <domain>. A single-session vocabulary primer for an unfamiliar domain, so you can prompt or direct work in it precisely. No workspace./education:explain [thing]. A one-shot, plain-language explainer. It drops any concept, code, error, architecture, or the previous assistant response to genuinely plain words (concrete analogy, zero jargon), then layers altitude up only on request (high-school, then peer level). An empty argument explains the previous assistant response, so "I don't get it" needs no topic. It closes by offering/education:teachwhen you want ongoing coaching rather than a single explanation./education:eli5 [topic]. A picture explainer. It answers the question as a diagram-led HTML artifact written for someone who knows nothing about the topic: one idea per diagram, minimal text, real identifiers kept but demoted to parentheses and monospace. It covers general knowledge and repository topics alike, and grounds itself first (reads the module, finds the decision record, reads the incident writeup) rather than explaining from memory. It wraps the communityeli5skill when that plugin is installed and produces the same explainer itself when it is not./education:quiz-me. A post-work comprehension check. After a change is complete, it generates a self-contained HTML report of what was done (context, intuition, decisions) with a quiz at the bottom you answer, verifying that you absorbed the work, not just that the artifact is correct. It is non-gating by default; thequiz_policysetting tunes how often a quiz is offered. Itsrecall <query>action answers "what did we do on<ticket>" from a retained report library first, git and tracker history second.- Supporting
teachactions:mission,glossary,resources,explain,exercise,assess,resume,status.
The coach asks questions before giving answers, teaches just beyond your current level (the zone of proximal development), and grounds every claim in a source fetched or a file read that session rather than from memory.
Each topic gets a workspace. A mission (why you're learning this), a glossary,
curated resources, and per-concept slices (a lesson, a durable reference
cheat-sheet, and optional practice). Learning state is treated as your documents,
not machine internals: topic-mode workspaces default to a Claude Learning/ home
in your OS Documents folder (when one is eligible), while codebase-mode workspaces
stay under ${CLAUDE_PLUGIN_DATA} by default. Their lessons can embed snippets
from your repo, and Documents folders are often cloud-synced. Either way the state
survives plugin updates, stays out of your project's tree, and lets you resume a
topic weeks later; the root is configurable (see Configuration). Durable references
are re-verified lazily on revisit (age × domain-velocity) so stale facts get
refreshed before they're taught. See the skill body for the full pedagogy.
- Bash + coreutils (
sha256sum/shasum,realpath,tr,sed) for the skill's inline mechanics. On native Windows, install Git for Windows so they run under Git Bash, which bundles all of them. - For
codebasemode, launch it from the repository you want to learn. The plugin reads that repo's own docs and source. topicmode fetches documentation URLs to ground explanations in primary sources; if your setup restrictsWebFetch, allow it or seedRESOURCES.mdmanually.
/plugin marketplace add melodic-software/claude-code-plugins
/plugin install education@<marketplace>/education:eli5 works on its own. When the community eli5 plugin is
installed it delegates to that skill instead of producing the explainer itself,
so the two stay in step rather than drifting apart. To add it:
claude plugin marketplace add anthropics/claude-plugins-community --scope project
claude plugin install eli5@claude-community --scope projectThose flags are what make it repository-wide: a bare marketplace add writes
user settings instead. Drop both flags for a machine-wide install, bearing in
mind that user scope covers only your own local sessions and remote sessions
never load it. Run /reload-plugins or restart afterwards. Installing
it manually also satisfies a dependency constraint, so nothing here requires a
declared dependency.
This plugin deliberately does not declare eli5@claude-community in
dependencies: a hard dependency would install a second marketplace's plugin
for everyone who wants teach or quiz-me, and an unresolved one disables the
whole plugin. A downstream marketplace that republishes this plugin and does
want the hard dependency adds claude-community to its own root
marketplace.json under allowCrossMarketplaceDependenciesOn, which is a
publisher-side allowlist rather than a consumer setting.
All settings are optional, with defaults that preserve zero-config behavior:
| Setting | Type | Default | What it does |
|---|---|---|---|
quiz_policy |
string | on-request |
When quiz-me offers a quiz: off (never), on-request (only when asked), always (after each completed change), above-threshold (when the change is large). Offer cadence only, a report is never generated without your confirmation. Unknown values act as on-request. |
report_library_dir |
directory | (unset) | Where quiz-me stores reports. Unset uses the plugin's own ${CLAUDE_PLUGIN_DATA}; set it to a corpus checkout to redirect the library root there. Reports never land in the repo you are working in. |
workspace_root |
directory | (unset) | Where teach roots learning workspaces. Unset resolves a ladder: a project declaration, this setting, a one-time ask, the OS Documents Claude Learning/ home (topic mode only), then ${CLAUDE_PLUGIN_DATA}. Codebase-mode workspaces stay under plugin data unless explicitly rooted elsewhere. Values inside the repo you are working in are refused. |
Configure them through the /plugin dialog, or headless at install time with
claude plugin install education@<marketplace> --config quiz_policy=always. A literal
non-home report_library_dir may be rejected by the hardcoded-path guardrails until
the #798 path-indirection work lands.
Run /education:setup to validate the effective quiz_policy, report-library root,
and teach workspace root without reading settings files.
Generated from this plugin's .claude-plugin/plugin.json. Every option Claude Code
will prompt for when the plugin is enabled, with the environment variable each hook
reads it from.
| Option | Type | Default | Environment variable | Description |
|---|---|---|---|---|
quiz_policy |
string | "on-request" |
CLAUDE_PLUGIN_OPTION_QUIZ_POLICY |
When quiz-me offers a post-work comprehension quiz. One of: off (never offers), on-request (only when asked), always (after each completed change), above-threshold (when the change is large). Governs offer cadence only. A report is never generated without your confirmation. Unknown values are treated as on-request. |
report_library_dir |
directory | (none) | CLAUDE_PLUGIN_OPTION_REPORT_LIBRARY_DIR |
Where quiz-me stores generated reports and quizzes. Unset uses the plugin's own persistent data directory; set it to a corpus checkout to redirect the library root there. Artifacts never land in the consuming repo's tree. |
workspace_root |
directory | (none) | CLAUDE_PLUGIN_OPTION_WORKSPACE_ROOT |
Where /education:teach stores learning workspaces. Unset resolves a ladder: project declaration, this setting, a one-time ask, the OS Documents folder's 'Claude Learning' home (topic mode only), then the plugin's persistent data directory. Codebase-mode workspaces stay under plugin data unless a project declaration or this setting names a root, since their lessons can embed private-repo snippets and Documents roots are often cloud-synced. Grammar: absolute, ~-home-relative, or ${NAME} / %NAME% environment references; a relative value resolves against the project; a value inside the consuming repo is refused. Declare an in-repo root in the project's own CLAUDE.md or rules instead. |
Three supported routes, in the order most people want them:
-
Interactively. Claude Code prompts for declared options when you enable the plugin. To change them later:
/plugin configure education@<marketplace>. -
Headless. Repeat
--configfor each option. Replace<marketplace>with the marketplace you installed this plugin from:claude plugin install education@<marketplace> -s <scope> --config quiz_policy=<value>
The same command reconfigures a plugin that is already installed: it prints
already installedand still writes the value. The short-circuit message is about the install, not the config write. Do notclaude plugin uninstallto reconfigure: uninstalling drops this plugin's whole storedpluginConfigsentry, resetting every option in the table above to its default.-sdefaults touser, so pass the scopeclaude plugin listreports for this plugin. The verified-version record lives in the plugin-reconfiguration convention.The value is stored immediately; the session you are in does not change. Hooks are handed their
CLAUDE_PLUGIN_OPTION_*when the session starts, so start a fresh Claude Code session before expecting new behavior. A check run in the old session still reports the old value, and that is not a failed write. -
By hand, in settings. Add the value under
pluginConfigsin your user settings (~/.claude/settings.json):{ "pluginConfigs": { "education@<marketplace>": { "options": { "quiz_policy": <value> } } } }Plugin option values are read from user,
--settings, and managed settings only, not from a project's.claude/settings.json. To vary behavior per repository, enable or disable the plugin in that project'senabledPluginsinstead of setting an option there.
Do not set the CLAUDE_PLUGIN_OPTION_* variables yourself. They are how Claude Code
hands a configured value to a hook process; the value comes from the routes above.
- User configuration: the
userConfigschema and theCLAUDE_PLUGIN_OPTION_<KEY>export - Plugin install options: the
--configflag's reference entry - Plugins and skills settings:
enabledPlugins,extraKnownMarketplaces,pluginConfigs - Settings files and who they affect: user vs project vs local precedence
- Manage installed plugins: enabling, disabling,
/plugin list
MIT (SPDX-License-Identifier: MIT).