File Details
v1.7.3
- R
- Apr 6, 2026
- 714.35 KB
- 13
- 12.0.5+1
- Retail
File Name
GRIP-EMS-v1.7.3.zip
Supported Versions
- 12.0.5
- 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.7.3] - 2026-04-06
Added
Machine Translation (P9-A)
- 10 locale files machine-translated from enUS (deDE, esES, esMX, frFR, itIT, koKR, ptBR, ruRU, zhCN, zhTW) -- 795 strings each, all marked -- MT for community reviewer tracking
- Blizzard-official game terminology sourced from GlobalStrings database
- Pre-commit hooks updated with UTF-8 encoding for CJK/Cyrillic support
Per-Sequence Reset Modifier Overrides
- Sequences can now override global reset modifier settings with per-sequence toggles in the editor header
- Engine reads per-sequence overrides at activation and live-update time, falling back to global settings for unset modifiers
Variable Locale Safety (Phase 2f)
- Variables with spell-name values are now tagged with spell IDs and source locale on evaluation
- HealLocaleVariables restores variable values when switching game language, mirroring step-level locale healing
- Export picker shows locale risk warning when selected variables contain locale-dependent spell names
ConsolePort Integration
- Keybind tab detects ConsolePort bindings and warns on conflicts
- ConsolePort added to luacheck/selene globals
Restriction State Awareness
- OOCQueue now tracks ADDON_RESTRICTION_STATE_CHANGED events into GRIPEMS.restrictions table with debug logging
- TrackerHUD shows amber restriction label (M+, Encounter, PvP) when addon restrictions are active
Import Resilience
- Serialization.Decode logs format detection failures to DebugWindow
- Import statistics tracked in SavedVariables (importStats per format)
- GRIP1 imports log source locale for cross-locale awareness
Testing
- testlocale expanded with item, toy, apostrophe, colon, empty conditional, and multi-branch edge case tests
- Test/TestSuite.lua added (automated test framework)
Changed
- Pre-commit hooks use explicit UTF-8 encoding for all file operations
- StepListView action-tree move operations corrected for node swap
[v1.7.2] - 2026-04-06
Fixed
Tree-Mode Editor (BUG-060)
- Action bar buttons (Del, Dup, Up, Down) now correctly operate on the action tree in hierarchical sequences instead of silently targeting the flat step array
- Node badge rows (If/Loop/Embed) can now be manipulated via action bar buttons, not just right-click context menus
- Button enable/disable states are now tree-mode-aware, reflecting the selected node's position in the action tree
- Outline selection is now mutually exclusive: clicking a step row clears node badge highlight and vice versa
Slash Command (BUG-061)
- /gems now opens the main UI on first use without requiring a prior minimap or compartment button click
[v1.7.1] - 2026-04-06
Added
P2P Block List
- Block and unblock players from sending you sequences via peer-to-peer transmission (/gems block, /gems unblock, /gems blocklist)
- Blocked players are silently dropped on receive -- no error messages sent back to the sender
- Settings panel section for managing blocked players with add/remove inputs and live display
- Account-wide storage in SavedVariables (persists across characters)
Keybind Migration
- /gems migrate now transfers per-spec override keybinds from your previous sequencer alongside sequences
- Conflict detection: existing keybinds are preserved unless overwrite mode is active
- Action bar override warning: counts source action-bar bindings that cannot be migrated (EMS uses keybind overrides instead) with guidance to rebind via /gems bind
- Migration report includes keybind summary line (migrated/skipped/conflicts)
Export Enhancements
- "Copy as Text" button in the export picker: generates a human-readable plain-text summary of selected sequences (step function, reset conditions, keybinds, steps, KeyPress/KeyRelease, variable dependencies)
- Side-by-side comparison now shows a metadata strip above the diff panels (step function, reset conditions, icon, context versions) with change highlighting for quick difference spotting
Changed
- Interface version updated to 120005 (WoW 12.0.5)
- ComparisonFrame:Show() accepts optional metadata tables for left/right panels
- SequenceList compare context menu passes metadata through to ComparisonFrame
[v1.7.0-Beta] - 2026-04-03
Added
Steps Tab Redesign (S30-FEAT-01)
- Outline + Detail Pane pattern: left column shows flat steps and structural node badges, right column opens on node click with breadcrumb drill-down navigation
- 5 structural node types: Action (spell step), Loop (cycle, blue), Pause (bars, yellow), If (conditional, purple), Embed (reference, green) with colored badge icons
- Breadcrumb navigation with truncation at depth 5+ (first segment, ellipsis, last 2 segments)
- Context-sensitive detail pane with child node list and toolbar
-
- Add context menu shared between outline action bar and detail pane toolbar, supporting flat steps and all 4 structural node types
- Flat-to-actions migration: one-click conversion of flat step sequences to the action tree model with full undo support
- Drag-to-reorder for both outline rows and detail pane children with ghost frame and insertion indicator
- Auto-focus name EditBox on structural node creation
Editor Enhancements
- Syntax highlighting for macro commands in step edit boxes (UI/SyntaxHighlight.lua)
- Spell autocomplete via Tab key with spellbook search dropdown (UI/SpellPicker.lua)
- Undo/redo system (Ctrl+Z / Ctrl+Y) for step editing, drag operations, and structural changes (UI/UndoStack.lua)
- Popup editor for quick sequence editing from the sequence list (UI/PopupEditor.lua)
- Side-by-side sequence version comparison viewer (UI/ComparisonFrame.lua)
- Action tree compiler for node-to-macrotext compilation (Engine/ActionCompiler.lua)
- Compiled preview Copy button strips WoW color codes for clean clipboard text
- 6 configurable editor colours in Settings > Editor Colours for macro commands, conditionals, variables, comments, reset, numbers
- Multi-window popup editor system (frame pool max 4, independent dirty state, cascade offset, sequence sync via SEQUENCE_UPDATED)
- Tab-autocomplete: sequence name fallback in step editor in addition to existing variable autocomplete
- Dependency visualization in metadata panel (variable/sequence refs, found/missing status, reverse "Embedded by" lookup)
- Per-editor undo stacks in PopupEditor (Ctrl+Z/Y undo/redo, Alt+Up/Down move steps, Up/Down step nav)
- Ghost snap-back animation on drag cancel (lerp interpolation with alpha fade in StepListView)
- Inline clipboard (hidden EditBox Ctrl+C flow, falls back to ExportFrame on failure)
- Rich spell/item tooltips on step list rows (SetSpellByID, SetItemByID, keybind hint line)
- Empty state illustration for sequence list (icon + label + hint when no sequences exist)
- Macro stub body viewer (collapsible section showing BuildStubBody output)
- Metadata description multi-line EditBox
- Context Tab import origin indicator (imported vs user-created versions visually distinguished)
- Scroll-during-drag in step list (auto-scroll near ScrollBox edges)
- Mouse wheel scroll in KeyPress/KeyRelease EditBox fields
Engine Modules
- Action bar icon override for Blizzard, ElvUI, and Bartender4 bars with per-step icon updates (Engine/BarIntegration.lua)
- Vehicle, skyriding, and pet battle keybind auto-suspension extracted to dedicated modules (Engine/VehicleKeybinds.lua, Engine/PetBattleButtons.lua)
- Execution tracing diagnostics (Engine/ExecutionTracer.lua)
- Macro recorder module (Engine/MacroRecorder.lua)
- Plugin registration API for third-party addon integration (Core/PluginAPI.lua)
- Gear change variables with bag and equipment tracking (Data/GearVariables.lua)
- MS click rate slider (global + per-character, Settings > General)
- Configurable macro reset modifiers (15 individual modifier toggles)
- CVar management panel (auto-fix + status display in Settings)
- OOC queue priority + deduplication (replaces simple FIFO)
- AddOnRestrictionType-aware OOC queue (checks beyond InCombatLockdown for addon-restricted states)
- Configurable OOC timer delay (Settings > oocDelay, 1-60s, default 7)
- Variable event dropdown (75 curated events, categorized submenu)
- Function-type variable evaluation cache (compiled function caching in VariableStore for performance)
- Hierarchical actions: If/Loop/Embed nesting (ActionCompiler flattens to linear steps, per-type UI renderers in UI/ActionRenderers.lua)
- Spell picker dropdown with condition builder for step editing (UI/SpellPicker.lua, integrated into step editor)
Context Switching
- 28 per-map context keys for arenas (15) and battlegrounds (13) via instanceMapID detection with rated-type priority
- Battleground Blitz detection via C_PvP.IsSoloRBG() with fallback chain (BattlegroundBlitz > RatedBG > PVP)
- 53 total context keys (up from ~20 in v1.1.6)
- /gems mapinfo diagnostic command for live context detection
- 9 new context keys (25 total): M+ tier detection (Low/Mid/High), PvP rated split (RatedArena/SoloShuffle/RatedBG), Delve tier detection (Low/High), Timewalking raid split
- Select All/Clear All buttons per context group header
- Visual fallback chain indicator (color-coded resolution path)
- Configurable M+/Delve threshold sliders in Settings > Context
Import/Export
- Raw text import path for plain macro paste (Import/RawImport.lua)
- Tab-autocomplete for <sub>variable</sub> and sequence name insertion in step editor
- /gems import now handles collection strings (multi-sequence + variables) via Preview path instead of failing (BUG-055)
- CopyVersion() utility for safe per-version deep copy, replacing whitelist pattern that missed keyPress/keyRelease fields
- Pause conversion (3-mode: Clicks/GCD/MS compiled to empty steps)
- Action interval interleaving on import
- Import conflict Compare option with visual diff
- SequenceList "Compare with..." context submenu
- Variable dependency auto-check on import (ResolveImportVariableDeps)
- Export metadata editor stage (collection name, author, description, URL, talent string embedding with per-field toggles)
- Icon suggestion utility (SuggestSequenceIcon auto-detects from spell content)
- Freeform macro import warning (auto-detect raw /cast patterns, count display in import preview)
Quality of Life
- Floating menu bar with movable shortcut icons (UI/FloatingMenu.lua)
- Remote sequence browser for P2P shared sequences (UI/RemoteBrowser.lua)
- Spell cache diagnostic viewer (UI/SpellCacheViewer.lua)
- ContextTab group collapsed/expanded state persists across sessions
- DebugWindow closes with ESC key (UISpecialFrames registration)
- Clear Overrides confirmation dialog in SpellCacheViewer
- SwitchVersion prompts Save/Discard/Cancel when switching versions with unsaved edits
- MainFrame position restoration validates SavedVariables anchor strings with graceful fallback to CENTER
- LibQTip-2.0 tooltip library added
- P2P transmission: metadata-only sync, spell cache broadcast, chat links with clickable import, recipient autocomplete, cross-server
- Corrupt sequence recovery (StaticPopup chain: Delete/Skip/Export Raw)
- WagoAnalytics deep integration (sequence/import/export/feature events)
- Support/About page in Settings (version, links, system info)
- Developer utilities: /gems compress, /gems decompress
- Click rate diagnostics (/gems status shows clickRate metrics)
- Optimal MS advisor (/gems msadvisor, analyzes sequence timing)
- Gamepad keybind capture (EnableGamePadButton + OnGamePadButtonDown, 32 button display names, ConsolePort addon detection)
Localization
- 10 locale stub files added (deDE, esES, esMX, frFR, itIT, koKR, ptBR, ruRU, zhCN, zhTW) with framework for community translation
- Spell replacement chain normalization: base spell names heal to active talent-replacement names (e.g. Steady Shot to Barbed Shot)
- AceLocale-3.0 localization framework (11 locale files, 591 strings across 65 categories, community translation contribution path)
- Locale risk detection: compile-time spell-name flagging with localeRiskFlags in VariableStore
- Variables Tab locale warning banner (yellow icon for risky variables, suggests C_Spell.GetSpellName alternative)
- Separate events-enabled toggle per variable (eventsEnabled field, independent of event string content)
- 3 locale string wiring fixes (stub preview, empty hint, keybind hint)
Testing
- 25 unit tests across 8 categories in Test/TestSuite.lua (stepfunc, compiler, reset, import, export, serialization, variables, engine)
Fixed
- P2P metadata sync non-functional: SendSequenceMeta and CMD_META handler accessed fields on wrapper table instead of wrapper.data, always sending updatedAt=0 and help="" (NEW-HIGH-01)
- UndoStack _suppressUndo permanently stuck true on callback error, disabling undo for the rest of the session (NEW-HIGH-02)
- HandleDiag and HandleMSAdvisor used invalid setting keys, always returning 250ms default click rate (NEW-MED-01)
- SpellCache spell-name overrides had no effect due to wrong AceDB path (read GRIPEMS.db instead of GRIPEMS.Settings.db) (NEW-MED-02)
- SpellCacheViewer Clear Overrides also targeted wrong db path, making the button non-functional (HIGH-14)
- SpellValidator load-time constant could crash if TOC load order ever changed (NEW-HIGH-03)
- SettingsPanel early D binding could crash on TOC reorder (NEW-MED-03)
- MacroManager DeleteStub substring match could delete wrong macro stub when one sequence name was a prefix of another (HIGH-03)
- Cross-realm chat links fell through to remote request path due to missing Ambiguate normalization on player name (HIGH-01)
- SwitchVersion silently discarded unsaved step edits (HIGH-04)
- StepFunctions modulo-by-zero on empty sequences: Sequential returned NaN, Random errored (MED-38)
- TrackerHUD GetActiveVersion nil crash on corrupt version data (MED-40)
- TrackerHUD name truncation off-by-one: displayed 9 chars instead of max 8 (MED-24)
- UndoStack Push accepted nil or non-function callbacks, causing delayed crash on Undo/Redo instead of immediate caller error (HIGH-11)
- MainFrame RestorePosition crashed on corrupt SavedVariables anchor string (HIGH-05)
- UpdateEditArea SH hook race: programmatic SetText triggered SyntaxHighlight colorization, corrupting step data (S29-BUG-05)
- Autocomplete color code corruption from SyntaxHighlight focus hooks splicing colorized text into plain-text cursor positions (S30-BUG-01)
- Flat sequences forced into tree mode after /reload due to unconditional auto-migration in Engine:LoadSequences (S30-BUG-02)
- ShowRenameDialog whitelist missed keyPress/keyRelease fields on version deep-copy
- Removed Test/TestSuite.lua from TOC load list (file excluded from packages via .pkgmeta, caused load warnings for installed users)
Changed
- Branding: legacy import modules renamed to LegacyImport.lua and LegacyMigrate.lua. Module tables, aliases, functions, parameters, variables, and locale keys updated. Functional wire format references preserved
- C_TooltipInfo API migration (GetItemByID/GetSpellByID with fallback)
- MoveStep undo closures inlined (direct table swap)
- Dead DRAG_SCROLL_SPEED constant replaced with DRAG_SCROLL_INCREMENT
- OOCQueue now checks AddOnRestrictionType beyond InCombatLockdown
- EDITOR_HEADER_HEIGHT reduced from 220 to 200 (dark EditBox contrast fix)
- Preview icon strip edge fade textures on both sides (layout fix)
- Deprecated split-pane UI code removed: RefreshTreeMode, stale Hide() calls, _ensureSplitPaneElements
- ComparisonFrame OnUpdate skips when frame is hidden (NEW-MED-04)
- PopupEditor callbacks unregistered on release instead of dispatching to idle instances (MED-37)
- ReclaimFrame clears 12 scripts on recycle instead of 8, adding OnEnter, OnLeave, OnClick, and OnTextChanged (MED-20)
- SequenceEditor callbacks skip refresh when editor panel is hidden (MED-14)
- GearVariables event frame reused on /reload instead of orphaned (NEW-LOW-02)
- MacrosTab overflow FontString uses create-once/reuse pattern instead of leaking a new FontString per refresh (NEW-LOW-03)
- Export version prep deduplicated into shared PrepareExportVersions helper (NEW-MED-11)
- SpellValidator validation counting deduplicated into AccumulateCounts helper (NEW-MED-06)
- nameTooltipFrame dead overlay removed, tooltip moved directly to nameEditBox (NEW-LOW-01)
- Duplicate locale key consolidated to GEMS_SEND_NO_SEQ (NEW-LOW-06)
- KeyPress/KeyRelease tooltip descriptions clarified with per-step fit behavior explanation (MED-UX)
- 5 tooltip strings standardized for tone and accuracy (S28-39)
- README slash commands updated to 26 entries (S28-37)
- .pkgmeta now excludes Test/, Prompts/, and internal dev folders from user packages (NEW-MED-07)
Internal
- S28 Full Code Audit: 38 findings resolved across 4 tiers (see Backlog.md for itemized list with completion dates and evidence)
- stylua reformat on 38 files (120 col, 4-space indent, Unix LF)
- Selene pinned to v0.30.1 in lint.yml with fail-fast download (CI-MED)
- .luacheckrc redefined warnings re-enabled with targeted 432/self suppression and 5 inline exceptions (NEW-MED-10)
- wow.toml: 6 missing globals added (gsub, gmatch, getfenv, setfenv, rawlen, GetSpecializationInfoByID) (NEW-MED-08)
- luacheck 0 warnings / 0 errors across 65 shipped files
- Phantom method check: SLV 53 methods, SE 42 methods -- all clean
- ActionRenderers.lua retained for future extraction (sole caller RefreshTreeMode deleted in S30 Phase 3)
- New files: UI/ComparisonFrame.lua, UI/PopupEditor.lua, UI/SyntaxHighlight.lua, Core/PluginAPI.lua, Engine/MacroRecorder.lua, UI/RemoteBrowser.lua, Engine/ActionCompiler.lua, UI/ActionRenderers.lua, Engine/VehicleKeybinds.lua, Engine/PetBattleButtons.lua, Engine/BarIntegration.lua, UI/SpellPicker.lua, UI/FloatingMenu.lua, UI/SpellCacheViewer.lua, Import/RawImport.lua, Data/GearVariables.lua, Engine/ExecutionTracer.lua, Test/TestSuite.lua, UI/UndoStack.lua, 11 Locale/*.lua files
- UndoStack module for per-instance undo/redo
- BuildSeqDataFromGRIP1 shared helper eliminates import path drift
- 28 sessions of parity work across 9 tiers (24 DONE, 4 PARTIAL, 0 DEFERRED)
[v1.1.6] - 2026-03-30
Added
- Locale-safe SavedVariables: spell names in sequence steps are now backed by spell ID tags, enabling automatic recovery when the WoW client language changes. Existing sequences are migrated transparently on first load
- Automatic locale healing: on login, if the client language differs from the language used when sequences were last saved, step text is automatically retranslated from spell IDs to the current language
- Item and toy name translation: /equip, /equipslot, and /usetoy commands now participate in locale-safe tagging alongside /cast, /use, and /castsequence
- Item cache built from bags and equipped gear, refreshed automatically on inventory or equipment changes
- Toy cache built from the player toy collection (account-wide)
- /gems testlocale command: runs a 9-spell round-trip tagging test plus a locale healing simulation to verify the translation pipeline
- /gems revalidate command: force re-tags all sequences from current spell names (recovery tool for edge cases like spell renames between patches)
Internal
- GRIP_FORMAT_VERSION bumped to 3 (adds taggedSteps, stepsLocale per version)
- LOCALE_STORE_VERSION 1 for migration gating
- SpellCache.lua expanded with item/toy caches, 3 tag formats (spell, item, toy), and unified TranslateSpellRef for bidirectional name-to-ID translation
- Import path strips taggedSteps on export, captures on GRIP1 import
- SPELL_CACHE_REFRESHED callback drives both migration and healing
[v1.1.5] - 2026-03-30
Added
- Sequence metadata editor: collapsible section in the editor header with 4 editable fields (Author, Description, Help Text, Help Link) and 4 read-only fields (Class, Spec, Created, Updated). Wired to dirty-state save/discard and persisted through GRIP1 export/import
- Drag-to-reorder steps in the editor: drag handle on each step row, ghost frame during drag, insertion indicator between rows
- GRIP1 collection import: multi-sequence and variable payloads in a single export string
- Import deep content comparison: fingerprint-based detection shows "identical" (grey) or "different" (yellow) badges when an imported sequence already exists, replacing the binary exists/new check
- Legacy import mapping for Help and Helplink metadata fields
Fixed
- GRIP1 variable export field name mismatch: description field now correctly reads from comments key with description fallback (BUG-056)
- TrackerHUD nil guard: specID tooltip no longer errors when spec data is unavailable
- CommitSelected metadata passthrough: both GRIP1 export paths now include full sequence metadata
Changed
- Import frame restyled with native dark theme matching the export frame visual style
Removed
- Dead SpellCache:IsValidSpell method (21 lines, zero callers)
Internal
- Added tContains to selene wow.toml globals
- Core.lua migration adds help/helplink defaults to existing sequences
[v1.1.4] - 2026-03-29
Added
- Rotation preview: horizontal fade gradients on the icon strip edges indicating scrollable content when icons overflow
Fixed
- Spell validation: /cast and /use lines with semicolon-delimited conditional branches now extract every spell instead of only the first token. Sequences using Secure Command Options (e.g. /cast [mod:alt] Spell A; Spell B) now validate all branches
- Spell validation: issecretvalue() guard on C_Spell.DoesSpellExist prevents a potential Lua error if Blizzard adds taint annotations to the return value in a future patch
Changed
- Import frame restyled with dark theme (native CreateFrame + BackdropTemplate) matching the export frame visual style
- Context tab scroll area now resizes correctly when the editor window is resized
[v1.1.3] - 2026-03-29
Fixed
- Import: /use inventory slot numbers no longer resolved as spell IDs, eliminating false "exceeds macrotext limit" warnings on sequences using trinket slots (BUG-046)
- Spell validation: "null" placeholder in /castsequence recognized as valid no-op instead of flagged as unknown (BUG-047)
- SpellCache: removed shouldHide filter that excluded castable spells from hidden skill lines (Hunter Pet Utility, Warlock summon, etc.) (BUG-048)
- SpellCache: flyout children (Call Pet 1-5, summon spells) now cached using generic castable names instead of pet-specific display names (BUG-049)
- Step editor: editBox byte limit corrected from 1023 to 255 to match the SAB macrotext limit (BUG-050)
- Spell validation: /use with pure numeric arguments skipped as inventory slot references instead of validated as spell names (BUG-052)
- Preview icons, TrackerHUD, and sequence list now show rotation spells instead of housekeeping spells. ParseSpellFromMacrotext rewritten with two-tier priority: unconditional or [combat] lines preferred over conditional housekeeping lines (BUG-053)
- SpellCache: added UNIT_PET and PET_BAR_UPDATE event registration for prompt rescan on pet summon, dismiss, or death (BUG-054)
- Export frame: ESC now closes only the export overlay instead of the entire addon window. Uses keyboard intercept instead of UISpecialFrames
- Spell validation: "!" anti-toggle prefix (/cast !Moonkin Form) stripped in CleanSpellToken so toggled spells validate correctly
- Spell warning banner tooltip anchors to mouse cursor instead of the banner frame for better readability
- Cosmetic #showtooltip entries in spell warning tooltip now appear after the 10-entry truncation line instead of being silently cut
- Debug log: gear-reset and spec-reset messages now include previous step number and equipment slot for diagnostics
Changed
- CHANGELOG v1.0.1 BUG-009 entry corrected: SAB limit is 255 post-11.0.2, not 1023 (BUG-051)
[v1.1.2] - 2026-03-28
Added
- Export Frame dark theme: native CreateFrame replacing AceGUI Frame, dark navy background, themed title bar and buttons, dark scrollBG on display stage editbox (A1)
- Single-sequence export variable inclusion: right-click Export on a sequence with <sub>var</sub> references opens Export Multi picker with that sequence pre-selected and variable deps auto-checked with gold "auto" badge. Direct display (no picker) when no variables. /gems export slash command supports both paths (A2)
- #showtooltip spell validation: ExtractAllSpells now parses #showtooltip and #show lines as cosmetic "tooltip_stale" category. Dimmed grey entries in spell warning banner tooltip. Does not inflate staleCount or trigger the yellow banner by itself. Bare #showtooltip (no args) ignored. "!" anti-toggle prefix stripped in CleanSpellToken (A3)
- Copy Preview Text button: text-mode Rotation Preview shows a Copy button that routes through ExportFrame display stage for clipboard access. Hidden in icon-strip mode (B1)
- SPELLS_CHANGED live revalidation: two-hop callback chain -- SpellCache fires SPELL_CACHE_REFRESHED after Scan(), SpellValidator throttles (1.0s debounce) and revalidates, fires SPELL_VALIDATION_UPDATED. SequenceEditor banner and SequenceList overlays update live on spec swap or talent change. Dual debounce (0.5s cache + 1.0s validation) prevents rapid-fire revalidation (B2)
Fixed
- nameEditBox anchor chain: replaced hardcoded -280/-155 pixel offsets with right-to-left button chain from header TOPRIGHT (sendBtn -> exportBtn -> discardBtn -> saveBtn). nameEditBox RIGHT anchors to saveBtn (dirty) or exportBtn (clean). Eliminates magic numbers, scales with window resize (C1)
- KeybindTab scroll panel: specContainer wrapped in UI:CreateScrollPanel(). Scroll activates only if class has more than 4 specs (future-proofing). Visually unchanged for current classes (C2)
- Tooltip edge clamp: UI:ShowTooltip() now checks right edge of UIParent after GameTooltip:Show() and flips anchor to TOPRIGHT->TOPLEFT when tooltip would clip off-screen (C3)
Changed
- Channel protection: new sequences default to /stopmacro [channeling] in keyPress template (B3, implemented in v1.1.1)
[v1.1.1] - 2026-03-28
Fixed
- Locale key mismatch causing nil tooltip for Reverse Priority step function description (BugSack error at SequenceEditor tooltip builder)
- Bare sort() replaced with table.sort() for Lua best practice consistency
Changed
- Engine: extracted ResolveFitAndExpand helper, deduplicating resolve-fit-expand logic across Priority and ReversePriority paths in ActivateSequence and RecompileSequence (-33 lines)
- Core: new D.NewSequenceFromTemplate() factory replacing 31-line manual field copy in HandleCreate
- UI: centralized ResolveIcon, CreateScrollPanel, and ApplyBackdrop helpers in Util.lua, replacing duplicated patterns across 15 files (-100+ lines)
- Removed dead OnChar callback in Core.lua (superseded by OnTextChanged)
- Removed legacy GRIP_EMS_CHAR.config init from ADDON_LOADED (migrated to AceDB)
Internal
- Full codebase audit: 69 findings resolved across 4 sessions, 26 prompts
- Robustness: pcall-wrapped AceDB init, friend list iteration, and RestyleAceFrame; nil guards on locale fetch and spell validator module refs
- Edge cases: field validation on raw tab apply, clamped defaultVersion, macro overflow indicator, type-safe icon handling in TrackerHUD, cross-version tooltip in ContextTab, scroll panel for 5+ spec keybind rows
- Performance: dirty-flag sort cache, debounced step refresh, O(1) circular ring buffer for debug window, selective diff-based event registration in VariableStore, pre-computed strlower sort keys in SpellCache
- Leak prevention: callback unregistration on disable, ticker reference storage, tContains guards for UISpecialFrames, known-user pruning in Transmission
- UX polish: combat-unavailable save tooltip, keybind conflict detection with warning, ESC-cancels-capture hint, read-only indicator on raw tab, split unknown/known spell counts in import preview
- Dead code removal: 57 unused locale keys, LMETA/RMETA modifier keys, click rate setting remnant in ADDON_LOADED
- Module-level docstrings on all 36 shipped files
- Luacheck: 0 warnings / 0 errors across all shipped files
[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 and editBox max set to 255 (SAB macrotext limit post-11.0.2) (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