promotional bannermobile promotional banner

GRIP - Enhanced Macro Sequencer

A powerful macro sequencer for creating, managing, and executing multi-step spell rotations. Free. No paywalls.

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 guide upgrade: 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 guide slash 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