File Details
v1.1.0
- R
- Mar 27, 2026
- 369.25 KB
- 53
- 12.0.1
- Retail
File Name
GRIP-EMS-v1.1.0.zip
Supported Versions
- 12.0.1
Changelog
All notable changes to GRIP - Enhanced Macro Sequencer will be documented in this file.
This changelog follows a variant of Keep a Changelog.
[v1.1.0] - 2026-03-27
Added
- Stale Spell Detector: validates /cast and /castsequence spells against your spellbook on import, editor open, and via /gems validate. Warning banner in editor header, icon overlay on sequence list entries, step-level status coloring (green/yellow/red), import preview warning count, and batch validation output in chat
- Rotation Preview Panel: visual preview of your spell rotation below the step list. Dual-mode display (icon strip and text list) with toggle button. Spell icons resolve from spellbook, tooltips show full macrotext on hover, unknown spells show question-mark icon with red tint, variable steps show gray status, horizontal scroll for long sequences. Preview mode persists across sessions
- Export: transitive variable dependencies auto-selected. If variable A references variable B, selecting a sequence that uses A auto-includes both A and B with "auto" badges in the export picker
- Export: variable descriptions included in export payload with comments-field fallback for round-trip preservation on import
- /gems validate slash command for batch spell validation across all sequences
Changed
- Sort button labels and tooltips now use locale keys (L["GEMS_UI_SORT_*"]) instead of hardcoded English strings
- ExportFrame: AceGUI close button hidden, replaced with custom styled Close button matching addon dark theme. ESC handler added. Button layout fixed to prevent overlap
Removed
- Click rate setting removed from Settings panel, Defaults.lua, and locale strings. The Engine has ignored this setting since v1.0.4 (BUG-035 fix). No functional change
Internal
- New file: Data/SpellValidator.lua (spell validation module)
- 34 existing files modified across UI, Engine, Import, Data, Core, and Locale modules
[v1.0.9] - 2026-03-26
Fixed
- Blizzard Settings dark theme: replaced unreliable C_Timer.After(0.5) with HookScript("OnShow") plus zero-delay C_Timer.After(0) deferral for reliable restyle timing. _gripRestyled guard prevents redundant restyle on re-opens
- UI layout overflow at minimum window size: minimum frame bounds raised from 600x400 to 750x500, EDITOR_HEADER_HEIGHT updated for expanded reset row, button bar widths reduced to prevent sort/migrate overlap, MacrosTab list container switched from hardcoded 600px height to dual-point anchor
- KeyPress/KeyRelease fields not resizing with window: replaced init-time fixed-width calculation with dual-point anchoring and OnSizeChanged handlers that propagate width to ScrollFrame children
- Five layout constants in Defaults.lua had incorrect values causing RawTab and VariablesTab clipping at non-default window sizes (VAR_LIST_WIDTH, VAR_FUNC_EDIT_HEIGHT, RAW_STATUS_HEIGHT corrected; RAW_HEADER_HEIGHT and VAR_EDITOR_ROW_HEIGHT confirmed correct)
Added
- Combined reset syntax: multi-condition resets (e.g. target/combat/5) via new ParseResetString and BuildResetString utilities with RESET_TOKEN_MAP lookup
- Expanded reset UI: Gear Change and Spec Change checkboxes plus Timer EditBox in the sequence editor header, wired to per-version resetOnGear, resetOnSpec, and resetTimer fields
- Import mapping: legacy Head field now maps to resetOnGear for gear-swap reset preservation during migration
- Sort mode persistence: sequence list sort order (A-Z / Class / Recent) saved to AceDB profile and restored on login
- SwitchVersion and LoadVersionIntoEditor: implementations added for multi-version navigation (previously orphan call sites)
- TrackerHUD debug filter: early-return guard in OnSettingChanged prevents unnecessary rebuilds for non-tracker settings
- 6 new locale keys for reset controls (timer label, gear change, spec change, timer placeholder, reset section header, combined reset tooltip)
- BUG-020 test harness: /gems testspellid command with 7 test cases validating spell ID resolution for capital /Cast, /use alias, and multi-condition blocks
Changed
- TrackerHUD Toggle() now cycles through all 4 visibility modes (Never to Always to In Combat to Has Target) instead of binary Always/Never flip
- 9 nil-safety guards added across ExportFrame (3), ImportFrame (3), and StepListView (2) per LUALS-EMS-3 static analysis
Internal
- Dead locale keys GEMS_TRACKER_ENABLED and GEMS_TRACKER_DISABLED removed (MAINT-17)
[v1.0.8] - 2026-03-26
Fixed
- Macrotext 255-char limit: spells not firing in combat because keyPress/keyRelease prepended to each step exceeded 255-char SecureActionButton cap. Hybrid per-step fitting now includes keyPress when combined length fits, omits when it overflows (keybind path vs action-bar-click fallback) (BUG-045)
- Truncation side-effect: "Unknown macro option: mo" caused by mid-token truncation at 255-char boundary (BUG-043, same root cause as BUG-045)
- TrackerHUD infinite recursion: Rebuild/UpdateVisibility mutual call loop causing stack overflow. Separated concerns (UpdateVisibility now only Show/Hide) (BUG-044)
Added
- TrackerHUD Phase 1: movable icon overlay for active sequences with 4-mode show dropdown (Always/In Combat/Has Target/Never), active-sequence highlight, scale slider, and per-character position persistence
- WhatsNew popup: version-gated login popup showing release highlights with dark theme, scrollable content, ESC-closeable, and "Don't show again" checkbox
- KeyPress/KeyRelease editor fields: dedicated edit boxes in the Steps tab with per-step fit status label and effective character count display
- Per-step character counter: shows effective macrotext cost including fitted keyPress/keyRelease length per step
Changed
- Double RefreshDataProvider removed from SequenceList (was causing redundant redraws)
- Per-keybind rebuild debounce: _initialLoadComplete guard prevents bar-swap events during login from triggering SuspendKeybinds prematurely
Internal
- lane_sync.json: cross-lane state tracking for Cowork/Code coordination
- 6 new locale keys for BuildStubBody warnings and KeyPress fit status
- 2 updated tooltip descriptions for KeyPress/KeyRelease editor fields
- Diagnostic instrumentation removed (ClickDebugPre/Post, DiagDump, combat-start dump)
[v1.0.7] - 2026-03-25
Fixed
- Event bus: CallbackHandler registry return was discarded since v1.0.0, leaving all Fire() calls dead. Captured registry and wired Fire method on addon object. 12 event types and 7 consumer modules now receive callbacks (BUG-040)
- Variable changes now trigger recompilation of referencing sequences (BUG-041, fixed by BUG-040)
- Import now refreshes SequenceList display (BUG-042, fixed by BUG-040)
- /gems delete now correctly removes the named sequence (BUG-039)
Added
- Channel protection: new sequences default to /stopmacro [channeling] in KeyPress template. HandleCreate copies KeyPress/KeyRelease to new versions (BUG-028)
- KeybindManager fires KEYBIND_CHANGED after successful LoadKeybinds, ensuring UI consumers rebuild on login
Internal
- TrackerHUD module (UI/TrackerHUD.lua): movable icon overlay for active sequences with step-advance animation, modifier display, and per-character position persistence. Disabled by default (trackerEnabled = false). Internal preview, not user-facing.
[v1.0.6] - 2026-03-25
Fixed
- Keybind race condition: SetOverrideBindingClick now defers to pendingBinds when the engine button has not yet been created via OOCQueue, then applies in BindIfConfigured once the button exists (BUG-029)
- Double step advance: changed RegisterForClicks from ("AnyUp", "AnyDown") to ("AnyDown") so WrapScript fires once per keypress instead of twice (BUG-036)
- Raw tab edits reverted on Save: after ApplyChanges, force-syncs SequenceEditor working copy from newSeqData directly and clears dirty state (BUG-038)
Added
- Settings panel dark theme: AceConfigDialog standalone window (/gems settings) now uses GRIP dark theme -- dark backdrop, styled tabs, green title text, hidden ornamental chrome, styled Close button (BUG-021)
Changed
- Import: pet actions compile to /cast PetActionName, toy actions compile to /use ToyName (previously unsupported action types)
- Import: if-block field resolution checks action.Spell before falling back to action.Actions
[v1.0.5] - 2026-03-25
Added
- Import preview shows source sequencer version when available in export metadata (MAINT-15)
- Import stores source format version and checksum as informational metadata on imported sequences (MAINT-15)
Fixed
- Variable actions from legacy imports now resolve to substitution tokens instead of compiling as literal step text (BUG-024)
Changed
- LibDBIcon-1.0 updated from v55 to v56 (MAINT-7)
Docs
- README: fixed context types description to match the 15 actual CONTEXT_KEYS
- README: removed false claim that keybinds transfer on import
- README: replaced slash commands table (was 15 commands with errors, now 22 verified against Core.lua)
- README: added Priority preview and source version display feature descriptions
- Guide: replaced slash commands table (was 7 commands with errors including dangerously wrong /gems reset description, now 22 correct)
- Guide: removed false Keybinds row from "What Transfers?" import table
- Guide: expanded Import Preview section with two-stage UI details, badges, and conflict options
- Guide: added Reverse Priority Step Function to shipped features roadmap
- Guide: fixed keybind auto-suspend description (was "boss encounters, PvP arenas", now "vehicles, skyriding, and pet battles")
[v1.0.4] - 2026-03-21
Fixed
- Click rate throttle freezing step counter during combat: removed insecure PostClick _shouldAdvance gate that could not SetAttribute during combat lockdown, causing Priority mode to stick on one step (BUG-035)
[v1.0.3] - 2026-03-21
Added
- Locale Phase 1: tag translation at export/import boundaries for cross-locale sequence sharing (GRIP1 format v3)
- FindSpellOverrideByID scan integration: SpellCache now resolves override spell IDs at scan time for correct name/ID consistency
- SafeOverrideID bounds guard: pet spellbook actionIDs exceeding INT32_MAX no longer crash FindSpellOverrideByID (BUG-032)
- /gems testlocale output routed to DebugWindow for easier copy-paste bug reporting
Fixed
- Import preview showing 0 sequences when export uses Versions key instead of Macros (BUG-031, reported by GauPanda)
- Semicolon spacing lost in TranslateMacrotext when inner-conditional refs had leading whitespace (BUG-033)
- Missing locale key GEMS_STEPFUNC_REVERSEPRIORITY_DESC causing nil tooltip text (BUG-034)
- GetBaseSpellID removed from locale translation path -- was walking full replacement chain and over-normalizing spec spell replacements (BUG-030)
[v1.0.2] - 2026-03-21
Added
- Reverse Priority step function: inverts priority order so lower-numbered steps are weighted less (BUG-026b)
- Priority preview in editor: shows numbered expanded step list with char counter for both Priority and Reverse Priority modes
- Keybind debounce: spec-change events coalesced via ScheduleLoadKeybinds to prevent double-fire (BUG-027)
- Diagnostic logging for keybind lifecycle: BindIfConfigured miss, LoadKeybinds spec=0 defer, binding counts per spec
Fixed
- Combat lockup: button went dead after first cast in combat due to useOnKeyDown + 4-arg WrapScript postBody (BUG-026a, reported by Pershizzle)
- Priority mode broken: multi-line /cast does not fall through on cooldown in WoW; replaced with pre-expansion where N steps become N*(N+1)/2 flat sequential entries (BUG-026b)
- Variable substitution skipped on first Priority/ReversePriority activation (BUG-025)
- Keybind lost after /reload: redundant 0.5s timer ClearOverrideBindings wiped bindings that BindIfConfigured already applied; replaced with synchronous LoadKeybinds after RestoreSavedSequences (BUG-027)
- Keybind silently dropped during combat: BindIfConfigured now queues to OOCQueue instead of returning (BUG-027)
- Bar-swap events during login could trigger SuspendKeybinds before initial load completed (BUG-027)
Changed
- WrapScript: switched from 4-arg (preBody + postBody) to 3-arg (body only) for all step functions (BUG-026a)
- Priority and Reverse Priority use Sequential round-robin cycling over pre-expanded step arrays instead of multi-line macrotext (BUG-026b)
[v1.0.1] - 2026-03-21
Added
- Interactive HTML guide: rebuilt from scratch (2400+ lines) with 13 sections: welcome, getting started, core concepts, interactive UI tour with clickable mock-up and annotation hotspots, 5 step-by-step tutorials, editor reference, import and migration, slash commands and settings, advanced topics, sequence builder tool, roadmap, FAQ, and community links
- FAQ section in guide covering 10 common questions
- Interactive UI mock-up in guide: full clickable replica of the GRIP-EMS editor with 6 working tabs, annotation hotspots, and tooltip explanations for every element
- Sequence Builder tool in guide: browser-based sequence creation with GRIP1 export for in-game import
- Quick Start section in README for new users
Changed
- README: full SEO-focused rewrite with competitor positioning, categorized features, Quick Start section, and migration framed as generic sequencer import (not addon-specific)
- TOC Notes: replaced addon-specific reference with "context switching" in subtitle
- 7 locale strings: user-facing import/migration text generalized to "export strings" and "another sequencer" instead of naming specific addons
- ImportFrame header comment: generalized
- In-game branding: GRIP green title/notes in addon list, Combat category, rich minimap/compartment tooltips with active sequence count and context display, colored settings panel name
Fixed
- Imported "Priority List" step function mapped to concatenated Priority mode instead of Sequential cycling, causing rotation spells to not fire (BUG-013)
- Sequence list empty after import due to scrollView vs scrollBox SetDataProvider mismatch (BUG-007)
- Sequences not firing: SecureActionButton type="spell" silently blocked in restricted env, changed to type="macro" (BUG-008)
- OOCQueue spam from icon updates during combat, added InCombatLockdown() guard (BUG-010)
- Spell IDs not resolved in /cast and /castsequence lines (BUG-011)
- Priority mode KeyPress/KeyRelease duplication killing rotation spells, now wraps KP/KR once for Priority (BUG-012)
- AceComm-3.0 missing library files for local development (BUG-003)
- Duplicate macro stubs on login from sanitized-name key mismatch (BUG-004)
- Clean Orphans failing due to stale cached macro indices (BUG-005)
- Editor header button overflow when Export+Send buttons present (BUG-006)
- Version display showing raw @project-version@ token locally (dev fallback added)
- Private repository URL removed from about links
- ESC during key capture no longer closes the GRIP-EMS window (BUG-014)
- Settings panel Profiles tab now visible via tabbed layout (BUG-015)
- /gems migrate slash command now triggers migration (BUG-016)
- Migration imports all sequences: .Versions field mismatch + array unwrap + fallback decode (BUG-017)
- Macro slot limit corrected to 30 per-character using WoW global (BUG-018)
- Settings Info shows correct macro slot count (BUG-019)
- Lua 5.1 goto syntax error in import parser replaced with if/end guard (BUG-020a)
- D:Debug() nil method crash in CompileMacroVersion replaced with GRIPEMS:Debug() (BUG-022)
- ValidateSteps no longer blocks activation at 255 chars, downgraded to warning (BUG-023)
- Char counter threshold raised to 1023 (SAB macrotext limit), editBox max raised to match (BUG-009)
- Per-segment spell ID resolution in /cast and /use semicolon fallbacks (BUG-025)
[v0.9.1-beta] - 2026-03-21
Added
- Multi-version sequences: N versions per sequence with version bar UI (add, duplicate, delete, set default) and MenuUtil dropdown selector
- Context version selection: 15 context keys (Raid Normal/Heroic/Mythic, Dungeon Normal/Heroic/Mythic+, PvP Arena/Battleground/Rated BG, Scenario, Timewalking, Delves, Solo, Default) with automatic detection via GetInstanceInfo() and difficultyID
- Context auto-switching: table-driven fallback chains (CONTEXT_FALLBACKS in Defaults.lua), Engine:GetActiveVersion() context resolution, ReloadContextSequences on zone/group changes
- Context Tab: dedicated tab with collapsible groups (Raids/Dungeons/PvP/Other), per-version checkboxes, StaticPopup conflict warning dialog
- Context migration: legacy context fields (Raid, Arena, PVP, Mythic, MythicPlus, Heroic, Dungeon, Timewalking, Party, Scenario) preserved during import and in-game migration
/gems guideupgrade: clickable chat hyperlink + copyable URL popup with online guide link (https://jesperlive.github.io/grip-ems-guide/)
Changed
- SequenceEditor: removed inline contextBar grid, simplified anchor chain (versionBar -> tabBar) after Context Tab extraction
- Import: all N versions now imported (previously only default version)
Fixed
- Context reload: same-ref comparison bug causing missed reloads
- SequenceEditor: 22px layout gap after contextBar removal
- Context detection: missing Solo and Default fallback entries
[v0.9.0-beta] - 2026-03-20
Added
- Core macro sequencer engine (SecureActionButton + WrapScript click body)
- 3 step functions: Sequential, Priority, Random
- SetOverrideBindingClick keybind system (per-spec, OOC-queued)
- MacroManager for action-bar drag stubs with dynamic icon updates
- Reset conditions: timer (idle timeout), combat, target change, gear swap, spec change
- Click rate throttle (100-1000ms slider, restricted env enforcement)
- Legacy format import (COLLECTION + simple array, double-decode, KeyPress/KeyRelease)
- GRIP1 native export format (CBOR + Deflate + Base64)
- In-game migration from other sequencers (detect installed addons, bulk import)
- Variable migration (legacy variables mapped to GRIP-EMS VariableStore schema)
- Structured migration report with limitation counts and per-sequence guidance
- ExportFrame with auto-highlight and Ctrl+C auto-close
- ImportFrame (AceGUI paste window, bypasses 255-char chat limit)
- Full UI: MainFrame, SequenceList (native ScrollBox + DataProvider), SequenceEditor
- 5-tab editor: Steps, Keybind, Macros, Variables, Raw
- Editable step list with working-copy dirty-state pattern
- Keybind tab with key capture (SetPropagateKeyboardInput, per-spec overview)
- Macros tab with stub management and orphan cleanup
- Variables tab (account-wide, pcall+loadstring validation, event-driven re-eval)
- Raw macrotext editor with pcall+loadstring Lua validation
- <sub>varname</sub> substitution in macrotext with Tab-press autocomplete
- Spell cache (C_SpellBook scan, debounced) with Tab-press autocomplete
- Icon picker with autoIcon auto-detect from step 1 macrotext
- Dynamic macro stub icons via CallMethod in WrapScript
- Settings panel (AceConfig + AceDBOptions profiles)
- Blizzard Settings integration (ESC > Options > AddOns)
- About/version info panel with dynamic status block
- Debug window (ScrollingMessageFrame, 500-msg ring buffer, copy to clipboard)
- Vehicle/skyriding/pet-battle keybind suspension (6 events, OOC-guarded)
- Minimap button (LibDBIcon) + addon compartment registration
- Luacheck CI (GitHub Actions)
- BigWigsMods packager CI/CD (GitHub Actions)
- WagoAnalytics tracking shim
- Interactive HTML guide with 9 sections, tooltips, keyboard legends, and full sequence builder with export (Guide/GRIP-EMS_Guide.html)
/gems guideslash command to locate the guide file
Known Limitations
Multi-version sequences: only default version imported(fixed in v0.9.1-beta)Context versions (Raid/PVP/Dungeon auto-switch): not yet implemented(added in v0.9.1-beta)- Embedded sequence resolution: logged as warning, not expanded
- Pause blocks: skipped with warning (WoW API limitation for click-based execution)
- Import collision UI: skip-if-exists only (no per-sequence pick list yet)
- KeyPress/KeyRelease: imported and functional, not exposed as separate editor fields

