Refactor project structure and update documentation

- Migrated data files to 'data/collection/' and 'data/decks/'.
- Moved 'card_cache.json' to 'cache/'.
- Reorganized 'collection_hydrated/' and 'deck_analysis.json' into 'output/'.
- Updated 'hydrate.py' and script defaults to match the new paths.
- Updated 'README.template.md' and 'AGENTS.template.md' templates.
- Regenerated 'README.md' and 'AGENTS.md'.
This commit is contained in:
Tuan-Dat Tran
2026-02-26 14:51:48 +01:00
parent c6b1a11ebe
commit eea3a6a659
28 changed files with 328 additions and 1126 deletions

View File

@@ -27,21 +27,24 @@ python scripts/analyze_decks.py --help
```
├── hydrate.py # Main CLI - fetches card data from Scryfall
├── card_cache.json # Local cache of Scryfall card data
├── deck_analysis.json # Analysis output
├── collection/ # Raw decklist text files
├── collection_hydrated/ # Enriched card data by type
── deck.json # All cards combined
├── commander.json
│ ├── creatures.json
├── instants.json
├── sorceries.json
├── artifacts.json
├── enchantments.json
├── lands.json
── planeswalkers.json
├── decks/ # Deck definitions (JSON)
│ └── <deck_name>.json # name, commander, colors, archetype, cards
├── cache/
│ └── card_cache.json # Local cache of Scryfall card data
├── output/
│ ├── deck_analysis.json # Analysis output
── hydrated/ # Enriched card data by type
├── deck.json # All cards combined
├── commander.json
├── creatures.json
├── instants.json
├── sorceries.json
├── artifacts.json
├── enchantments.json
── lands.json
│ └── planeswalkers.json
├── data/
│ ├── collection/ # Raw decklist text files
│ └── decks/ # Deck definitions (JSON)
│ └── <deck_name>.json # name, commander, colors, archetype, cards
├── scripts/
│ ├── analyze_decks.py # Find upgrade options for decks
│ ├── find_synergies.py # Search for synergistic cards
@@ -53,7 +56,7 @@ python scripts/analyze_decks.py --help
## Data Formats
### Deck JSON (`decks/*.json`)
### Deck JSON (`data/decks/*.json`)
```json
{
@@ -68,7 +71,7 @@ python scripts/analyze_decks.py --help
}
```
### Card Data (`collection_hydrated/*.json`)
### Card Data (`output/hydrated/*.json`)
Array of card objects with Scryfall fields:
- `name`, `mana_cost`, `cmc`, `colors`, `color_identity`
@@ -79,7 +82,7 @@ Array of card objects with Scryfall fields:
### Adding a New Deck
1. Create `decks/<name>.json` with required fields
1. Create `data/decks/<name>.json` with required fields
2. Run `python scripts/update_docs.py` to regenerate documentation
### Adding a New Script
@@ -102,4 +105,4 @@ Array of card objects with Scryfall fields:
| Choco | UGW | Choco, Seeker of Paradise | Bird Tribal Landfall |
| Hazel | BG | Hazel of the Rootbloom | Golgari Aristocrats |
| Palamecia | UR | The Emperor of Palamecia // The Lord Master of Hell | Izzet Self-Mill Storm |
| Yshtola | UBW | Y'shtola, Night's Blessed | Esper Stax Drain |
| Yshtola | UBW | Y'shtola, Night's Blessed | Esper Stax Drain |

View File

@@ -22,7 +22,7 @@ No dependencies required - pure Python 3 standard library.
Fetch card data from Scryfall for a decklist:
```bash
python hydrate.py hydrate collection/decklist.txt -o collection_hydrated/ -c card_cache.json
python hydrate.py hydrate data/collection/decklist.txt -o output/hydrated/ -c cache/card_cache.json
```
### Create a New Deck
@@ -36,7 +36,7 @@ python hydrate.py new my_deck
Find upgrade options from your collection:
```bash
python scripts/analyze_decks.py --collection collection_hydrated/deck.json --deck-dir decks/
python scripts/analyze_decks.py --collection output/hydrated/deck.json --deck-dir data/decks/
```
### Find Synergies
@@ -45,19 +45,19 @@ Search for cards by keywords, colors, and type:
```bash
# Find landfall cards in Simic colors
python scripts/find_synergies.py --collection collection_hydrated/deck.json --colors U G --keywords landfall
python scripts/find_synergies.py --collection output/hydrated/deck.json --colors U G --keywords landfall
# Find Bird creatures in Bant colors
python scripts/find_synergies.py --collection collection_hydrated/deck.json --colors U G W --creature-type Bird
python scripts/find_synergies.py --collection output/hydrated/deck.json --colors U G W --creature-type Bird
# Find instants with CMC 2 or less
python scripts/find_synergies.py --collection collection_hydrated/deck.json --type instant --cmc-max 2
python scripts/find_synergies.py --collection output/hydrated/deck.json --type instant --cmc-max 2
```
### Generate Reports
```bash
python scripts/deck_report.py --collection collection_hydrated/deck.json --decks-dir decks/ --output report.md
python scripts/deck_report.py --collection output/hydrated/deck.json --decks-dir data/decks/ --output output/report.md
```
## Decks
@@ -73,10 +73,10 @@ python scripts/deck_report.py --collection collection_hydrated/deck.json --decks
### Quick Reference
1. **Import** - Place text decklists in `collection/`
2. **Hydrate** - Run `hydrate.py` to fetch Scryfall data → `collection_hydrated/`
1. **Import** - Place text decklists in `data/collection/`
2. **Hydrate** - Run `hydrate.py` to fetch Scryfall data → `output/hydrated/`
3. **Explore** - Find synergies and commanders in your collection
4. **Define** - Create deck JSON files in `decks/`
4. **Define** - Create deck JSON files in `data/decks/`
5. **Analyze** - Run `analyze_decks.py` to find upgrade options
6. **Report** - Use `deck_report.py` for markdown summaries
@@ -86,7 +86,7 @@ python scripts/deck_report.py --collection collection_hydrated/deck.json --decks
### Step 1: Import Your Collection
Create a text file in `collection/` with your cards (one per line):
Create a text file in `data/collection/` with your cards (one per line):
```
1 Sol Ring (CMA) 1
@@ -103,13 +103,13 @@ The set code and collector number are optional but help with accuracy.
Fetch card data from Scryfall:
```bash
python hydrate.py hydrate collection/my_cards.txt -o collection_hydrated/ -c card_cache.json
python hydrate.py hydrate data/collection/my_cards.txt -o output/hydrated/ -c cache/card_cache.json
```
This creates:
- `collection_hydrated/deck.json` - All cards with full data
- `collection_hydrated/creatures.json` - Creatures only
- `collection_hydrated/instants.json`, `sorceries.json`, etc.
- `output/hydrated/deck.json` - All cards with full data
- `output/hydrated/creatures.json` - Creatures only
- `output/hydrated/instants.json`, `sorceries.json`, etc.
### Step 3: Explore Your Collection
@@ -118,7 +118,7 @@ This creates:
python -c "
import json
from collections import Counter
cards = json.load(open('collection_hydrated/deck.json'))
cards = json.load(open('output/hydrated/deck.json'))
colors = Counter(c for card in cards for c in card.get('color_identity', []))
for c, n in colors.most_common(): print(f'{c}: {n}')
"
@@ -126,29 +126,29 @@ for c, n in colors.most_common(): print(f'{c}: {n}')
**Find creature types you own:**
```bash
python scripts/find_synergies.py --collection collection_hydrated/deck.json --creature-type Elf
python scripts/find_synergies.py --collection collection_hydrated/deck.json --creature-type Elemental
python scripts/find_synergies.py --collection output/hydrated/deck.json --creature-type Elf
python scripts/find_synergies.py --collection output/hydrated/deck.json --creature-type Elemental
```
**Find cards by keyword/mechanic:**
```bash
# Find all landfall cards
python scripts/find_synergies.py --collection collection_hydrated/deck.json --keywords landfall
python scripts/find_synergies.py --collection output/hydrated/deck.json --keywords landfall
# Find lifegain synergies
python scripts/find_synergies.py --collection collection_hydrated/deck.json --keywords "gain life"
python scripts/find_synergies.py --collection output/hydrated/deck.json --keywords "gain life"
# Find -1/-1 counter cards
python scripts/find_synergies.py --collection collection_hydrated/deck.json --keywords "-1/-1 counter"
python scripts/find_synergies.py --collection output/hydrated/deck.json --keywords "-1/-1 counter"
```
**Find cards by color identity:**
```bash
# Simic (UG) cards
python scripts/find_synergies.py --collection collection_hydrated/deck.json --colors U G
python scripts/find_synergies.py --collection output/hydrated/deck.json --colors U G
# Esper (WUB) instants
python scripts/find_synergies.py --collection collection_hydrated/deck.json --colors W U B --type instant
python scripts/find_synergies.py --collection output/hydrated/deck.json --colors W U B --type instant
```
### Step 4: Choose a Commander
@@ -160,7 +160,7 @@ Based on your collection strengths, pick a commander that matches:
### Step 5: Create the Deck File
Create `decks/<deck_name>.json`:
Create `data/decks/<deck_name>.json`:
```json
{
@@ -181,7 +181,7 @@ Create `decks/<deck_name>.json`:
Find cards in your collection that fit your deck:
```bash
python scripts/analyze_decks.py --collection collection_hydrated/deck.json --deck-dir decks/
python scripts/analyze_decks.py --collection output/hydrated/deck.json --deck-dir data/decks/
```
This compares your deck against your collection and suggests:
@@ -192,7 +192,7 @@ This compares your deck against your collection and suggests:
### Step 7: Generate a Report
```bash
python scripts/deck_report.py --collection collection_hydrated/deck.json --decks-dir decks/ --output report.md
python scripts/deck_report.py --collection output/hydrated/deck.json --decks-dir data/decks/ --output output/report.md
```
---
@@ -201,17 +201,17 @@ python scripts/deck_report.py --collection collection_hydrated/deck.json --decks
```bash
# 1. Add your collection
echo "1 Ashling, Rekindled // Ashling, Rimebound (ECL) 124" >> collection/my_cards.txt
echo "1 Ashling, Rekindled // Ashling, Rimebound (ECL) 124" >> data/collection/my_cards.txt
# 2. Hydrate
python hydrate.py hydrate collection/my_cards.txt -o collection_hydrated/ -c card_cache.json
python hydrate.py hydrate data/collection/my_cards.txt -o output/hydrated/ -c cache/card_cache.json
# 3. Find red instants/sorceries (spellslinger support)
python scripts/find_synergies.py --collection collection_hydrated/deck.json --colors R --type instant
python scripts/find_synergies.py --collection collection_hydrated/deck.json --colors R --type sorcery
python scripts/find_synergies.py --collection output/hydrated/deck.json --colors R --type instant
python scripts/find_synergies.py --collection output/hydrated/deck.json --colors R --type sorcery
# 4. Create deck file
cat > decks/ashling.json << 'EOF'
cat > data/decks/ashling.json << 'EOF'
{
"name": "Ashling Spellslinger",
"commander": "Ashling, Rekindled // Ashling, Rimebound",
@@ -222,7 +222,7 @@ cat > decks/ashling.json << 'EOF'
EOF
# 5. Analyze and find synergies
python scripts/analyze_decks.py --collection collection_hydrated/deck.json --deck-dir decks/
python scripts/analyze_decks.py --collection output/hydrated/deck.json --deck-dir data/decks/
```
---
@@ -235,24 +235,24 @@ If you opened new packs and want to add cards:
```bash
# 1. Create a new file with the new cards
cat > collection/new_cards_2026-02-20.txt << 'EOF'
cat > data/collection/new_cards_2026-02-20.txt << 'EOF'
1 Bre of Clan Stoutarm (ECL) 8
3 Mulldrifter (ECC) 67
1 Sol Ring (ECC) 57
EOF
# 2. Hydrate the new file (merges into existing cache)
python hydrate.py hydrate collection/new_cards_2026-02-20.txt -o collection_hydrated/ -c card_cache.json
python hydrate.py hydrate data/collection/new_cards_2026-02-20.txt -o output/hydrated/ -c cache/card_cache.json
```
### Scenario 2: Add Cards to Existing File
```bash
# Append to existing collection file
echo "1 The Reaper, King No More (ECC) 4" >> "collection/Box1 2026-01-30.txt"
echo "1 The Reaper, King No More (ECC) 4" >> "data/collection/Box1 2026-01-30.txt"
# Re-hydrate that file
python hydrate.py hydrate "collection/Box1 2026-01-30.txt" -o collection_hydrated/ -c card_cache.json
python hydrate.py hydrate "data/collection/Box1 2026-01-30.txt" -o output/hydrated/ -c cache/card_cache.json
```
### Scenario 3: Merge Multiple Collection Files
@@ -261,12 +261,12 @@ If you have multiple files to combine:
```bash
# Hydrate each file separately (cache persists)
python hydrate.py hydrate collection/Box1.txt -o collection_hydrated/ -c card_cache.json
python hydrate.py hydrate collection/Box2.txt -o collection_hydrated/ -c card_cache.json
python hydrate.py hydrate data/collection/Box1.txt -o output/hydrated/ -c cache/card_cache.json
python hydrate.py hydrate data/collection/Box2.txt -o output/hydrated/ -c cache/card_cache.json
# Note: Each run overwrites deck.json. To merge, combine files first:
cat collection/Box1.txt collection/Box2.txt > collection/combined.txt
python hydrate.py hydrate collection/combined.txt -o collection_hydrated/ -c card_cache.json
cat data/collection/Box1.txt data/collection/Box2.txt > data/collection/combined.txt
python hydrate.py hydrate data/collection/combined.txt -o output/hydrated/ -c cache/card_cache.json
```
### Scenario 4: Re-hydrate Entire Collection
@@ -275,11 +275,11 @@ If cache is corrupted or you want fresh data:
```bash
# Option A: Keep cache, just re-run
python hydrate.py hydrate collection/combined.txt -o collection_hydrated/ -c card_cache.json
python hydrate.py hydrate data/collection/combined.txt -o output/hydrated/ -c cache/card_cache.json
# Option B: Clear cache and fetch fresh (slow, ~100ms per unique card)
rm card_cache.json
python hydrate.py hydrate collection/combined.txt -o collection_hydrated/ -c card_cache.json
rm cache/card_cache.json
python hydrate.py hydrate data/collection/combined.txt -o output/hydrated/ -c cache/card_cache.json
```
### Scenario 5: Update After Set Release
@@ -288,16 +288,16 @@ When a new set releases and you want to add those cards:
```bash
# 1. Add new set cards to collection file
echo "# Lorwyn Eclipsed - 2026-01-23" >> collection/my_collection.txt
cat collection/new_ecl_cards.txt >> collection/my_collection.txt
echo "# Lorwyn Eclipsed - 2026-01-23" >> data/collection/my_collection.txt
cat data/collection/new_ecl_cards.txt >> data/collection/my_collection.txt
# 2. Hydrate (cache speeds up existing cards, fetches new ones)
python hydrate.py hydrate collection/my_collection.txt -o collection_hydrated/ -c card_cache.json
python hydrate.py hydrate data/collection/my_collection.txt -o output/hydrated/ -c cache/card_cache.json
# 3. Verify new cards are present
python -c "
import json
cards = json.load(open('collection_hydrated/deck.json'))
cards = json.load(open('output/hydrated/deck.json'))
print(f'Total unique cards: {len(cards)}')
"
```
@@ -331,7 +331,7 @@ If the same card appears multiple times in your file, they're stored separately.
python -c "
from collections import Counter
cards = Counter()
with open('collection/my_cards.txt') as f:
with open('data/collection/my_cards.txt') as f:
for line in f:
line = line.strip()
if line and not line.startswith('#'):
@@ -342,7 +342,7 @@ with open('collection/my_cards.txt') as f:
cards[name.split('(')[0].strip()] += count
for name, count in sorted(cards.items()):
print(f'{count} {name}')
" > collection/deduped.txt
" > data/collection/deduped.txt
```
**Slow hydration:**
@@ -365,4 +365,4 @@ for name, count in sorted(cards.items()):
---
*This file is auto-generated. Edit `docs/templates/README.template.md` instead.*
*This file is auto-generated. Edit `docs/templates/README.template.md` instead.*

View File

@@ -1,866 +0,0 @@
1x Giant Koi
1x Grappling Kraken
1x Stratosoarer
1x Doc Ock, Sinister Scientist
1x Hraesvelgr of the First Brood
1x Summon: Shiva
1x Pestered Wellguard
1x Wanderwine Distracter
1x Alphinaud Leveilleur
1x Kukemssa Serpent
1x Surveillance Monitor
1x Enduring Curiosity
1x Kulrath Mystic
1x Glamermite
1x Nebelgast Herald
1x Quistis Trepe
1x Erudite Wizard
1x The Mechanist, Aerial Artisan
1x Jill, Shiva's Dominant // Shiva, Warden of Ice
1x Gogo, Master of Mimicry
1x Fear of Isolation
1x Il Mheg Pixie
1x Agent of Kotis
1x Hypnotic Sprite // Mesmeric Glare
1x Tiger-Seal
1x Kithkeeper
1x Salt Road Packbeast
1x Beatrix, Loyal General
1x Sun-Dappled Celebrant
1x Summon: Good King Mog XII
1x Master Piandao
1x Kalonian Twingrove
1x Thancred Waters
1x Minwu, White Mage
1x Friendly Ghost
1x Daily Bugle Reporters
1x Unsettling Twins
1x Kyoshi Warriors
1x Summon: Primal Garuda
1x Rosa, Resolute White Mage
1x Dragonback Lancer
4x Weapons Vendor
1x Gallant Fowlknight
1x Shore Lurker
1x Anafenza, Unyielding Lineage
1x Tempest Hawk
1x Summon: Choco/Mog
1x Arachne, Psionic Weaver
1x Dazzling Angel
1x Flight-Deck Coordinator
1x Earth Kingdom Jailer
1x Aerith Gainsborough
1x Alisaie Leveilleur
1x Glider Kids
3x Gaelicat
2x Reluctant Dounguard
1x Meanders Guide
1x Tributary Vaulter
1x Sunpearl Kirin
1x Bearer of Glory
1x Flash Thompson, Spider-Fan
1x Tataru Taru
1x Jeong Jeong's Deserters
1x Hildibrand Manderville // Gentleman's Rise
2x Ambrosia Whiteheart
4x Coeurl
1x Timid Shieldbearer
1x Encumbered Reejerey
1x Veteran Survivor
1x Mardu Devotee
1x Momo, Friendly Flier
1x Curious Farm Animals
2x Valkyrie Aerial Unit
2x Ice Flan
3x Rook Turret
2x Venser, Shaper Savant
2x Qiqirn Merchant
8x Dragoon's Wyvern
3x Sahagin
3x Scorpion Sentinel
2x G'raha Tia
4x Cloudbound Moogle
2x Delivery Moogle
2x Compassionate Healer
3x Adelbert Steiner
6x Dwarven Castle Guard
2x Magitek Infantry
1x Zodiark, Umbral God
1x Feral Deathgorger // Dusk Sight
1x Basilica Stalker
1x Spectral Snatcher
1x Canyon Crawler
1x Perigee Beckoner
1x Venom, Evil Unleashed
1x Stinging Scorpion
1x Blighted Blackthorn
1x Syr Konrad, the Grim
1x Zenos yae Galvus // Shinryu, Transcendent Rival
1x Jecht, Reluctant Guardian // Braska's Final Aeon
1x Dashing Bloodsucker
1x Crypt Feaster
1x Gravblade Heavy
1x Buzzard-Wasp Colony
1x Soul-Shackled Zombie
1x Dawnhand Eulogist
1x Dream Seizer
1x Nightmare Sower
1x Vincent Valentine // Galian Beast
1x Shambling Cie'th
1x Plaguecrafter
1x Archghoul of Thraben
1x Fang, Fearless l'Cie
1x Hog-Monkey
1x Pirate Peddlers
1x Moonglove Extractor
1x Heirloom Auntie
1x Gnarlbark Elm
1x Retched Wretch
1x June, Bounty Hunter
1x Merchant of Many Hats
1x Mai, Scornful Striker
1x Corrupt Court Official
1x Burglar Rat
1x Reno and Rude
1x Demon Wall
1x Unburied Earthcarver
1x Scarblade Scout
1x Boggart Prankster
1x Bile-Vial Boggart
2x Summon: Primal Odin
2x Malboro
2x Beetle-Headed Merchants
4x Namazu Trader
2x Gaius van Baelsar
2x Qutrub Forayer
3x Ahriman
3x Shinra Reinforcements
2x Fire Nation Engineer
2x Wolfbat
3x Al Bhed Salvagers
3x Undercity Dire Rat
5x Hecteyes
1x Kulrath Zealot
1x Gilgamesh, Master-at-Arms
1x Mongoose Lizard
1x Boilerbilges Ripper
1x Razorkin Hordecaller
1x Sandworm
1x Combustion Man
1x Meticulous Artisan
1x Sower of Chaos
1x Wartime Protestors
1x Gogo, Mysterious Mime
1x Flamekin Gildweaver
1x Tersa Lightshatter
1x Vicious Clown
1x Frontline War-Rager
1x Spider-Gwen, Free Spirit
1x Lightning, Security Sergeant
1x Summon: G.F. Cerberus
1x Boar-q-pine
1x Brambleback Brute
1x Brazen Scourge
1x Deserter's Disciple
1x Yuyan Archers
1x Blood Petal Celebrant
1x Axgard Cavalry
1x Shock Brigade
1x Taxi Driver
1x Firebrand Archer
1x Explosive Prodigy
1x Flame-Chain Mauler
2x Hill Gigas
2x Boldwyr Aggressor
2x Barret Wallace
2x Spider-Islanders
2x Fire Nation Raider
2x Mysidian Elder
2x Superior Foes of Spider-Man
2x Queen Brahne
4x Summon: G.F. Ifrit
2x Enraged Flamecaster
2x Sabotender
2x Tiger-Dillo
7x Item Shopkeep
2x Gristle Glutton
3x Blazing Bomb
2x Freya Crescent
1x Wildwood Scourge
1x Diamond Weapon
1x Coliseum Behemoth
1x Slavering Branchsnapper
1x Spider-Rex, Daring Dino
1x Apothecary Stomper
1x Badgermole
1x Safewright Cavalry
1x The Boulder, Ready to Rumble
1x Cackling Prowler
1x Damage Control Crew
1x Festerhide Boar
1x Rainveil Rejuvenator
1x Trystan, Callous Cultivator // Trystan, Penitent Culler
1x Vinebred Brawler
1x Ostrich-Horse
1x Supportive Parents
1x Cryptid Inspector
1x Tireless Tracker
1x Lys Alana Informant
1x Lys Alana Dignitary
1x Town Greeter
1x Sultai Devotee
1x Rebellious Captives
1x Hinterland Logger // Timber Shredder
1x House Cartographer
1x Tunnel Tipster
1x Virulent Emissary
1x Spider-Ham, Peter Porker
1x Cactuar
1x Llanowar Elves
3x Balamb T-Rexaur
2x Summon: Fat Chocobo
2x Vanille, Cheerful l'Cie
6x Gigantoad
2x Crossroads Watcher
2x Walltop Sentries
3x Loporrit Scout
3x Summon: Fenrir
2x Great Forest Druid
2x Goobbue Gardener
2x Kraven's Cats
2x Turtle-Duck
2x Gran Pulse Ochu
1x Reputable Merchant
1x Monastery Messenger
1x G'raha Tia, Scion Reborn
1x Rhino, Barreling Brute
1x Vibrance
1x Huntmaster of the Fells // Ravager of the Fells
1x Uncle Iroh
1x Rydia, Summoner of Mist
1x Stoic Grove-Guide
1x Dai Li Agents
1x Jenova, Ancient Calamity
1x Stalwart Successor
1x Lluwen, Imperfect Naturalist
1x Shadow Urchin
1x Chaos Spewer
1x Black Waltz No. 3
1x Vial Smasher the Fierce
1x Zuko, Conflicted
1x Omega, Heartless Evolution
1x Guru Pathik
1x Clement, the Worrywort
1x Hermitic Herbalist
1x Platypus-Bear
1x Twinflame Travelers
1x Twinflame Travelers
1x Sanar, Innovative First-Year
2x Shantotto, Tactician Magician
1x Flaring Cinder
1x Ashling, Rekindled // Ashling, Rimebound
2x The Emperor of Palamecia // The Lord Master of Hell
1x Balmor, Battlemage Captain
1x Azula, Cunning Usurper
1x Ultimecia, Time Sorceress // Ultimecia, Omnipotent
1x Messenger Hawk
1x Emet-Selch, Unsundered // Hades, Sorcerer of Eld
1x Locke Cole
1x Suki, Kyoshi Warrior
1x Good-Fortune Unicorn
1x Serah Farron // Crystallized Serah
1x Wary Farmer
1x Garnet, Princess of Alexandria
1x Catharsis
1x Cloud, Planet's Champion
1x Sami, Ship's Engineer
1x Feisty Spikeling
1x Eirdu, Carrier of Dawn // Isilu, Carrier of Twilight
1x Estinien Varlineau
1x Prideful Feastling
1x Ardbert, Warrior of Darkness
1x Merrow Skyswimmer
1x Wraith, Vicious Vigilante
1x Lyse Hext
1x Tidus, Blitzball Star
1x Deepchannel Duelist
1x Urianger Augurelt
2x Gladiolus Amicitia
2x Balthier and Fran
3x Cloud of Darkness
2x Exdeath, Void Warlock // Neo Exdeath, Dimension's End
2x Boggart Cursecrafter
2x Garland, Knight of Cornelia // Chaos, the Endless
2x Ignis Scientia
2x Mischievous Sneakling
2x Voracious Tome-Skimmer
2x Rinoa Heartilly
2x Giott, King of the Dwarves
2x Private Eye
1x Red Herring
1x Abundant Maw
1x Relentless X-ATM092
1x Rooftop Percher
1x Palladium Myr
1x Changeling Wayfinder
1x Spider-Bot
1x Campus Guide
2x Iron Giant
7x Magic Pot
2x Mechanical Mobster
2x Embermouth Sentinel
2x Chocobo Racetrack
1x The Fire Crystal
1x Chaos Shrine's Black Crystal
1x Cryogen Relic
1x Phoenix Down
1x Coveted Jewel
1x Firdoch Core
1x Puca's Eye
1x Talisman of Dominance
1x Ravenous Amulet
1x Tome of Legends
3x Sol Ring
2x Everflowing Chalice
9x White Auracite
3x Blitzball
4x Instant Ramen
3x World Map
3x Lunatic Pandora
1x Genji Glove
2x Black Mage's Rod
1x Barbed Bloodletter
2x Blue Mage's Cane
1x Dragoon's Lance
1x Ultima Weapon
1x Leyline Axe
1x Butcher's Cleaver
2x Whispersilk Cloak
1x Monk's Fist
1x Cobbled Wings
1x Kyoshi Battle Fan
2x Swiftfoot Boots
1x Spider-Suit
1x Thinking Cap
1x Excalibur II
1x Phantom Train
1x Invasion Submersible
1x Cargo Ship
1x Smuggler's Copter
1x Subway Train
3x Bard's Bow
5x Warrior's Sword
5x Samurai's Katana
4x Red Mage's Rapier
3x Coral Sword
4x Dark Knight's Greatsword
4x Sage's Nouliths
3x Astrologian's Planisphere
3x Paladin's Arms
4x White Mage's Staff
2x Crystal Fragments // Summon: Alexander
2x The Masamune
2x Stalactite Dagger
2x The Prima Vista
3x Magitek Armor
1x Disturbing Mirth
1x Eusocial Engineering
1x Wall Crawl
1x Gilt-Leaf's Embrace
1x Campsite Cuisine
1x Triple Triad
1x Breaching Dragonstorm
1x Connecting the Dots
1x Meathook Massacre II
1x Boggart Mischief
1x Cracked Skull
1x Bastion of Remembrance
1x Eye of Nidhogg
1x Mornsong Aria
1x Corroding Dragonstorm
1x Northern Air Temple
1x Sidequest: Card Collection // Magicked Card
1x Meat Locker // Drowned Diner
1x Spider-Man No More
1x Security Bypass
1x Roiling Dragonstorm
1x Blossombind
1x Noggle the Mind
1x Aquitect's Defenses
1x Watery Grasp
1x Sleep Magic
1x Witness Protection
1x Ringing Strike Mastery
1x Kinbinding
1x Southern Air Temple
1x Clachan Festival
1x Spiral into Solitude
1x Evershrike's Gift
2x Kraven's Last Hunt
2x Prismatic Undercurrents
3x Ride the Shoopuf
2x Sidequest: Play Blitzball // World Champion, Celestial Weapon
2x Liminal Hold
2x Sidequest: Catch a Fish // Cooking Campsite
2x Due Diligence
1x Dragonclaw Strike
1x Trystan's Command
1x Grub's Command
1x Pumpkin Bombardment
1x Lie in Wait
1x Brigid's Command
1x Rydia's Return
1x Bite Down on Crime
1x Earthbending Lesson
2x Reach the Horizon
1x Tend the Sprigs
1x Shattered Wings
1x Scout the City
2x Chocobo Kick
1x Clash of the Eikons
1x Clash of the Eikons
1x Choco-Comet
1x Terminal Velocity
1x Unexpected Request
1x Light Up the Stage
1x Boulder Dash
1x Jet's Brainwashing
1x Killing Wave
1x Bloodline Bidding
1x Evil Reawakened
1x Crux of Fate
2x Circle of Power
1x The Final Days
2x Risky Research
1x Temporal Intervention
1x Extract a Confession
1x Bogslither's Embrace
1x Reanimate
1x Wanderwine Farewell
1x Waterbending Lesson
1x Lingering Souls
1x Cut a Deal
4x Gysahl Greens
4x Commune with Beavers
2x Random Encounter
2x Call the Mountain Chocobo
3x Suplex
2x Impolite Entrance
2x Cinder Strike
3x Venom's Hunger
2x Darkness Descends
2x Poison the Waters
2x Dai Li Indoctrination
4x Resentful Revelation
2x Retrieve the Esper
2x Temporal Cleansing
3x Relm's Sketching
3x Combat Tutorial
2x Boomerang Basics
2x The Crystal's Chosen
3x Aerith Rescue Mission
2x From Father to Son
2x Aang's Journey
1x Auroral Procession
1x Perennation
1x Abandon Attachments
2x Prishe's Wanderings
1x Cycle of Renewal
1x Unforgiving Aim
1x Origin of Metalbending
1x Rocky Rebuke
1x Heritage Reclamation
1x Close Encounter
1x Midnight Tilling
1x Giant Growth
1x Caught Red-Handed
1x Impossible Inferno
1x Judgment Bolt
1x Seize Opportunity
1x Tweeze
1x Laughing Mad
1x Lightning Strike
1x Firebending Lesson
2x Fire Magic
1x Murder
1x Alesha's Legacy
1x Fatal Fissure
2x Vincent's Limit Break
1x Fatal Push
1x Scarblade's Malice
1x Into the Story
2x Sublime Epiphany
1x Unexpected Assistance
1x Uncharted Voyage
1x Glimmerburst
1x Scour for Scrap
1x Swat Away
1x Faebloom Trick
1x Don't Make a Sound
1x It'll Quench Ya!
1x Dreams of Laguna
1x Backslide
1x Accumulate Wisdom
1x Whoosh!
1x Run Away Together
1x Wild Unraveling
1x Get Out
1x Long River's Pull
1x Stolen Uniform
1x Claws Out
1x Moogles' Valor
1x Rally the Monastery
1x Protective Response
1x Razor Rings
1x Keep Out
1x Riverguard's Reflexes
1x Yip Yip!
1x Enter the Avatar State
1x Unwanted Remake
1x Strength of Arms
1x Zuko's Exile
3x Airship Crash
2x Allies at Last
2x Sarkhan's Resolve
3x Blitzball Shot
2x Light of Judgment
2x Haste Magic
2x Cunning Maneuver
4x Thunder Magic
2x Sephiroth's Intervention
3x Fight On!
3x Vayne's Treachery
3x Syncopate
2x Lost Days
2x Eject
3x Ice Magic
2x Octopus Form
3x Magic Damper
6x Fate of the Sun-Cryst
2x Auron's Inspiration
2x Battle Menu
6x Slash of Light
3x You're Not Alone
1x Emeria Angel
1x Summon: Choco/Mog
1x Arcane Denial
1x Emeria Shepherd
1x Abandoned Air Temple
2x Prairie Stream
1x Tangled Islet
3x Reliquary Tower
1x Farseek
1x Gilded Goose
1x Restoration Magic
1x Radiant Grove
1x Tranquil Landscape
1x Suburban Sanctuary
1x Hinterland Harbor
1x Jackdaw Savior
1x Negate
1x Sazh's Chocobo
1x Balamb Garden, SeeD Academy // Balamb Garden, Airborne
2x Birds of Paradise
2x Beastmaster Ascension
1x River Hoopoe
2x Swords to Plowshares
1x Austere Command
1x Bartz and Boko
1x The Goose Mother
1x Beast Within
1x Flurry of Wings
1x Glacial Fortress
1x An Offer You Can't Refuse
1x Cultivate
1x Patchwork Banner
1x Kastral, the Windcrested
1x Restless Anchorage
2x Plains
1x Watcher of the Spheres
1x Murmuration
1x Talisman of Progress
1x Windurst, Federation Center
1x Meditation Pools
1x Demolition Field
1x Adarkar Wastes
1x Empyrean Eagle
1x Forest
1x Seaside Citadel
1x Warden of Evos Isle
2x Exotic Orchard
1x Felidar Retreat
1x Ascend from Avernus
1x Path to Exile
1x Curiosity Crafter
1x Sazh Katzroy
1x Traveling Chocobo
2x Counterspell
1x Jumbo Cactuar
1x Lifecreed Duo
2x Evolving Wilds
2x Path of Ancestry
1x Airborne Aid
1x Sharlayan, Nation of Scholars
1x Brushland
1x Plumecreed Escort
1x Summon: Fat Chocobo
1x Rampant Growth
1x Winged Portent
1x Hermes, Overseer of Elpis
1x Wingmate Roc
1x Sunpetal Grove
1x Herald's Horn
1x Kangee's Lieutenant
1x Dusk // Dawn
1x Nature's Lore
1x Terramorphic Expanse
1x Plains
1x Yavimaya Coast
1x Seaside Haven
1x Forest
1x Gwaihir the Windlord
1x City Pigeon
1x Command Tower
1x Sevinne's Reclamation
1x Kangee, Sky Warden
3x Plains
1x Sidequest: Raise a Chocobo // Black Chocobo
1x Generous Gift
4x Island
1x Canopy Vista
2x Forest
1x Choco, Seeker of Paradise
3x Plains
2x Mountain
1x Mana Geyser
1x Big Score
1x Ovika, Enigma Goliath
1x Summons of Saruman
1x Izzet Signet
1x Seize the Storm
1x Fact or Fiction
2x Ring of the Lucii
1x Elixir of Immortality
1x Drown in Dreams
1x Vivi Ornitier
1x Ultros, Obnoxious Octopus
1x Island
1x Decaying Time Loop
1x Tellah, Great Sage
1x Traumatize
1x Experimental Overload
1x Sulfur Falls
1x Abundant Growth
1x Curator's Ward
2x Curiosity
1x Snort
1x Aetherize
1x Talrand, Sky Summoner
1x Epic Experiment
2x Ur-Golem's Eye
1x Careful Consideration
1x Isengard Unleashed
1x The Rollercrusher Ride
1x Press the Enemy
1x Thousand-Year Storm
1x Fateful Showdown
1x Increasing Confusion
1x Snapcaster Mage
1x Tezzeret's Gambit
1x Command Tower
1x Shivan Reef
1x Zephid's Embrace
1x Arcane Signet
1x Drake Umbra
1x Channeled Force
1x Bond of Insight
1x Consider
1x Baron, Airship Kingdom
1x Mystic Confluence
1x Frostboil Snarl
1x Ether
1x Spellheart Chimera
1x Protective Bubble
1x Path of the Pyromancer
1x Blasphemous Act
2x Firemind Vessel
1x Pirate's Pillage
1x Rise from the Tides
1x Full Throttle
2x Rewind
1x Gandalf's Sanction
2x Hedron Archive
1x Peter Parker's Camera
1x Pinnacle Monk // Mystic Peak
1x Cut Your Losses
2x Mountain
6x Island
4x Mountain
6x Island
4x Mountain
5x Island
1x Garruk, Cursed Huntsman
1x Moldervine Reclamation
1x Chitterspitter
1x Viridescent Bog
1x Gourmand's Talent
1x Moonstone Eulogist
1x Wolfwillow Haven
1x Beledros Witherbloom
1x Ravenous Squirrel
1x Llanowar Wastes
1x Arasta of the Endless Web
1x Command Tower
1x Worthy Cost
1x Swarmyard Massacre
1x Rootcast Apprenticeship
1x Sword of the Squeak
1x Necroblossom Snarl
1x Chatterfang, Squirrel General
1x Chatterstorm
1x Gilded Goose
1x Temple of Malady
1x Golgari Rot Farm
1x Casualties of War
1x Woe Strider
1x Bojuka Bog
1x Haunted Mire
1x Hazel's Brewmaster
1x Deadly Dispute
1x Ogre Slumlord
1x Nested Shambler
1x Oran-Rief, the Vastwood
1x Terramorphic Expanse
1x Prosperous Innkeeper
1x Maelstrom Pulse
1x Jungle Hollow
1x Skullclamp
1x Plumb the Forbidden
1x Saw in Half
1x End-Raze Forerunners
1x Putrefy
1x Squirrel Sovereign
1x Toski, Bearer of Secrets
1x Insatiable Frugivore
1x Poison-Tip Archer
1x Windgrace's Judgment
1x Honored Dreyleader
1x Cache Grab
1x Tear Asunder
1x Tranquil Thicket
1x Skyfisher Spider
1x Shamanic Revelation
1x Zulaport Cutthroat
1x Nadier's Nightblade
1x Chittering Witch
1x Haywire Mite
1x Deep Forest Hermit
1x Idol of Oblivion
1x Tainted Wood
1x Barren Moor
1x Talisman of Resilience
1x Binding the Old Gods
1x Tireless Provisioner
1x Midgar, City of Mako // Reactor Raid
1x Golgari Signet
1x Morbid Opportunist
1x Swarmyard
1x Twilight Mire
1x Arcane Signet
1x Squirrel Nest
1x Maskwood Nexus
1x The Odd Acorn Gang
1x Woodland Cemetery
1x Second Harvest
1x Academy Manufactor
1x Sol Ring
1x Scurry of Squirrels
1x Decree of Pain
1x Bastion of Remembrance
1x Grim Backwoods
1x Hazel of the Rootbloom
5x Forest
4x Swamp
4x Forest
3x Swamp
1x Exotic Orchard
1x Ultima
1x Darkwater Catacombs
1x Void Rend
1x Avatar's Wrath
1x Arcane Sanctum
1x Vindicate
1x Overkill
1x Drowned Catacomb
1x Authority of the Consuls
1x School Daze
1x Cleansing Nova
1x Multiversal Passage
1x Choked Estuary
1x Exsanguinate
1x Cornered by Black Mages
1x Frantic Search
1x Evolving Wilds
1x Lethal Scheme
1x Withering Torment
1x Rite of Replication
1x Underground River
1x Archaeomancer's Map
2x Swamp
1x Vanish from Sight
1x Scavenger Grounds
1x Fetid Heath
1x Reaper's Scythe
1x Brainstorm
1x Urza's Saga
1x Krile Baldesion
1x Swamp
1x Amazing Acrobatics
1x Ash Barrens
1x Riverwalk Technique
1x Dig Through Time
1x Vote Out
1x Syphon Mind
1x Banishing Light
1x Command Beacon
1x Murderous Rider // Swift End
1x Emet-Selch of the Third Seat
1x Sunlit Marsh
1x Dancer's Chakrams
1x Skycloud Expanse
1x Sol Ring
1x Stuck in Summoner's Sanctum
1x Static Snare
1x Fandaniel, Telophoroi Ascian
1x Talisman of Hierarchy
1x Archmage Emeritus
1x Shineshadow Snarl
1x Sunken Hollow
1x Idyllic Beachfront
1x Glacial Fortress
1x Thought Vessel
1x Papalymo Totolymo
1x Path of Ancestry
1x Final Judgment
1x Torrential Gearhulk
1x Propaganda
1x Transpose
1x Snuff Out
1x Dovin's Veto
1x Archmage of Runes
1x Temple of the False God
1x Sunken Ruins
1x Observed Stasis
1x Relic of Legends
1x Contaminated Aquifer
1x Port Town
1x Demolition Field
1x Champions from Beyond
1x Baleful Strix
1x Desolate Mire
1x Isolated Chapel
1x Y'shtola, Night's Blessed
1x Barret, Avalanche Leader
1x Cloud, Midgar Mercenary
1x Wakka, Devoted Guardian
1x Elspeth, Storm Slayer

View File

@@ -1,74 +0,0 @@
1 Nameless Inversion (ECL) 113
1 Lavaleaper (ECL) 318
1 Burdened Stoneback (ECL) 8
1 Gathering Stone (ECL) 257
1 Deepchannel Duelist (ECL) 213
1 Gangly Stompling (ECL) 226
1 Merrow Skyswimmer (ECL) 234
1 Appeal to Eirdu (ECL) 5
1 Elder Auntie (ECL) 133
1 Sygg's Command (ECL) 244
1 Pitiless Fists (ECL) 187
1 Encumbered Reejerey (ECL) 14
1 Sear (ECL) 154
1 Feisty Spikeling (ECL) 223
1 Enraged Flamecaster (ECL) 135
1 Bile-Vial Boggart (ECL) 87
1 Blossombind (ECL) 45
1 Trystan, Callous Cultivator // Trystan, Penitent Culler (ECL) 199
1 Gutsplitter Gang (ECL) 106
1 Glamer Gifter (ECL) 49
1 Keep Out (ECL) 19
1 Barbed Bloodletter (ECL) 86
1 Sun-Dappled Celebrant (ECL) 37
1 Wanderwine Distracter (ECL) 82
1 Lluwen, Imperfect Naturalist (ECL) 232
1 Deceit (ECL) 212
1 Iron-Shield Elf (ECL) 108
1 Illusion Spinners (ECL) 55
1 Kindle the Inner Flame (ECL) 147
1 Mischievous Sneakling (ECL) 235
1 Stratosoarer (ECL) 72
1 Run Away Together (ECL) 67
1 Shore Lurker (ECL) 34
2 Reckless Ransacking (ECL) 152
1 Dawnhand Eulogist (ECL) 99
1 Evershrike's Gift (ECL) 15
1 Dawnhand Dissident (ECL) 311
1 Bark of Doran (ECL) 6
1 Gnarlbark Elm (ECL) 103
1 Luminollusk (ECL) 179
1 Flaring Cinder (ECL) 225
1 Dose of Dawnglow (ECL) 100
1 Ashling, Rekindled // Ashling, Rimebound (ECL) 124
1 Morcant's Eyes (ECL) 185
1 Wanderwine Farewell (ECL) 83
1 Pyrrhic Strike (ECL) 30
1 Chaos Spewer (ECL) 210
1 Blighted Blackthorn (ECL) 90
1 Great Forest Druid (ECL) 178
2 Thoughtweft Charge (ECL) 198
2 Unexpected Assistance (ECL) 80
2 Safewright Cavalry (ECL) 191
3 Bogslither's Embrace (ECL) 94
3 Riverguard's Reflexes (ECL) 33
2 Unbury (ECL) 123
3 Midnight Tilling (ECL) 182
2 Flamekin Gildweaver (ECL) 140
2 Stalactite Dagger (ECL) 261
2 Cinder Strike (ECL) 131
2 Lys Alana Informant (ECL) 181
2 Reluctant Dounguard (ECL) 31
2 Temporal Cleansing (ECL) 78
1 Loch Mare (ECL) 57
1 Sygg, Wanderwine Wisdom // Sygg, Wanderbrine Shield (ECL) 76
1 Moonglove Extractor (ECL) 109
1 Wildvine Pummeler (ECL) 203
1 Aquitect's Defenses (ECL) 44
1 Gallant Fowlknight (ECL) 17
1 Wary Farmer (ECL) 251
1 Chitinous Graspling (ECL) 211
1 Reaping Willow (ECL) 240
1 Moon-Vigil Adherents (ECL) 184
1 Dawn-Blessed Pennant (ECL) 254
1 Unwelcome Sprite (ECL) 81

View File

@@ -23,7 +23,7 @@
1 Agent of Kotis (TDM) 36
1 Hypnotic Sprite // Mesmeric Glare (FIC) 264
1 Tiger-Seal (TLA) 75
1 Kithkeeper (ECL) 23
2 Kithkeeper (ECL) 23
1 Salt Road Packbeast (TDM) 23
1 Beatrix, Loyal General (FIN) 554
2 Sun-Dappled Celebrant (ECL) 37
@@ -102,7 +102,7 @@
1 Gravblade Heavy (EOE) 102
1 Buzzard-Wasp Colony (TLA) 88
1 Soul-Shackled Zombie (FDN) 70
3 Dawnhand Eulogist (ECL) 99
4 Dawnhand Eulogist (ECL) 99
4 Dream Seizer (ECL) 101
1 Nightmare Sower (ECL) 114
1 Vincent Valentine // Galian Beast (FIN) 125
@@ -238,7 +238,7 @@
1 Huntmaster of the Fells // Ravager of the Fells (INR) 241
1 Uncle Iroh (TLA) 248
1 Rydia, Summoner of Mist (FIN) 239
2 Stoic Grove-Guide (ECL) 243
3 Stoic Grove-Guide (ECL) 243
1 Dai Li Agents (TLA) 214
1 Jenova, Ancient Calamity (FIN) 228
1 Stalwart Successor (TDM) 227
@@ -254,7 +254,7 @@
1 Hermitic Herbalist (TLA) 226
1 Platypus-Bear (TLA) 236
1 Twinflame Travelers (ECL) 345
1 Twinflame Travelers (ECL) 248
2 Twinflame Travelers (ECL) 248
1 Sanar, Innovative First-Year (ECL) 241
2 Shantotto, Tactician Magician (FIN) 241
2 Flaring Cinder (ECL) 225
@@ -292,7 +292,7 @@
2 Boggart Cursecrafter (ECL) 331
2 Garland, Knight of Cornelia // Chaos, the Endless (FIN) 221
2 Ignis Scientia (FIN) 227
2 Mischievous Sneakling (ECL) 235
3 Mischievous Sneakling (ECL) 235
2 Voracious Tome-Skimmer (ECL) 250
2 Rinoa Heartilly (FIN) 237
2 Giott, King of the Dwarves (FIN) 223
@@ -366,7 +366,7 @@
1 Disturbing Mirth (DSK) 212
1 Eusocial Engineering (EOE) 181
1 Wall Crawl (SPM) 121
5 Gilt-Leaf's Embrace (ECL) 177
6 Gilt-Leaf's Embrace (ECL) 177
1 Campsite Cuisine (FIC) 464
1 Triple Triad (FIN) 340
1 Breaching Dragonstorm (TDM) 101
@@ -394,7 +394,7 @@
1 Kinbinding (ECL) 407 *F*
1 Southern Air Temple (TLA) 36
2 Clachan Festival (ECL) 10
4 Spiral into Solitude (ECL) 36
5 Spiral into Solitude (ECL) 36
1 Evershrike's Gift (ECL) 15
2 Kraven's Last Hunt (SPM) 105
2 Prismatic Undercurrents (ECL) 189
@@ -503,7 +503,7 @@
1 Accumulate Wisdom (TLA) 44
1 Whoosh! (SPM) 48
3 Run Away Together (ECL) 67
4 Wild Unraveling (ECL) 84
5 Wild Unraveling (ECL) 84
1 Get Out (DSK) 60
1 Long River's Pull (BLB) 58
1 Stolen Uniform (FIN) 75
@@ -870,11 +870,11 @@
1 Thoughtweft Lieutenant (ECL) 343
1 Rime Chill (ECL) 64
1 Flock Impostor (ECL) 16
1 Reckless Ransacking (ECL) 152
2 Reckless Ransacking (ECL) 152
1 Requiting Hex (ECL) 116
1 Bristlebane Battler (ECL) 168
1 Sting-Slinger (ECL) 161
1 Surly Farrier (ECL) 196
2 Sting-Slinger (ECL) 161
2 Surly Farrier (ECL) 196
1 Gravelgill Scoundrel (ECL) 53
2 Omni-Changeling (ECL) 62
1 Ashling's Command (ECL) 205
@@ -883,7 +883,7 @@
1 Chomping Changeling (ECL) 172
1 Rhys, the Evermore (ECL) 32
1 Pitiless Fists (ECL) 187
1 Bark of Doran (ECL) 6
2 Bark of Doran (ECL) 6
1 Lofty Dreams (ECL) 58
1 Taster of Wares (ECL) 121
1 Tanufel Rimespeaker (ECL) 77
@@ -892,10 +892,10 @@
2 Dawn-Blessed Pennant (ECL) 254
1 Deepway Navigator (ECL) 214
1 Iron-Shield Elf (ECL) 108
2 Evolving Wilds (ECL) 264
3 Evolving Wilds (ECL) 264
2 Giantfall (ECL) 141
2 Rimekin Recluse (ECL) 66
2 Foraging Wickermaw (ECL) 256
3 Foraging Wickermaw (ECL) 256
2 Lasting Tarfire (ECL) 149
2 Elder Auntie (ECL) 133
1 Blight Rot (ECL) 89
@@ -908,25 +908,3 @@
1 Abigale, Eloquent First-Year (ECL) 204
1 Swamp (ECL) 271
1 Pallimud (TMP) 195
1 Steam Vents (ECL) 267
1 Champions of the Shoal (ECL) 46
1 End-Blaze Epiphany (ECL) 134
1 Dundoolin Weaver (ECL) 175
1 Boggart Cursecrafter (ECL) 206
1 Mirrormind Crown (ECL) 258
1 Celestial Reunion (ECL) 170
1 Morcant's Loyalist (ECL) 236
2 Assert Perfection (ECL) 164
1 Gutsplitter Gang (ECL) 106
1 Dream Harvest (ECL) 216
1 Eclipsed Kithkin (ECL) 220
1 Sizzling Changeling (ECL) 155
1 Chitinous Graspling (ECL) 211
1 Wanderbrine Preacher (ECL) 41
1 Summit Sentinel (ECL) 73
1 Mistmeadow Council (ECL) 183
1 Burning Curiosity (ECL) 129
1 Goliath Daydreamer (ECL) 143
1 Morcant's Loyalist (ECL) 341
1 Puca's Eye (ECL) 259
1 Clachan Festival (ECL) 10

View File

@@ -0,0 +1,158 @@
1 Steam Vents (ECL) 267
2 Champions of the Shoal (ECL) 46
1 End-Blaze Epiphany (ECL) 134
1 Dundoolin Weaver (ECL) 175
1 Boggart Cursecrafter (ECL) 206
1 Mirrormind Crown (ECL) 258
1 Celestial Reunion (ECL) 170
1 Morcant's Loyalist (ECL) 236
3 Assert Perfection (ECL) 164
1 Dream Harvest (ECL) 216
1 Eclipsed Kithkin (ECL) 220
2 Sizzling Changeling (ECL) 155
3 Wanderbrine Preacher (ECL) 41
3 Summit Sentinel (ECL) 73
3 Mistmeadow Council (ECL) 183
2 Burning Curiosity (ECL) 129
1 Goliath Daydreamer (ECL) 143
1 Nameless Inversion (ECL) 113
1 Lavaleaper (ECL) 318
1 Burdened Stoneback (ECL) 8
2 Gathering Stone (ECL) 257
1 Deepchannel Duelist (ECL) 213
3 Gangly Stompling (ECL) 226
2 Merrow Skyswimmer (ECL) 234
1 Appeal to Eirdu (ECL) 5
3 Elder Auntie (ECL) 133
1 Sygg's Command (ECL) 244
1 Pitiless Fists (ECL) 187
2 Encumbered Reejerey (ECL) 14
1 Feisty Spikeling (ECL) 223
2 Enraged Flamecaster (ECL) 135
1 Bile-Vial Boggart (ECL) 87
2 Blossombind (ECL) 45
1 Trystan, Callous Cultivator // Trystan, Penitent Culler (ECL) 199
1 Glamer Gifter (ECL) 49
2 Keep Out (ECL) 19
1 Barbed Bloodletter (ECL) 86
1 Sun-Dappled Celebrant (ECL) 37
2 Wanderwine Distracter (ECL) 82
1 Lluwen, Imperfect Naturalist (ECL) 232
1 Deceit (ECL) 212
1 Iron-Shield Elf (ECL) 108
1 Illusion Spinners (ECL) 55
1 Kindle the Inner Flame (ECL) 147
2 Mischievous Sneakling (ECL) 235
1 Stratosoarer (ECL) 72
2 Run Away Together (ECL) 67
2 Shore Lurker (ECL) 34
2 Reckless Ransacking (ECL) 152
2 Dawnhand Eulogist (ECL) 99
1 Evershrike's Gift (ECL) 15
1 Dawnhand Dissident (ECL) 311
1 Bark of Doran (ECL) 6
1 Gnarlbark Elm (ECL) 103
1 Luminollusk (ECL) 179
1 Flaring Cinder (ECL) 225
1 Dose of Dawnglow (ECL) 100
1 Ashling, Rekindled // Ashling, Rimebound (ECL) 124
1 Morcant's Eyes (ECL) 185
1 Wanderwine Farewell (ECL) 83
1 Pyrrhic Strike (ECL) 30
1 Chaos Spewer (ECL) 210
2 Blighted Blackthorn (ECL) 90
2 Great Forest Druid (ECL) 178
2 Thoughtweft Charge (ECL) 198
2 Unexpected Assistance (ECL) 80
2 Safewright Cavalry (ECL) 191
4 Bogslither's Embrace (ECL) 94
3 Riverguard's Reflexes (ECL) 33
2 Unbury (ECL) 123
3 Midnight Tilling (ECL) 182
2 Flamekin Gildweaver (ECL) 140
2 Stalactite Dagger (ECL) 261
2 Cinder Strike (ECL) 131
3 Lys Alana Informant (ECL) 181
2 Reluctant Dounguard (ECL) 31
2 Temporal Cleansing (ECL) 78
1 Morcant's Loyalist (ECL) 341
2 Puca's Eye (ECL) 259
1 Loch Mare (ECL) 57
1 Sygg, Wanderwine Wisdom // Sygg, Wanderbrine Shield (ECL) 76
2 Moonglove Extractor (ECL) 109
2 Wildvine Pummeler (ECL) 203
1 Aquitect's Defenses (ECL) 44
1 Gallant Fowlknight (ECL) 17
2 Wary Farmer (ECL) 251
2 Reaping Willow (ECL) 240
1 Moon-Vigil Adherents (ECL) 184
1 Dawn-Blessed Pennant (ECL) 254
1 Unwelcome Sprite (ECL) 81
1 Glen Elendra Guardian (ECL) 51
1 Thoughtweft Lieutenant (ECL) 246
1 Meek Attack (ECL) 151
1 Hallowed Fountain (ECL) 265
1 Vinebred Brawler (ECL) 201
2 Personify (ECL) 28
2 Rooftop Percher (ECL) 2
1 Blight Rot (ECL) 89
2 Liminal Hold (ECL) 24
1 Kulrath Mystic (ECL) 56
1 Crossroads Watcher (ECL) 173
1 Flame-Chain Mauler (ECL) 138
2 Scarblade's Malice (ECL) 119
1 Bitterblossom (SPG) 133
1 Rimefire Torque (ECL) 65
1 Shimmerwilds Growth (ECL) 194
2 Evolving Wilds (ECL) 264
1 Kirol, Attentive First-Year (ECL) 231
1 Shimmercreep (ECL) 120
1 Flamebraider (ECL) 139
1 Tanufel Rimespeaker (ECL) 77
2 Glamermite (ECL) 50
2 Heirloom Auntie (ECL) 107
2 Gutsplitter Gang (ECL) 106
4 Chitinous Graspling (ECL) 211
2 Sear (ECL) 154
2 Clachan Festival (ECL) 10
1 Oko, Lorwyn Liege // Oko, Shadowmoor Scion (ECL) 61
1 Selfless Safewright (ECL) 193
2 Creakwood Safewright (ECL) 96
1 Noggle Robber (ECL) 237
2 Brambleback Brute (ECL) 128
1 Dawn's Light Archer (ECL) 174
2 Feed the Flames (ECL) 137
1 Auntie's Sentence (ECL) 85
1 Kinscaer Sentry (ECL) 22
1 Spell Snare (ECL) 71
2 Virulent Emissary (ECL) 202
1 Explosive Prodigy (ECL) 136
1 Foraging Wickermaw (ECL) 256
1 Silvergill Peddler (ECL) 70
2 Goldmeadow Nomad (ECL) 18
1 Harmonized Crescendo (ECL) 54
1 Shinestriker (ECL) 68
1 Chomping Changeling (ECL) 172
1 Retched Wretch (ECL) 117
1 Soulbright Seeker (ECL) 157
1 Stoic Grove-Guide (ECL) 243
2 Surly Farrier (ECL) 196
1 Scarblade Scout (ECL) 118
1 Timid Shieldbearer (ECL) 39
1 Unforgiving Aim (ECL) 200
1 Kulrath Zealot (ECL) 148
1 Shadow Urchin (ECL) 242
1 Rimekin Recluse (ECL) 66
1 Sting-Slinger (ECL) 161
1 Requiting Hex (ECL) 116
1 Trystan's Command (ECL) 247
1 Sourbread Auntie (ECL) 158
1 Champion of the Clachan (ECL) 9
1 Blossoming Defense (ECL) 167
1 Hovel Hurler (ECL) 230
1 Tweeze (ECL) 162
1 Spiral into Solitude (ECL) 36
2 Gravelgill Scoundrel (ECL) 53
1 Twilight Diviner (ECL) 122
1 Warren Torchmaster (ECL) 163
1 Noggle the Mind (ECL) 60

View File

@@ -27,21 +27,24 @@ python scripts/analyze_decks.py --help
```
├── hydrate.py # Main CLI - fetches card data from Scryfall
├── card_cache.json # Local cache of Scryfall card data
├── deck_analysis.json # Analysis output
├── collection/ # Raw decklist text files
├── collection_hydrated/ # Enriched card data by type
── deck.json # All cards combined
├── commander.json
│ ├── creatures.json
├── instants.json
├── sorceries.json
├── artifacts.json
├── enchantments.json
├── lands.json
── planeswalkers.json
├── decks/ # Deck definitions (JSON)
│ └── <deck_name>.json # name, commander, colors, archetype, cards
├── cache/
│ └── card_cache.json # Local cache of Scryfall card data
├── output/
│ ├── deck_analysis.json # Analysis output
── hydrated/ # Enriched card data by type
├── deck.json # All cards combined
├── commander.json
├── creatures.json
├── instants.json
├── sorceries.json
├── artifacts.json
├── enchantments.json
── lands.json
│ └── planeswalkers.json
├── data/
│ ├── collection/ # Raw decklist text files
│ └── decks/ # Deck definitions (JSON)
│ └── <deck_name>.json # name, commander, colors, archetype, cards
├── scripts/
│ ├── analyze_decks.py # Find upgrade options for decks
│ ├── find_synergies.py # Search for synergistic cards
@@ -53,7 +56,7 @@ python scripts/analyze_decks.py --help
## Data Formats
### Deck JSON (`decks/*.json`)
### Deck JSON (`data/decks/*.json`)
```json
{
@@ -68,7 +71,7 @@ python scripts/analyze_decks.py --help
}
```
### Card Data (`collection_hydrated/*.json`)
### Card Data (`output/hydrated/*.json`)
Array of card objects with Scryfall fields:
- `name`, `mana_cost`, `cmc`, `colors`, `color_identity`
@@ -79,7 +82,7 @@ Array of card objects with Scryfall fields:
### Adding a New Deck
1. Create `decks/<name>.json` with required fields
1. Create `data/decks/<name>.json` with required fields
2. Run `python scripts/update_docs.py` to regenerate documentation
### Adding a New Script
@@ -97,4 +100,4 @@ Array of card objects with Scryfall fields:
## Current Decks
{{DECK_TABLE}}
{{DECK_TABLE}}

View File

@@ -22,7 +22,7 @@ No dependencies required - pure Python 3 standard library.
Fetch card data from Scryfall for a decklist:
```bash
python hydrate.py hydrate collection/decklist.txt -o collection_hydrated/ -c card_cache.json
python hydrate.py hydrate data/collection/decklist.txt -o output/hydrated/ -c cache/card_cache.json
```
### Create a New Deck
@@ -36,7 +36,7 @@ python hydrate.py new my_deck
Find upgrade options from your collection:
```bash
python scripts/analyze_decks.py --collection collection_hydrated/deck.json --deck-dir decks/
python scripts/analyze_decks.py --collection output/hydrated/deck.json --deck-dir data/decks/
```
### Find Synergies
@@ -45,19 +45,19 @@ Search for cards by keywords, colors, and type:
```bash
# Find landfall cards in Simic colors
python scripts/find_synergies.py --collection collection_hydrated/deck.json --colors U G --keywords landfall
python scripts/find_synergies.py --collection output/hydrated/deck.json --colors U G --keywords landfall
# Find Bird creatures in Bant colors
python scripts/find_synergies.py --collection collection_hydrated/deck.json --colors U G W --creature-type Bird
python scripts/find_synergies.py --collection output/hydrated/deck.json --colors U G W --creature-type Bird
# Find instants with CMC 2 or less
python scripts/find_synergies.py --collection collection_hydrated/deck.json --type instant --cmc-max 2
python scripts/find_synergies.py --collection output/hydrated/deck.json --type instant --cmc-max 2
```
### Generate Reports
```bash
python scripts/deck_report.py --collection collection_hydrated/deck.json --decks-dir decks/ --output report.md
python scripts/deck_report.py --collection output/hydrated/deck.json --decks-dir data/decks/ --output output/report.md
```
## Decks
@@ -68,10 +68,10 @@ python scripts/deck_report.py --collection collection_hydrated/deck.json --decks
### Quick Reference
1. **Import** - Place text decklists in `collection/`
2. **Hydrate** - Run `hydrate.py` to fetch Scryfall data → `collection_hydrated/`
1. **Import** - Place text decklists in `data/collection/`
2. **Hydrate** - Run `hydrate.py` to fetch Scryfall data → `output/hydrated/`
3. **Explore** - Find synergies and commanders in your collection
4. **Define** - Create deck JSON files in `decks/`
4. **Define** - Create deck JSON files in `data/decks/`
5. **Analyze** - Run `analyze_decks.py` to find upgrade options
6. **Report** - Use `deck_report.py` for markdown summaries
@@ -81,7 +81,7 @@ python scripts/deck_report.py --collection collection_hydrated/deck.json --decks
### Step 1: Import Your Collection
Create a text file in `collection/` with your cards (one per line):
Create a text file in `data/collection/` with your cards (one per line):
```
1 Sol Ring (CMA) 1
@@ -98,13 +98,13 @@ The set code and collector number are optional but help with accuracy.
Fetch card data from Scryfall:
```bash
python hydrate.py hydrate collection/my_cards.txt -o collection_hydrated/ -c card_cache.json
python hydrate.py hydrate data/collection/my_cards.txt -o output/hydrated/ -c cache/card_cache.json
```
This creates:
- `collection_hydrated/deck.json` - All cards with full data
- `collection_hydrated/creatures.json` - Creatures only
- `collection_hydrated/instants.json`, `sorceries.json`, etc.
- `output/hydrated/deck.json` - All cards with full data
- `output/hydrated/creatures.json` - Creatures only
- `output/hydrated/instants.json`, `sorceries.json`, etc.
### Step 3: Explore Your Collection
@@ -113,7 +113,7 @@ This creates:
python -c "
import json
from collections import Counter
cards = json.load(open('collection_hydrated/deck.json'))
cards = json.load(open('output/hydrated/deck.json'))
colors = Counter(c for card in cards for c in card.get('color_identity', []))
for c, n in colors.most_common(): print(f'{c}: {n}')
"
@@ -121,29 +121,29 @@ for c, n in colors.most_common(): print(f'{c}: {n}')
**Find creature types you own:**
```bash
python scripts/find_synergies.py --collection collection_hydrated/deck.json --creature-type Elf
python scripts/find_synergies.py --collection collection_hydrated/deck.json --creature-type Elemental
python scripts/find_synergies.py --collection output/hydrated/deck.json --creature-type Elf
python scripts/find_synergies.py --collection output/hydrated/deck.json --creature-type Elemental
```
**Find cards by keyword/mechanic:**
```bash
# Find all landfall cards
python scripts/find_synergies.py --collection collection_hydrated/deck.json --keywords landfall
python scripts/find_synergies.py --collection output/hydrated/deck.json --keywords landfall
# Find lifegain synergies
python scripts/find_synergies.py --collection collection_hydrated/deck.json --keywords "gain life"
python scripts/find_synergies.py --collection output/hydrated/deck.json --keywords "gain life"
# Find -1/-1 counter cards
python scripts/find_synergies.py --collection collection_hydrated/deck.json --keywords "-1/-1 counter"
python scripts/find_synergies.py --collection output/hydrated/deck.json --keywords "-1/-1 counter"
```
**Find cards by color identity:**
```bash
# Simic (UG) cards
python scripts/find_synergies.py --collection collection_hydrated/deck.json --colors U G
python scripts/find_synergies.py --collection output/hydrated/deck.json --colors U G
# Esper (WUB) instants
python scripts/find_synergies.py --collection collection_hydrated/deck.json --colors W U B --type instant
python scripts/find_synergies.py --collection output/hydrated/deck.json --colors W U B --type instant
```
### Step 4: Choose a Commander
@@ -155,7 +155,7 @@ Based on your collection strengths, pick a commander that matches:
### Step 5: Create the Deck File
Create `decks/<deck_name>.json`:
Create `data/decks/<deck_name>.json`:
```json
{
@@ -176,7 +176,7 @@ Create `decks/<deck_name>.json`:
Find cards in your collection that fit your deck:
```bash
python scripts/analyze_decks.py --collection collection_hydrated/deck.json --deck-dir decks/
python scripts/analyze_decks.py --collection output/hydrated/deck.json --deck-dir data/decks/
```
This compares your deck against your collection and suggests:
@@ -187,7 +187,7 @@ This compares your deck against your collection and suggests:
### Step 7: Generate a Report
```bash
python scripts/deck_report.py --collection collection_hydrated/deck.json --decks-dir decks/ --output report.md
python scripts/deck_report.py --collection output/hydrated/deck.json --decks-dir data/decks/ --output output/report.md
```
---
@@ -196,17 +196,17 @@ python scripts/deck_report.py --collection collection_hydrated/deck.json --decks
```bash
# 1. Add your collection
echo "1 Ashling, Rekindled // Ashling, Rimebound (ECL) 124" >> collection/my_cards.txt
echo "1 Ashling, Rekindled // Ashling, Rimebound (ECL) 124" >> data/collection/my_cards.txt
# 2. Hydrate
python hydrate.py hydrate collection/my_cards.txt -o collection_hydrated/ -c card_cache.json
python hydrate.py hydrate data/collection/my_cards.txt -o output/hydrated/ -c cache/card_cache.json
# 3. Find red instants/sorceries (spellslinger support)
python scripts/find_synergies.py --collection collection_hydrated/deck.json --colors R --type instant
python scripts/find_synergies.py --collection collection_hydrated/deck.json --colors R --type sorcery
python scripts/find_synergies.py --collection output/hydrated/deck.json --colors R --type instant
python scripts/find_synergies.py --collection output/hydrated/deck.json --colors R --type sorcery
# 4. Create deck file
cat > decks/ashling.json << 'EOF'
cat > data/decks/ashling.json << 'EOF'
{
"name": "Ashling Spellslinger",
"commander": "Ashling, Rekindled // Ashling, Rimebound",
@@ -217,7 +217,7 @@ cat > decks/ashling.json << 'EOF'
EOF
# 5. Analyze and find synergies
python scripts/analyze_decks.py --collection collection_hydrated/deck.json --deck-dir decks/
python scripts/analyze_decks.py --collection output/hydrated/deck.json --deck-dir data/decks/
```
---
@@ -230,24 +230,24 @@ If you opened new packs and want to add cards:
```bash
# 1. Create a new file with the new cards
cat > collection/new_cards_2026-02-20.txt << 'EOF'
cat > data/collection/new_cards_2026-02-20.txt << 'EOF'
1 Bre of Clan Stoutarm (ECL) 8
3 Mulldrifter (ECC) 67
1 Sol Ring (ECC) 57
EOF
# 2. Hydrate the new file (merges into existing cache)
python hydrate.py hydrate collection/new_cards_2026-02-20.txt -o collection_hydrated/ -c card_cache.json
python hydrate.py hydrate data/collection/new_cards_2026-02-20.txt -o output/hydrated/ -c cache/card_cache.json
```
### Scenario 2: Add Cards to Existing File
```bash
# Append to existing collection file
echo "1 The Reaper, King No More (ECC) 4" >> "collection/Box1 2026-01-30.txt"
echo "1 The Reaper, King No More (ECC) 4" >> "data/collection/Box1 2026-01-30.txt"
# Re-hydrate that file
python hydrate.py hydrate "collection/Box1 2026-01-30.txt" -o collection_hydrated/ -c card_cache.json
python hydrate.py hydrate "data/collection/Box1 2026-01-30.txt" -o output/hydrated/ -c cache/card_cache.json
```
### Scenario 3: Merge Multiple Collection Files
@@ -256,12 +256,12 @@ If you have multiple files to combine:
```bash
# Hydrate each file separately (cache persists)
python hydrate.py hydrate collection/Box1.txt -o collection_hydrated/ -c card_cache.json
python hydrate.py hydrate collection/Box2.txt -o collection_hydrated/ -c card_cache.json
python hydrate.py hydrate data/collection/Box1.txt -o output/hydrated/ -c cache/card_cache.json
python hydrate.py hydrate data/collection/Box2.txt -o output/hydrated/ -c cache/card_cache.json
# Note: Each run overwrites deck.json. To merge, combine files first:
cat collection/Box1.txt collection/Box2.txt > collection/combined.txt
python hydrate.py hydrate collection/combined.txt -o collection_hydrated/ -c card_cache.json
cat data/collection/Box1.txt data/collection/Box2.txt > data/collection/combined.txt
python hydrate.py hydrate data/collection/combined.txt -o output/hydrated/ -c cache/card_cache.json
```
### Scenario 4: Re-hydrate Entire Collection
@@ -270,11 +270,11 @@ If cache is corrupted or you want fresh data:
```bash
# Option A: Keep cache, just re-run
python hydrate.py hydrate collection/combined.txt -o collection_hydrated/ -c card_cache.json
python hydrate.py hydrate data/collection/combined.txt -o output/hydrated/ -c cache/card_cache.json
# Option B: Clear cache and fetch fresh (slow, ~100ms per unique card)
rm card_cache.json
python hydrate.py hydrate collection/combined.txt -o collection_hydrated/ -c card_cache.json
rm cache/card_cache.json
python hydrate.py hydrate data/collection/combined.txt -o output/hydrated/ -c cache/card_cache.json
```
### Scenario 5: Update After Set Release
@@ -283,16 +283,16 @@ When a new set releases and you want to add those cards:
```bash
# 1. Add new set cards to collection file
echo "# Lorwyn Eclipsed - 2026-01-23" >> collection/my_collection.txt
cat collection/new_ecl_cards.txt >> collection/my_collection.txt
echo "# Lorwyn Eclipsed - 2026-01-23" >> data/collection/my_collection.txt
cat data/collection/new_ecl_cards.txt >> data/collection/my_collection.txt
# 2. Hydrate (cache speeds up existing cards, fetches new ones)
python hydrate.py hydrate collection/my_collection.txt -o collection_hydrated/ -c card_cache.json
python hydrate.py hydrate data/collection/my_collection.txt -o output/hydrated/ -c cache/card_cache.json
# 3. Verify new cards are present
python -c "
import json
cards = json.load(open('collection_hydrated/deck.json'))
cards = json.load(open('output/hydrated/deck.json'))
print(f'Total unique cards: {len(cards)}')
"
```
@@ -326,7 +326,7 @@ If the same card appears multiple times in your file, they're stored separately.
python -c "
from collections import Counter
cards = Counter()
with open('collection/my_cards.txt') as f:
with open('data/collection/my_cards.txt') as f:
for line in f:
line = line.strip()
if line and not line.startswith('#'):
@@ -337,7 +337,7 @@ with open('collection/my_cards.txt') as f:
cards[name.split('(')[0].strip()] += count
for name, count in sorted(cards.items()):
print(f'{count} {name}')
" > collection/deduped.txt
" > data/collection/deduped.txt
```
**Slow hydration:**
@@ -351,4 +351,4 @@ for name, count in sorted(cards.items()):
---
*This file is auto-generated. Edit `docs/templates/README.template.md` instead.*
*This file is auto-generated. Edit `docs/templates/README.template.md` instead.*

View File

@@ -206,12 +206,12 @@ def main():
hydrate_parser = subparsers.add_parser("hydrate", help="Hydrate a decklist with Scryfall data")
hydrate_parser.add_argument("input", help="Input decklist file")
hydrate_parser.add_argument("-o", "--output", default="output", help="Output directory")
hydrate_parser.add_argument("-c", "--cache", default="card_cache.json", help="Cache file for card data")
hydrate_parser.add_argument("-o", "--output", default="output/hydrated", help="Output directory")
hydrate_parser.add_argument("-c", "--cache", default="cache/card_cache.json", help="Cache file for card data")
new_parser = subparsers.add_parser("new", help="Create a new deck folder")
new_parser.add_argument("name", help="Deck name")
new_parser.add_argument("-d", "--dir", default="decks", help="Base directory for decks")
new_parser.add_argument("-d", "--dir", default="data/decks", help="Base directory for decks")
args = parser.parse_args()

View File

@@ -2,8 +2,8 @@
"""
Analyze decks against a hydrated collection to find upgrade options.
Usage:
python analyze_decks.py --collection collection_hydrated/deck.json --decks deck1.json deck2.json ...
python analyze_decks.py --collection collection_hydrated/deck.json --deck-dir decks/
python analyze_decks.py --collection output/hydrated/deck.json --decks deck1.json deck2.json ...
python analyze_decks.py --collection output/hydrated/deck.json --deck-dir data/decks/
"""
import argparse

View File

@@ -2,7 +2,7 @@
"""
Generate a deck upgrade report comparing collection to existing decks.
Usage:
python deck_report.py --collection collection_hydrated/deck.json --decks-dir decks/ --output report.md
python deck_report.py --collection output/hydrated/deck.json --decks-dir data/decks/ --output output/report.md
"""
import argparse
@@ -26,9 +26,9 @@ def load_deck(path: str) -> dict:
def main():
parser = argparse.ArgumentParser(description='Generate deck upgrade report')
parser.add_argument('--collection', '-c', required=True)
parser.add_argument('--decks-dir', '-d', required=True)
parser.add_argument('--output', '-o', required=True)
parser.add_argument('--collection', '-c', default='output/hydrated/deck.json')
parser.add_argument('--decks-dir', '-d', default='data/decks')
parser.add_argument('--output', '-o', default='output/deck_report.md')
args = parser.parse_args()
collection = load_collection(args.collection)

View File

@@ -2,9 +2,9 @@
"""
Find cards with specific synergies from a hydrated collection.
Usage:
python find_synergies.py --collection collection_hydrated/deck.json --colors U R --keywords "landfall" "enter the battlefield"
python find_synergies.py --collection collection_hydrated/deck.json --colors U R --creature-type Bird
python find_synergies.py --collection collection_hydrated/deck.json --colors U R --cmc-min 4 --type instant
python find_synergies.py --collection output/hydrated/deck.json --colors U R --keywords "landfall" "enter the battlefield"
python find_synergies.py --collection output/hydrated/deck.json --colors U R --creature-type Bird
python find_synergies.py --collection output/hydrated/deck.json --colors U R --cmc-min 4 --type instant
"""
import argparse

View File

@@ -12,8 +12,8 @@ from pathlib import Path
SCRIPT_DIR = Path(__file__).parent
PROJECT_ROOT = SCRIPT_DIR.parent
TEMPLATES_DIR = PROJECT_ROOT / "docs" / "templates"
DECKS_DIR = PROJECT_ROOT / "decks"
COLLECTION_DIR = PROJECT_ROOT / "collection_hydrated"
DECKS_DIR = PROJECT_ROOT / "data" / "decks"
COLLECTION_DIR = PROJECT_ROOT / "output" / "hydrated"
def load_decks() -> list[dict]: