Skip to content

Releases: Flagrare/llm-tutor

v0.5.1 — display_name in /tutor-status and /tutor-resume

Choose a tag to compare

@Flagrare Flagrare released this 03 Jun 14:57

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-status shows human topic names. The dashboard's Active and Completed sections now render the subject you typed at /tutor-start instead of the slug-key. So if you started with /tutor-start "Python decorators", the dashboard reads Python decorators, not python-decorators.
  • /tutor-resume does 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

Choose a tag to compare

@Flagrare Flagrare released this 03 Jun 14:42

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 $COLUMNStput 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_LEN knob in ~/.claude/llm-tutor/statusline.conf. Set to 0 to disable truncation entirely, or any positive integer for a custom cap. Documented in docs/guides/statusline.md.

Before: 📖 what-closures-are-in… 0/5
After: 📖 What closures are in Python ▰▱▱▱▱

v0.4.1 — Self-locating wrapper shim

Choose a tag to compare

@Flagrare Flagrare released this 03 Jun 14:16

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-install now writes a six-line bash file at ~/.claude/llm-tutor/statusline-wrapper.sh (previously a symlink). Each render, the shim runs ls | sort -V | tail -1 against ~/.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. One readlink + string compare per render; ln -sf only fires when the target has actually drifted.
  • SessionStart hook 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

Choose a tag to compare

@Flagrare Flagrare released this 03 Jun 13:45

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-tutor followed by /reload-plugins. Reports cleanly when you're already on the latest. Uses gh CLI when available (no rate limit on the authenticated account), curl + jq as 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

Choose a tag to compare

@Flagrare Flagrare released this 03 Jun 13:36

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 between emoji (default), nerd (Nerd Font), unicode (geometric), and ascii (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.name from 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-start would fail.
  • Install preview: /tutor-statusline-install now 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 SessionStart hook re-points the stable symlinks at the current $CLAUDE_PLUGIN_ROOT on 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