add-achievement-data
Transforms raw achievement lists into formatted Lua data for the Krowi's Achievement Filter addon.
Install
mkdir -p .claude/skills/add-achievement-data && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/16614" && unzip -o skill.zip -d .claude/skills/add-achievement-data && rm skill.zipInstalls to .claude/skills/add-achievement-data
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Transform raw achievement lists (IDs + comments) into properly formatted Lua achievement data entries for Krowi's Achievement Filter addon. Handles reward type mapping, season references, faction detection, and maintains consistent code style.Key capabilities
- →Transform raw achievement lists into Lua data entries
- →Query wow.tools.local for achievement data
- →Cross-check Wowhead for reward details
- →Parse achievements for rewards, seasons, and factions
- →Generate properly formatted Lua code
How it works
This skill processes raw achievement IDs, queries external databases like wow.tools.local and Wowhead for metadata, and then generates formatted Lua code for the Krowi's Achievement Filter addon.
Inputs & outputs
When to use add-achievement-data
- →Add new patch achievements
- →Convert API achievement data to Lua
- →Bulk update achievement rewards
- →Format metadata for achievement tracking
About this skill
Transform raw achievement lists (IDs + comments) into properly formatted Lua achievement data entries for the Krowi's Achievement Filter addon. Uses the V2 fluent builder format (Ach(id):Method():...) which is the current standard for all new data across all expansions and clients.
Provide your achievement list in this format and I'll:
- Scan the currently open AchievementData.lua file to detect the expansion and latest patch
- Confirm the target patch with you (append to existing or create new)
- Query wow.tools.local for each achievement to get authoritative name, faction, and reward data
- Cross-check Wowhead for any reward or description details the DB doesn't clarify
- Parse achievements, detect rewards, seasons, and factions — using DB + web data to fill gaps
- Generate properly formatted Lua code using V2 format
- Insert or display the results
When to Use
- Adding new batch of achievements for a patch
- Converting achievement data from WoW API or external sources
- Bulk adding achievements with their associated metadata
Input Format
Provide a raw achievement list with this format:
{AchievementID}, -- Achievement Name (optional: Reward: description, Season/Event info, Faction)
Example:
{61792}, -- T-A-G that spells "Gotcha!"
{61793}, -- Deployed to the Void
{ -- Abyss Anglers: Pressurized Eyeglass (Reward: Unlock Pressurized Eyeglass for purchase from Depthdiver Jeju)
62506,
{
RewardType = rewardType.NotCategorized,
},
},
Processing Steps
0. Determine Target Patch (First Step)
Before parsing achievements, use the Patch Version Determination process (see section below) to establish which patch/expansion these achievements will be added to.
0.5. DB & Web Lookup (Before Parsing)
Before applying comment-based heuristics, query authoritative sources. The DB is ground truth; Wowhead fills gaps.
wow.tools.local (primary — game DB)
Query all IDs in a single batch using the designated script .github/skills/add-achievement-data/_lookup_ids.ps1 — never write a new inline/ad-hoc PowerShell snippet. Full API reference: .github/skills/verify-achievement-data/API.md.
Rule: Never create new throwaway .ps1 files for one-off lookups. Edit the $ids (and $build if needed) line in the designated script via replace_string_in_file, then run it with the same terminal command every time. This keeps the terminal command identical across runs so it isn't re-flagged for approval after the first run.
# Edit $ids and $build inside _lookup_ids.ps1 first, then:
.\.github\skills\add-achievement-data\_lookup_ids.ps1
Output format per line: id|Title_lang|Reward_lang|Faction|RewardItemID (or id|NOTFOUND).
Column index map (key fields for data entry):
| Index | DB column | What it tells you |
|---|---|---|
| 0 | Description_lang | Achievement description — use when reward type or category is ambiguous |
| 1 | Title_lang | Authoritative achievement name — use to correct inline comments |
| 2 | Reward_lang | Non-empty means reward exists. "Title Reward: X" or "Title: X" → :Title(). "Reward: X" (no "Title") → tangible reward (mount/pet/toy/etc.) |
| 3 | ID | Confirm ID exists in DB (recordsFiltered == 0 means not found) |
| 5 | Faction | -1 = both, 0 = Horde only, 1 = Alliance only |
| 13 | RewardItemID | Non-"0" = item reward exists (Retail only — unreliable in Classic) |
What to do with DB data:
Faction == 0or1→ apply:FactionSplit()or:AutoFactionSplit()as appropriate; look for counterpart ID (typically ±1)Reward_langstarts with"Title"→ add:Title()Reward_langnon-empty without"Title"prefix → lookup the specific reward type on WowheadrecordsFiltered == 0→ ID not in this build; try alternate build or ask user to confirm IDTitle_langdiffers from inline comment → correct the comment to match DB name
Build selection: Retail files → wow build (e.g. 12.0.5.67602). Classic files → wow_classic (e.g. 5.5.3.67509 for Cata/MoP Classic) or wow_classic_era. Probe the DB with a known ID to confirm. See API.md for full build table.
Wowhead (secondary — reward and description detail)
Use Wowhead when Reward_lang is ambiguous, empty but a reward is suspected, or you need to see the exact reward item/mount/pet name.
| Client | URL pattern |
|---|---|
| Retail | https://www.wowhead.com/achievement=ID |
| Cata / MoP Classic | https://www.wowhead.com/classic/achievement=ID |
| WotLK Classic | https://www.wowhead.com/wotlk/achievement=ID |
On the Wowhead page, look for:
| Wowhead section | Maps to |
|---|---|
| Title Reward | :Title() |
| Mount in rewards | :Mount() |
| Battle Pet in rewards | :Pet() |
| Toy in rewards | :Toy() |
| Tabard in rewards | :Tabard() |
| Appearance / Transmog set in rewards | :Transmog() |
| Unlocks for purchase (vendor item, not directly awarded) | :NotCategorized() |
| Unlock travel method | :Mount() |
| Housing decoration | :HousingDecor() |
| Warband Campsite | :WarbandCampsite() |
| No reward section | Simple Ach(id) |
Tip: Wowhead also shows faction restrictions, category (PvP / Dungeon & Raids / etc.), and "unavailable" banners — use these to confirm
:IsPvP(),:FactionSplit(), and:Obtainable()needs.
1. Parse Achievement ID
Extract numeric ID from each entry. IDs must be valid positive integers.
2. Extract Comment
Capture the comment after --. Comments contain:
- Achievement name (required)
- Reward type hint in parentheses (optional)
- Season/Event references (optional)
- Faction indicator (optional)
3. Reward Type Detection
Map comment text to AchBuilder method names:
| Keyword in Comment | Method |
|---|---|
| "Mount:", "Mount: " | :Mount() |
| "Title:", "Title: " | :Title() |
| "Pet:", "Pet: " | :Pet() |
| "Toy:" | :Toy() |
| "Tabard:" | :Tabard() |
| "Transmog:" | :Transmog() |
| "Unlock ..., for purchase" | :NotCategorized() |
| "Unlock ... travel method" | :Mount() |
| "Unlock ... decor" | :HousingDecor() |
| "Character Unlock:", "Character Title:", "Seasonal Character Title:" | :Title() |
| "Shop Sign" | :HousingDecor() |
| Bronze Cache | :RemixBronze() |
| Allied Race unlock | :AlliedRace() |
| Warband Campsite | :WarbandCampsite() |
| (no clear match) | Ask for clarification |
Reward type methods (all 17):
:NotCategorized() :Other() :AlliedRace() :Garrison() :Mount() :Pet() :RemixBronze() :Tabard() :Teleport() :Title() :Toy() :TradersTender() :Transmog() :WarbandCampsite() :RemixInfiniteKnowledge() :HousingDecor() :KeystoneResilience()
Additional (non-reward) methods:
:IsPvP() :PvP(N) :PvE(N) :IsRealmFirst() :Obtainable(...) :Anniv20() :FactionSplit(faction, altId) :AutoFactionSplit(faction, altId)
Rules:
- If multiple reward types apply (e.g., "Title and Mount"), chain both:
Ach(id):Title():Mount() - If comment contains "Reward:" but no recognizable keyword, ask user for clarification
- If no reward hint in comment, use simple form:
Ach(id), -- Comment
3.5 Pet Reward Preview: SpeciesID Lookup
:Pet() optionally takes a battle pet SpeciesID — this is the only way to deterministically render the correct pet model in the reward preview (there's no reliable spell/item → species API). At runtime the game resolves name + display model from this id via C_PetJournal.GetPetInfoBySpeciesID(speciesId). Always look this up when the achievement grants a battle pet.
- Get the achievement's
Reward_langfrom the DB (already fetched in step 0.5 via_lookup_ids.ps1), e.g."Pet: Fledgling Warden's Companion". Strip the"Pet: "prefix to get the creature name. - Look up that creature name's SpeciesID using the designated script
.github/skills/add-achievement-data/_lookup_pet_speciesid.ps1— set$names = @("Fledgling Warden's Companion")(and$buildif needed) viareplace_string_in_file, then run it. Never write a new ad-hoc query for this. The script chains two DB tables:creature(find the creature'sIDby exactName_langmatch) →battlepetspecies(filterCreatureIDcolumn by that id, read itsIDcolumn — the SpeciesID).
Output:.\.github\skills\add-achievement-data\_lookup_pet_speciesid.ps1<Name>|CreatureID=<id>|SpeciesID=<id>(orNOTFOUND). - Pass the SpeciesID value into the builder:
Ach(42319):Pet(4901), -- Azsuna (Pet: Fledgling Warden's Companion). - If the creature name search returns multiple/no matches, fall back to a manual lookup in the web UI:
/dbc/?dbc=creature&build=<build>&locale=enUS#page=1&colFilter[1]=<Name>to find the creature'sID, then/dbc/?dbc=battlepetspecies&build=<build>&locale=enUS#page=1&colFilter[3]=exact:<creatureId>to find itsID(SpeciesID). - If no SpeciesID can be found at all (rare), fall back to a plain
:Pet()with no argument rather than guessing an id.
3.6 Mount Reward Preview: MountId Lookup
:Mount() optionally takes a mount id (the mount DBC table's own ID, NOT the summoning spell id) — needed to deterministically render the correct mount model in the reward preview. At runtime the game resolves name/display via C_MountJournal.GetMountInfoByID(mountId) (name) and C_MountJournal.GetMountInfoExtraByID(mountId) (display/scene id). Always look this up when the achievement grants a mount.
- Get the achievement's
Reward_langfrom the DB, e.g."Mount: Stormtouched Bruffalon". Strip the"Mount: "prefix to get the mount name. - Look up that mount name's id using the designated script
.github/skills/add-achievement-data/_lookup_mount_id.ps1— set$names = @("Stormtouched Bruffalon")(and$buildif needed) viareplace_string_in_file, then run
Content truncated.
When not to use it
- →When the user asks what new achievements a patch has without using the script
- →When assuming only IDs above a threshold are new achievements
Limitations
- →The skill is designed for Krowi's Achievement Filter addon.
- →The skill uses the V2 fluent builder format.
How it compares
This skill automates the process of fetching, parsing, and formatting achievement data into a specific Lua format, unlike manual data entry and lookup.
Compared to similar skills
add-achievement-data side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| add-achievement-data (this skill) | 0 | 1mo | No flags | Advanced |
| streamlit | 86 | 9mo | No flags | Intermediate |
| jupyter-notebook | 30 | 6mo | Review | Intermediate |
| backtesting-frameworks | 17 | 2mo | No flags | Advanced |
Try saying
Example prompts that trigger this skill in your AI assistant.
You might also like
streamlit
sverzijl
When working with Streamlit web apps, data dashboards, ML/AI app UIs, interactive Python visualizations, or building data science applications with Python
jupyter-notebook
davila7
Use when the user asks to create, scaffold, or edit Jupyter notebooks (`.ipynb`) for experiments, explorations, or tutorials; prefer the bundled templates and run the helper script `new_notebook.py` to generate a clean starting notebook.
backtesting-frameworks
wshobson
Build robust backtesting systems for trading strategies with proper handling of look-ahead bias, survivorship bias, and transaction costs. Use when developing trading algorithms, validating strategies, or building backtesting infrastructure.
pdf-processing-pro
davila7
Production-ready PDF processing with forms, tables, OCR, validation, and batch operations. Use when working with complex PDF workflows in production environments, processing large volumes of PDFs, or requiring robust error handling and validation.
llava
zechenzhangAGI
Large Language and Vision Assistant. Enables visual instruction tuning and image-based conversations. Combines CLIP vision encoder with Vicuna/LLaMA language models. Supports multi-turn image chat, visual question answering, and instruction following. Use for vision-language chatbots or image understanding tasks. Best for conversational image analysis.
cocoindex
cocoindex-io
Comprehensive toolkit for developing with the CocoIndex library. Use when users need to create data transformation pipelines (flows), write custom functions, or operate flows via CLI or API. Covers building ETL workflows for AI data processing, including embedding documents into vector databases, building knowledge graphs, creating search indexes, or processing data streams with incremental updates.