AD

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.zip

Installs 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.
243 charsno explicit “when” trigger
Advanced

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

You give it
raw achievement list with IDs and comments
You get back
properly formatted Lua achievement data entries in V2 fluent builder format

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:

  1. Scan the currently open AchievementData.lua file to detect the expansion and latest patch
  2. Confirm the target patch with you (append to existing or create new)
  3. Query wow.tools.local for each achievement to get authoritative name, faction, and reward data
  4. Cross-check Wowhead for any reward or description details the DB doesn't clarify
  5. Parse achievements, detect rewards, seasons, and factions — using DB + web data to fill gaps
  6. Generate properly formatted Lua code using V2 format
  7. 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):

IndexDB columnWhat it tells you
0Description_langAchievement description — use when reward type or category is ambiguous
1Title_langAuthoritative achievement name — use to correct inline comments
2Reward_langNon-empty means reward exists. "Title Reward: X" or "Title: X":Title(). "Reward: X" (no "Title") → tangible reward (mount/pet/toy/etc.)
3IDConfirm ID exists in DB (recordsFiltered == 0 means not found)
5Faction-1 = both, 0 = Horde only, 1 = Alliance only
13RewardItemIDNon-"0" = item reward exists (Retail only — unreliable in Classic)

What to do with DB data:

  • Faction == 0 or 1 → apply :FactionSplit() or :AutoFactionSplit() as appropriate; look for counterpart ID (typically ±1)
  • Reward_lang starts with "Title" → add :Title()
  • Reward_lang non-empty without "Title" prefix → lookup the specific reward type on Wowhead
  • recordsFiltered == 0 → ID not in this build; try alternate build or ask user to confirm ID
  • Title_lang differs 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.

ClientURL pattern
Retailhttps://www.wowhead.com/achievement=ID
Cata / MoP Classichttps://www.wowhead.com/classic/achievement=ID
WotLK Classichttps://www.wowhead.com/wotlk/achievement=ID

On the Wowhead page, look for:

Wowhead sectionMaps 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 sectionSimple 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 CommentMethod
"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.

  1. Get the achievement's Reward_lang from 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.
  2. 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 $build if needed) via replace_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's ID by exact Name_lang match) → battlepetspecies (filter CreatureID column by that id, read its ID column — the SpeciesID).
    .\.github\skills\add-achievement-data\_lookup_pet_speciesid.ps1
    
    Output: <Name>|CreatureID=<id>|SpeciesID=<id> (or NOTFOUND).
  3. Pass the SpeciesID value into the builder: Ach(42319):Pet(4901), -- Azsuna (Pet: Fledgling Warden's Companion).
  4. 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's ID, then /dbc/?dbc=battlepetspecies&build=<build>&locale=enUS#page=1&colFilter[3]=exact:<creatureId> to find its ID (SpeciesID).
  5. 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.

  1. Get the achievement's Reward_lang from the DB, e.g. "Mount: Stormtouched Bruffalon". Strip the "Mount: " prefix to get the mount name.
  2. 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 $build if needed) via replace_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.

SkillInstallsUpdatedSafetyDifficulty
add-achievement-data (this skill)01moNo flagsAdvanced
streamlit869moNo flagsIntermediate
jupyter-notebook306moReviewIntermediate
backtesting-frameworks172moNo flagsAdvanced

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

86239

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.

30158

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.

17126

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.

17110

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.

7117

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.

6116

Search skills

Search the agent skills registry