Plugin Overview & Quickstart¶
What is better-addons?¶
better-addons is a Claude Code plugin purpose-built for World of Warcraft addon development targeting Patch 12.0+ (Midnight). It gives you a team of 9 specialized AI agents, 10 slash commands, and 4 development modes — all engineered from the ground up to write correct, modern addon code that actually works in the post-Midnight world.
If you've tried using a general-purpose AI to write WoW addons, you've hit the wall: hallucinated APIs like C_Spell.GetSpellName() that don't exist, code that calls CombatLogGetCurrentEventInfo() even though CLEU was removed in 12.0, settings panels built with InterfaceOptions_AddCategory() which hasn't worked since Dragonflight. Generic AI assistants don't know what they don't know about WoW's Lua environment — and that's exactly the problem better-addons solves.
Route and Delegate Architecture¶
better-addons doesn't use a single monolithic prompt. Instead, it operates as an agent swarm with a clear delegation chain:
- The Generalist receives your request and determines what kind of work it is
- It routes to a specialist — the Coder for writing code, the Researcher for API verification, the Reviewer for quality checks, the Debugger for diagnosing issues
- Specialists can further delegate — the Coder calls the Researcher to verify an API signature before using it, the News Desk spawns parallel search agents to cross-reference sources
This means when you ask "build me a boss timer addon," the system doesn't just generate code. It researches which timer APIs exist in 12.0.1, verifies that C_EncounterTimeline is the right namespace, confirms the function signatures, generates code using only verified APIs, and then reviews that code for deprecated calls and taint risks.
Anti-Hallucination Engineering¶
Every agent in the system carries extensive tables of functions that do not exist in WoW's Lua environment. This is the inverse of normal documentation — instead of listing what's available, better-addons explicitly tells the AI what to never generate:
C_Spell.GetSpellName()— does not exist (useC_Spell.GetSpellInfo().name)C_Timer.SetTimeout()— does not exist (useC_Timer.After())RegisterEvent()as a global — does not exist (useframe:RegisterEvent())frame:SetBackdrop()withoutBackdropTemplate— broken since 9.0
Combined with Secret Values awareness baked into every agent, better-addons understands that UnitHealth("target") returns an opaque value during combat in 12.0 that cannot be compared, divided, or used as a table key — and generates the correct issecretvalue() guard pattern automatically.
Installation¶
Prerequisites¶
- Claude Code CLI installed and authenticated (install guide)
- A WoW addon project or an empty directory where you want to create one
- WoW 12.0+ (Midnight) installed for testing (recommended, not required for code generation)
Install the Plugin¶
Initialize a New Project¶
Navigate to your addon directory and run:
Then inside Claude Code:
This scaffolds a complete addon project with all the files you need.
Verify Installation¶
Inside Claude Code, run:
You should see the active development mode (defaults to enhancement-artist) and a list of all four available modes. If this works, better-addons is installed and ready.
Already have an addon project?
You don't need to start fresh. Navigate to your existing addon directory, launch Claude Code, and start using any /wow-* command. The plugin works with any WoW addon project structure.
Your First Addon in 5 Minutes¶
Let's build a simple addon from scratch using /wow-create. This walkthrough shows you the full flow — from a one-line description to a working addon you can load in WoW.
Step 1: Describe What You Want¶
/wow-create "WelcomeBack - shows a welcome message with your character name and
current gold when you log in, with a slash command to show it again"
The Coder agent reads the starter template, researches the required APIs (GetMoney(), GetCoinTextureString(), UnitName("player")), and generates a complete addon.
Step 2: What Gets Generated¶
The plugin creates these files in your working directory:
## Interface: 120001
## Title: WelcomeBack
## Notes: Shows a welcome message with your character name and gold on login.
## Author: YourName
## Version: @project-version@
## SavedVariables: WelcomeBackDB
## AddonCompartmentFunc: WelcomeBack_OnCompartmentClick
## IconTexture: Interface\Icons\Spell_Holy_BlessingOfStrength
Init.lua
Core.lua
local addonName, ns = ...
ns.addonName = addonName
ns.defaults = {
enabled = true,
showOnLogin = true,
}
-- Event dispatcher
local eventHandlers = {}
local eventFrame = CreateFrame("Frame")
eventFrame:SetScript("OnEvent", function(self, event, ...)
local handler = eventHandlers[event]
if handler then handler(self, event, ...) end
end)
local function RegisterEvent(event, handler)
eventHandlers[event] = handler
eventFrame:RegisterEvent(event)
end
-- ADDON_LOADED: initialize SavedVariables
RegisterEvent("ADDON_LOADED", function(self, event, loadedAddon)
if loadedAddon ~= addonName then return end
eventFrame:UnregisterEvent("ADDON_LOADED")
if not WelcomeBackDB then
WelcomeBackDB = {}
end
ns.db = WelcomeBackDB
-- Merge defaults for any missing keys
for key, value in pairs(ns.defaults) do
if ns.db[key] == nil then
ns.db[key] = value
end
end
-- Register slash command
SLASH_WELCOMEBACK1 = "/welcomeback"
SLASH_WELCOMEBACK2 = "/wb"
SlashCmdList["WELCOMEBACK"] = function(msg)
ns:ShowWelcome()
end
end)
-- PLAYER_LOGIN: show the welcome message
RegisterEvent("PLAYER_LOGIN", function()
if ns.db.showOnLogin then
-- Delay slightly so chat frame is ready
C_Timer.After(1, function()
ns:ShowWelcome()
end)
end
end)
-- Addon Compartment click handler
function WelcomeBack_OnCompartmentClick()
ns:ShowWelcome()
end
Step 3: Understanding the Generated Code¶
Every generated addon follows the same battle-tested structure:
| File | Role | Loads |
|---|---|---|
WelcomeBack.toc | Manifest — tells WoW what to load, declares SavedVariables | First (by WoW client) |
Init.lua | Namespace, event dispatch, SavedVariables init, slash commands | Second |
Core.lua | Feature logic — the actual addon behavior | Third |
The code uses three foundational patterns:
Namespace pattern — local addonName, ns = ... gives every file access to a shared private table. No globals needed (except SavedVariables and slash commands, which WoW requires to be global).
Table-dispatch events — Instead of if event == "X" then ... elseif event == "Y" then ..., handlers are stored in a table and dispatched by key lookup. Clean, fast, and easy to extend.
Proper initialization order — ADDON_LOADED fires when your addon's files are loaded (where SavedVariables become available). PLAYER_LOGIN fires when the player enters the world (where you can safely access character data and show UI).
Step 4: Install and Test¶
Copy the generated folder to your WoW addons directory:
Launch WoW, log in, and you should see the welcome message in chat. Type /wb to show it again.
That's it
You have a working addon. It handles SavedVariables correctly, follows the namespace pattern, uses the Addon Compartment for minimap access, and targets Interface 120001. No deprecated APIs, no global pollution, no taint risk.
The Workflow¶
Real addon development is rarely "generate once and ship." better-addons supports a full Research Code Review Debug cycle where agents hand off context to each other.
The Agent Handoff Chain¶
Here's how agents collaborate on a real task. Say you want to build a Poison Reminder addon — something that checks if your Rogue has poisons applied and warns you before a dungeon.
Phase 1 — Research¶
You ask: "What APIs can I use to check if the player has poisons applied?"
The Generalist recognizes this as an API research question and delegates to the Researcher. The Researcher launches parallel searches across the WoW wiki, addon source code on GitHub, and community resources. It returns verified findings:
C_UnitAuras.GetAuraDataByIndex()— iterate all buffs, check for poison buff namesC_Spell.GetSpellInfo(spellID)— get poison spell details by IDC_SpellBook.HasSpell(spellID)— check if the player knows a poison spell- Secret Values note: aura data is readable out of combat, may be restricted in instanced PvP
Each finding carries a confidence label: CONFIRMED (verified in wiki + source), CORROBORATED (found in multiple real addons), or UNVERIFIED (single source only).
Phase 2 — Code¶
You say: "Build the addon."
The Generalist routes to the Coder, passing along the Researcher's verified API list. The Coder generates a complete addon using only the confirmed APIs — never inventing functions, never using deprecated calls. The generated code includes:
- Aura scanning on
UNIT_AURAevents (filtered to"player") - Instance detection via
IsInInstance()before showing warnings issecretvalue()guards on any value that might be secret in combat- Settings panel for configuring which poisons to track
Phase 3 — Review¶
The Coder can optionally delegate to the Reviewer for a quality pass, or you can trigger it yourself:
The Reviewer scans for 7 categories of issues: deprecated APIs, taint risks, Secret Values violations, Lua 5.1 compatibility, combat lockdown violations, performance problems, and TOC correctness. You get a graded report (A through F) with severity-tagged findings.
Phase 4 — Debug¶
If something doesn't work in-game, paste the error:
The Debugger recognizes this as a Secret Values error, reads your code, identifies the line doing if aura.duration > 0 then, and rewrites it with the correct issecretvalue() guard pattern.
Why This Matters¶
Each agent is a specialist with deep context about its domain. The Coder doesn't need to be an API researcher — it receives verified data. The Reviewer doesn't need to generate code — it only reads and critiques. This separation means each agent can be highly focused and carry extensive domain-specific anti-hallucination rules without hitting context limits.
Quick Reference¶
Commands¶
All commands are available as /wow-* slash commands inside Claude Code.
| Command | Description |
|---|---|
/wow-create | Generate a complete addon from a description |
/wow-api | Look up a WoW API function, event, or namespace |
/wow-review | Review addon code for bugs, deprecated APIs, and taint risks |
/wow-debug | Diagnose an addon error or unexpected behavior |
/wow-migrate | Migrate a pre-12.0 addon to Midnight compatibility |
/wow-research | Deep research on a WoW API topic with multi-source verification |
/wow-verify | Verify whether a code snippet or API claim is valid for 12.0.1 |
/wow-news | Get the latest WoW addon ecosystem news |
/wow-mode | Switch development mode or check current mode |
/wow-init | Initialize a new addon project from the starter template |
For detailed usage of each command, see the Commands Reference.
Agents¶
These agents work behind the scenes. You don't invoke them directly — commands and the Generalist route to them automatically.
| Agent | Role |
|---|---|
| Generalist | Entry point. Routes requests to specialists. Handles simple questions directly. |
| Coder | Writes production-ready addon code. Carries the full anti-hallucination guide. |
| Researcher | Verifies API signatures from multiple sources. Returns confidence-tagged findings. |
| Reviewer | Read-only code review. Checks 7 categories, grades A-F. |
| Debugger | Diagnoses errors: taint, Secret Values, events, frames, init order. |
| Migrator | Converts pre-12.0 addons to Midnight. 6-phase migration process. |
| Scaffold | Generates project structure (TOC, files, CI/CD, linting config). |
| News Desk | Tracks addon ecosystem news with swarm research and source verification. |
| Skin Designer | UI enhancement specialist. hooksecurefunc, Mixin, frame skinning patterns. |
For a deep dive into each agent's capabilities, see the Agents Reference.
Development Modes¶
Modes change how every agent writes, reviews, and scaffolds code. Set them with /wow-mode.
| Mode | Philosophy | Default? |
|---|---|---|
| blizzard-faithful | Official APIs only. No Blizzard frame hooks. Patch-proof. | |
| boundary-pusher | Undocumented APIs, metatable hooks, creative workarounds. ElvUI-class. | |
| enhancement-artist | hooksecurefunc, Mixin, frame skinning. "Enhance don't replace." | |
| performance-zealot | Minimal memory, throttled updates, object pooling, event-driven only. |
For detailed mode philosophy and code examples, see the Modes Reference.
What Makes It Different¶
The Problem with Generic AI¶
When you ask a general-purpose AI to write a WoW addon, it draws on training data that spans every version of WoW, every community post, and every deprecated tutorial ever published. The result is a confident blend of current and outdated code — and you won't know which is which until your addon throws errors in-game.
Common hallucinations from generic AI:
-- None of these work in WoW 12.0.1
local name = C_Spell.GetSpellName(spellID) -- DOES NOT EXIST
C_Timer.SetTimeout(2, callback) -- DOES NOT EXIST
frame:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED") -- EVENT REMOVED IN 12.0
RegisterEvent("PLAYER_LOGIN", handler) -- NOT A GLOBAL FUNCTION
InterfaceOptions_AddCategory(panel) -- REMOVED IN 11.0
local _, _, _, _, _, _, _, _, _, spellID = CombatLogGetCurrentEventInfo() -- REMOVED IN 12.0
These all look reasonable. An AI trained on pre-Midnight data will generate them with full confidence. Your addon loads, appears to work, then breaks the moment you enter combat or open settings.
How better-addons Solves This¶
Anti-hallucination tables — Every code-generating agent carries an explicit blocklist of functions that don't exist or were removed. The AI is told "do not generate these" before it writes a single line.
Mode-aware code generation — A blizzard-faithful addon and a boundary-pusher addon solving the same problem look completely different. The mode system ensures the generated code matches your philosophy, not a one-size-fits-all approach.
Swarm research — The Researcher doesn't check one source. It launches parallel agents searching the WoW wiki, real addon source code on GitHub, and community resources simultaneously. Findings are cross-referenced and tagged with confidence levels before being passed to the Coder.
12.0-native — better-addons was built for Midnight. It doesn't treat Secret Values as an edge case or CLEU removal as a footnote — these are first-class concerns woven into every agent's instructions. When your addon needs to display health bars, it generates the issecretvalue() guard pattern by default, not as an afterthought.
Next Steps¶
You're set up and you've built your first addon. Here's where to go from here:
- Development Modes — Understand the four modes and how they change code generation, review criteria, and architectural recommendations
- Agents Reference — Deep dive into each agent's capabilities, delegation rules, and specializations
- Commands Reference — Detailed usage for all 10 commands with examples and options
- API Cheat Sheet — Verified 12.0.1 API signatures for quick reference
- Common Pitfalls — 17 catalogued AI mistakes with wrong/right code comparisons
- Starter Template — The full template that powers
/wow-create, explained line by line