Releases: Flagrare/llm-tutor
Release list
v0.5.1 — display_name in /tutor-status and /tutor-resume
Consistency follow-up to v0.5.0: the statusline already rendered the human display name, but the dashboard and resume orientation kept showing the kebab-cased slug. This release closes the gap.
Behaviour
/tutor-statusshows human topic names. The dashboard's Active and Completed sections now render the subject you typed at/tutor-startinstead of the slug-key. So if you started with/tutor-start "Python decorators", the dashboard readsPython decorators, notpython-decorators./tutor-resumedoes the same. The orientation line is now "Resuming Python decorators." When you have multiple active topics, the disambiguation prompt lists them by display name, and you can type the name (or a substring) to pick — no need to recall the exact slug.
Backward compatible: topics created before v0.5.0 don't have a display_name and continue to render as their slug-key. No migration needed.
v0.5.0 — Human display names, separator rule, configurable truncation
Three statusline-row improvements that surfaced from real use.
Public API
- Topics carry a
display_name./tutor-start "What closures are in Python"now stores both the slug (what-closures-are-in-python, the state-file key) and the original subject string ("What closures are in Python", what the statusline renders). Mixed case, spaces, reads as the question you asked rather than a path-style identifier. Existing topics from before this release continue to render their slug — backward compatible.
Behaviour
- Separator rule between host statusline and llm-tutor's row. When the wrapper has an original statusline to append beneath, it now emits a dim full-width horizontal rule above our segment row. Signals "this is a separate section" so your eye doesn't read llm-tutor's row as another row of the host's content. Width auto-detects via
$COLUMNS→tput cols→ 80. Mode-aware character:─for emoji/nerd/unicode,-for ascii. No rule when llm-tutor is the entire statusline. - Default truncation bumped from 20 → 40 characters. Most real subject lines now render full-width.
- New
SLUG_MAX_LENknob in~/.claude/llm-tutor/statusline.conf. Set to0to disable truncation entirely, or any positive integer for a custom cap. Documented indocs/guides/statusline.md.
Before: 📖 what-closures-are-in… 0/5
After: 📖 What closures are in Python ▰▱▱▱▱
v0.4.1 — Self-locating wrapper shim
Durability fix: /plugin update llm-tutor followed by /reload-plugins now picks up new statusline behavior immediately — no /tutor-statusline-install rerun, no Claude Code restart.
Behaviour
- Self-locating wrapper shim:
/tutor-statusline-installnow writes a six-line bash file at~/.claude/llm-tutor/statusline-wrapper.sh(previously a symlink). Each render, the shim runsls | sort -V | tail -1against~/.claude/plugins/cache/llm-tutor/llm-tutor/to find the latest installed version, then execs its wrapper. The shim itself never needs updating; wrapper logic lives in the cache and self-updates with every plugin upgrade. - Segment symlink self-heals on each render: the wrapper now lazily refreshes
~/.claude/llm-tutor/statusline-segment.sh(the path documented for direct shell-out users) so it always points at the current version's segment script. Onereadlink+ string compare per render;ln -sfonly fires when the target has actually drifted. SessionStarthook removed: the self-locating shim makes the hook redundant. One less moving part.
Why this matters
v0.3.0 and v0.4.0 used a symlink under ~/.claude/llm-tutor/ that was refreshed by a SessionStart hook on Claude Code session start. But /plugin update followed by /reload-plugins does not fire a SessionStart event — so a user who updated mid-session kept seeing the previous cache version's render until they fully restarted Claude Code or re-ran /tutor-statusline-install. This was the failure mode that surfaced when v0.3.0 → v0.4.0 testing showed the old design persisting after /plugin update.
The shim approach removes that staleness window entirely. The shim doesn't care which version was current at install time; it asks the filesystem on every render.
Migration
Users on v0.2.0 through v0.4.0 should run /tutor-statusline-install once to overwrite the symlink at ~/.claude/llm-tutor/statusline-wrapper.sh with the new shim. After that single migration, all future plugin upgrades self-heal automatically.
Architecture rationale
The ADR (docs/decisions/2026-06-03-statusline-integration-architecture.md) is updated with the new mechanism, an explanation of why the symlink approach left a staleness gap, and a new entry on the migration path from pre-v0.4.1 installs.
v0.4.0 — /tutor-update
A new command for staying current.
Public API
/tutor-update: new command. Compares your installed plugin-cache version against the latest GitHub release and prints the release notes when you're behind, along with the two commands needed to upgrade —/plugin update llm-tutor@llm-tutorfollowed by/reload-plugins. Reports cleanly when you're already on the latest. UsesghCLI when available (no rate limit on the authenticated account),curl+jqas fallback.
Why a check + recipe instead of a "force update"
Mirroring claude-statusline's force-download approach would require writing into ~/.claude/plugins/cache/ and editing installed_plugins.json ourselves — fighting the plugin registry rather than using it. The version-check + recipe pattern is honest about what a skill can do (it cannot invoke other slash commands) and respects the lifecycle Claude Code owns.
v0.3.0 — Statusline visual redesign
The statusline row owns its line now — persona-colored, glyph-rich, with progress bars instead of N/M fractions. No longer blends into other statusline content.
Public API
/tutor-statusline-icons: new command. Switches the segment's glyph set betweenemoji(default),nerd(Nerd Font),unicode(geometric), andascii(pure 7-bit). No arg cycles through the four modes; prints a rendered preview. Choice persists in~/.claude/llm-tutor/statusline.conf.
Behaviour
- Persona color: the row renders in the active teacher's signature color — Echo cyan, Cipher purple, Vex red-orange, no-persona neutral. The wrapper extracts
output_style.namefrom Claude Code's status JSON on each render, so/config→ Output style switches recolor the row immediately. - Tier progress: XP-toward-next-tier renders as a 5-cell bar (
Greenhorn ▰▱▱▱▱) instead of a flat tier name. - Concept progress: acquired concepts within the active topic render the same way.
2/5 → ▰▰▱▱▱. - Cycles warning: balance ≤ 1 glows yellow so you notice before the next
/tutor-startwould fail. - Install preview:
/tutor-statusline-installnow renders the actual segment in its output with a persona-aware line ("Active teacher: Echo"), so you see what you'll get before restarting. - Plugin upgrades self-heal: new
SessionStarthook re-points the stable symlinks at the current$CLAUDE_PLUGIN_ROOTon every session start. Updating the plugin no longer requires re-running/tutor-statusline-install.
Bug Fixes
- Cycles cap rendered in the terminal's default color after a stray ANSI reset; now stays dim so the eye focuses on the live balance.
- Progress bar emitted a no-op ANSI escape when zero cells were filled; now silent.
- ASCII mode's separator was
-, which visually collided with the bar's empty-cell-; now|.
Notes
- Project status moved from Pre-alpha → Alpha.
- Architectural rationale for the wrapper pattern (vs. asking users to wire the segment themselves, vs. baking the integration into claude-statusline) is captured in
docs/decisions/2026-06-03-statusline-integration-architecture.md.