HekiLight

Displays Blizzard's Rotation Assistant suggestions as a movable — the Hekili experience for Midnight 12.0+.

File Details

v0.6.1

  • R
  • Apr 23, 2026
  • 37.03 KB
  • 865
  • 12.0.5
  • Retail

File Name

HekiLight-v0.6.1.zip

Supported Versions

  • 12.0.5

HekiLight

v0.6.1 (2026-04-23)

Full Changelog

  • feat: EPIC-8 — addon icon, minimap button branding, LibDBIcon integration (v0.6.1)
    feat: EPIC-8 — addon icon, minimap button branding, LibDBIcon integration (v0.6.1)
  • docs: close story 8.1 and EPIC-8 — all AC confirmed in-game (v0.6.1)
    Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
  • feat: EPIC-8 — addon icon, minimap button branding, LibDBIcon integration (v0.6.1)
    • Add ## IconTexture to HekiLight.toc pointing at new 64x64 assets/icon.tga
    • Register with LibDBIcon-1.0 via LibStub when available; LeatrixPlus now
      groups HekiLight in the minimap button bag with correct tooltip and no warning
    • Fall back to manual Minimap-parented button when LibDBIcon is absent
    • Introduce SetMinimapShown() helper used by slash commands and settings panel
    • Replace ability_whirlwind placeholder with HekiLight branded icon on manual button
    • Add docs/epics/EPIC-8.md and docs/stories/8.1.story.md
      Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
  • chore: exclude dev-only files from release package (#11)
    Adds docs/, ADR.md, .gitattributes to .pkgmeta ignore list so they are
    not bundled into the CurseForge/Wago release zip.
    Co-authored-by: HekiLight addon@hekilight.local
    Co-authored-by: Claude Sonnet 4.6 noreply@anthropic.com
  • feat: EPIC-5 through EPIC-7 — correctness hardening, keybind robustness, active-bar filtering (#10)
    • docs: rewrite CLAUDE.md with comprehensive architecture reference
      Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
    • feat: proc alert, edit mode, session log, keybind cache, locale system; add RAW_SUGG diagnostic logging (v0.3.0)
    • Proc-alert icon: extra slot to the left showing active proc spells not in the main suggestion
    • Edit Mode: /hkl edit to drag and reposition main and proc-alert frames independently
    • Session log: DLog pipeline writing to HekiLightDB.sessionLog, readable with /hkl log [N]
    • Keybind cache: last known good keybind survives transient FindSpellActionButtons gaps at combat start
    • Locale system: Locale.lua with ptBR translation block and identity-fallback metatable
    • RAW_SUGG DLog: logs raw GetNextCastSpell output (spellID + name + iconID) for icon-mismatch diagnosis
    • SUGGEST DLog: enhanced with iconID field
      Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
    • fix: resolve talent override icons (Defile etc.) and eliminate SKIPPED log spam
    • GetActiveSuggestion now calls GetActionInfo(realSlotID) after resolving the spell; if the
      slot returns a different spellID (talent override), that is used for icon/name display.
      Fixes Blood DK seeing Death and Decay icon when Defile is suggested.
    • SLOT SKIPPED DLog now fires once per alert-spell activation instead of every poll tick;
      lastSkippedAlertID reset on ALERT_HIDE and SUPPRESS so each new proc logs correctly.
      Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
    • perf: stop poll loop on combat-end; gate UNIT_HEALTH refresh on visibility change
    • PLAYER_REGEN_ENABLED now calls StopPollLoop() before Refresh(), eliminating
      continuous 50ms OnUpdate ticks during all out-of-combat gameplay.
    • recentlyCastSpells wiped on combat-end to prevent stale CD tracking entries
      accumulating across fights.
    • UNIT_FLAGS/UNIT_HEALTH no longer call Refresh() unconditionally; they only
      re-render when ShouldShow() result would change display visibility. Prevents
      Refresh() being called on every damage/heal tick during combat.
      Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
    • docs: add ADR.md extracted from git history (12 decisions)
      Architecture Decision Records covering: single-file discipline, polling vs events,
      two-layer spell detection, realSlotID taint pattern, secret-number pcall trick,
      defensive floater revert, visibility logic reversals, poll loop lifetime,
      talent override resolution, pre-allocated queue, per-character SavedVariables,
      and session log ring buffer.
      Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
    • docs: add PRD, epics, and stories (retroactive EPIC-1 through EPIC-4)
      Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
    • docs: CLAUDE.md improvements from /init; add EPIC-5 epic and story files
    • CLAUDE.md: add OVERRIDE DLog tag, docs/ reference, known open bugs table,
      C_CooldownViewer hard ban reminder
    • docs/epics/EPIC-5.md: Correctness Hardening epic (3 bugs from EPIC-4 close)
    • docs/stories/5.1-5.3: story files validated by @po, status Ready
      Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
    • feat: EPIC-5 correctness hardening — override-aware dedup, secondary icons, range pcall (v0.4.0)
      Story 5.1 — Override-aware secondary slot deduplication:
      resolveSecondary() mirrors GetActiveSuggestion override resolution for
      secondary spells; effectiveID ~= primaryID dedup now compares cast IDs
      not base IDs, fixing duplicate primary spell in secondary strip for
      talent overrides (e.g. Blood DK with Defile)
      Story 5.2 — IsActionInRange pcall guard:
      pcall wraps C_ActionBar.IsActionInRange in Refresh; taint or unexpected
      slot type safely yields inRange=nil instead of crashing; DLog fires once
      per unique failing slot via lastRangeFailSlot change-detect guard
      Story 5.3 — GetRealSlot for secondary spells:
      queueCache extended with overrideSpellID field; secondary slot icons now
      use GetActionInfo(realSlotID) override resolution matching primary pipeline;
      keybind lookup upgraded to GetSlotKeybind(realSlotID) with effectiveID fallback
      Also: restore combat-end StopPollLoop + wipe(recentlyCastSpells) and
      UNIT_FLAGS/UNIT_HEALTH visibility-change gate (both regressed in prior
      uncommitted state); parent minimap button to Minimap frame
      Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
    • docs: close EPIC-5 stories and mark epic Done
      All three stories (5.1, 5.2, 5.3) implemented in commit 24308cf.
      Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
    • fix: gate secondary OVERRIDE DLog with change-detect guard
      DLog("OVERRIDE") inside GetSuggestionQueue had no change-detection
      guard, causing it to fire at 20 Hz for any persistent talent-override
      spell in the secondary strip, exhausting the 500-entry ring buffer in
      ~25 seconds of combat.
      Added lastOverrideLogID[baseSpellID] = effectiveID guard (fires once
      per unique base→override mapping); wipe() on ShouldShow suppression
      to re-enable logging when talent builds change.
      Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
    • fix: gate RAW_SUGG DLog with change-detect guard to stop buffer flooding
      RAW_SUGG was firing every poll tick (20 Hz) with no guard, consuming ~90%
      of the 500-entry session log buffer in under 90 seconds of combat. Added
      lastRawSuggID to suppress duplicate entries; reset on ShouldShow suppression
      and PLAYER_REGEN_ENABLED, matching the pattern of all other DLog guards.
      Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
    • fix: EPIC-6 story 6.1 — shapeshift-resilient keybind cache repopulation
      Root cause: keybindCache was never populated by the realSlotID path in
      Refresh, so wipe(keybindCache) on ACTIONBAR_SLOT_CHANGED left nothing for
      the GetSpellKeybind fallback during the transient FindSpellActionButtons
      nil window after shapeshifting.
      Fix chain:
    • Populate keybindCache[spellID] whenever realSlotID resolves a key in
      the Refresh render loop (keeps cache warm continuously)
    • Remove wipe(keybindCache) from ACTIONBAR_SLOT_CHANGED so cached values
      survive the transient window; only wipe at PLAYER_REGEN_DISABLED
    • Schedule C_Timer.NewTimer(0.3) deferred Refresh after ACTIONBAR_SLOT_CHANGED
      to repopulate after the transient window closes; cancel on combat start
    • Add lastKeybindLog change-detect guard on all KEYBIND DLog paths to
      prevent 20 Hz buffer flooding
    • Rewrite Refresh keybind block as explicit if/else to fix Lua truthiness
      bug (empty string "" is truthy, silently bypassing or-fallback)
    • Add DLog("KEYBIND") with source=realslot/cache/miss/slot tags
    • Remove diagnostic TRACE DLog
      Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
    • docs: add EPIC-6 and story 6.1 — keybind robustness; update CLAUDE.md KEYBIND tag
      Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
    • chore: bump interface to 120005 and version to 0.2.2 for patch 12.0.5
      Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
    • fix: EPIC-7 story 7.1 — IsUsableAction guard for form-restricted secondary slots
      GetSuggestionQueue pass-1 and pass-2 now include and rslot and IsUsableAction(rslot)
      so Cat Form spells (slots 73–84) are filtered from secondary suggestions when the
      player is not in Cat Form. Confirmed in-game by @qa — all 6 AC passed.
      Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
    • feat: EPIC-7 story 7.2 — Cat Form out-of-combat GetRotationSpells fallback
      When GetNextCastSpell returns nil out of combat with an attackable target,
      GetActiveSuggestion now iterates GetRotationSpells() for the first spell
      where GetRealSlot returns non-nil and IsUsableAction passes. Forward
      declaration added for GetRealSlot to resolve Lua 5.1 closure ordering.
      PLAYER_TARGET_CHANGED was already registered; no event change needed.
      Confirmed in-game by user — suggestions appear in Cat Form on target
      acquisition without entering combat.
      Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
    • docs: add EPIC-7 and stories 7.1–7.2; update CLAUDE.md
      EPIC-7 (Secondary Slot Active-Bar Filtering) — Done. Stories 7.1 and 7.2
      fully documented with AC, change logs, and QA gate results. CLAUDE.md
      updated: interface version 120005, line count, resolveSecondary and
      IsUsableAction documentation, EPIC status 1–7 all Done.
      Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
    • chore: add .gitattributes to collapse docs in GitHub PR diffs
      Story files, epic files, PRD, and ADR marked linguist-generated=true so
      GitHub collapses them by default in PR review. Reviewers can expand
      individually if needed.
      Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
    • chore: bump version to 0.6.0
      Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com

    Co-authored-by: HekiLight addon@hekilight.local
    Co-authored-by: Claude Sonnet 4.6 noreply@anthropic.com