Metadata-Version: 2.4
Name: pack-doctor
Version: 1.0.0
Summary: Finds the IDs your Minecraft modpack references that no installed mod registers -- dead IDs in quests, KubeJS scripts and datapacks.
Author: Jakoby Tuckta
License: LicenseRef-Proprietary-Free-Edition
Project-URL: Homepage, https://github.com/jaakoby/pack-doctor
Project-URL: Documentation, https://jaakoby.github.io/fix/
Project-URL: Source, https://github.com/jaakoby/pack-doctor
Keywords: minecraft,modpack,kubejs,datapack,forge,neoforge,modded-minecraft,modpack-development,validation,ftbquests
Classifier: Development Status :: 4 - Beta
Classifier: Environment :: Console
Classifier: Intended Audience :: System Administrators
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Topic :: Games/Entertainment
Classifier: Topic :: System :: Monitoring
Classifier: Topic :: Utilities
Requires-Python: >=3.8
Description-Content-Type: text/markdown
License-File: LICENSE.txt
Dynamic: license-file

# pack-doctor

**The IDs in your modpack that silently do nothing**

A quest that rewards `yourpack:cooked_caned_fish`. A diet tag
pointing at `cooked_canned_rabit_soup`. A recipe for an item from a
mod you removed last week.

None of these crash. None of them log an error. They quietly give
the player nothing, and you find out when someone complains three
weeks later.

```
$ pack-doctor check "MyServer/mods" --against "MyServer/kubejs"

  mods indexed      233
  known IDs         14794  (188 defined by the pack itself)

IDS THAT MATCH NOTHING INSTALLED — 3 ID(s)
------------------------------------------------------------

  yourpack:cooked_caned_fish
      server_scripts/tags/diet.js:45

  yourpack:cooked_canned_rabit_soup
      server_scripts/tags/diet.js:46

  yourpack:stampler
      startup_scripts/removals.js:368
```

It reads every jar in your mods folder, builds an index of every ID
that actually exists, then checks every ID your datapacks, KubeJS
scripts, quests and configs reference against it. An ID that matches
nothing installed is doing nothing, and you can confirm that
yourself in a few seconds.

It also knows that **KubeJS startup scripts register new content**,
so the items your own pack creates are not reported as dead.

### It also reports

**NAMESPACES WITH NO INSTALLED MOD** -- grouped with a reference
count rather than listed one by one. Some are genuinely missing
mods. Others are group names a mod's own script API invents; KubeJS
does this constantly. You judge.

### Honest limits

- IDs come from translation keys. That covers every item, block and
  entity a player can see, but a registry entry with no lang key
  cannot be confirmed either way, and lands in UNVERIFIED
  (`--verbose`) rather than being called dead.
- It reads what the files say, not what the game does. It cannot
  know a recipe is unreachable or a quest unwinnable.
- `forge:` and `c:` are skipped -- those are tag namespaces, and
  treating them as registries produced nothing but noise.

## Install

```bash
pip install pack-doctor
```

One module, Python 3.8+, **no dependencies** -- it imports nothing outside the standard library.

## More

**What the paid edition adds:** the suggestion engine -- *"did you
mean `cooked_canned_fish`?"* -- and the confidence tiering that
keeps fuzzy-match noise out of the list. On a real 233-mod pack that
was the difference between 169 candidates and 63 worth reading.
Knowing an ID is dead is worth having for free; being handed the ID
you meant, without wading through false positives, is the paid part.

Developed against two real servers: 92 jars / 9,635 IDs and 233 jars
/ 14,755 IDs. Comparing ID *paths* rather than whole IDs matters --
a shared namespace inflates every similarity score.

Diagnostic pages for every finding: <https://jaakoby.github.io/fix/>
Source: <https://github.com/jaakoby/pack-doctor>
Full edition: <https://kaiven.gumroad.com/l/pack-doctor>

---

*Built by Jakoby Tuckta with Claude. Every claim above is something the tool does on a real log; see the repo's tests.*
