KoalaTrapLord
da5e9bd74f
feat: set is_commander during deck loading, place in command_zone
...
- Add commander_names param to run(), run_n(), _create_state()
- Commander card flagged is_commander=True and placed in
player.command_zone instead of shuffled into library/hand
- Only first matching card is extracted (handles singleton rule)
- Backward compatible: commander_names defaults to None
2026-03-17 03:31:35 +00:00
KoalaTrapLord
019a710acd
feat: add command_zone and commander_tax to Player dataclass
...
Adds command_zone (list[Card]) and commander_tax (int, +2 per cast)
to the base Player model so the headless engine can track commander
zone and tax natively without requiring CommanderPlayer wrappers.
2026-03-17 03:18:06 +00:00
KoalaTrapLord
08509b753f
fix: add httpx and websockets to runtime dependencies ( fixes #37 )
...
Both were missing from [project.dependencies] in pyproject.toml and
requirements.txt. httpx is used in web/routers/art.py, and websockets
is needed for the FastAPI WebSocket endpoints in ws.py and lobby.py.
Closes #37
2026-03-17 02:04:09 +00:00
Commander AI Lab
872f6c38ca
security: remove hardcoded API keys, add .env support ( fixes #26 )
...
- Remove plaintext Ximilar and Perplexity API keys from start-lab.bat
- Remove hardcoded key defaults from lab_api.py, lab_api_backup.py, lab_api_new.py
- start-lab.bat now reads from environment variables or .env file
- Add .env.example with placeholder values
- .env already in .gitignore (confirmed)
- Git history purged of all key values via git-filter-repo
Closes #26
2026-03-17 02:00:15 +00:00
KoalaTrapLord
9f7fbef7f8
fix: implement all 19 simulator audit bug fixes
...
Bug fixes across 7 Python files from the deep-dive audit:
engine.py (bugs 1-6):
- Fix summoning sickness (was disabled after turn 0)
- Move untap step before draw (correct MTG ordering)
- Rebuild playable list each iteration (fix mana overspend)
- Menace now allows 2+ blockers instead of preventing all
- Add double strike damage handling (blocked + unblocked)
- (Finish position sort already correct, no change needed)
game_state.py (bugs 7,9,18,19):
- Add .players property returning commander_players
- Add get_legal_moves()/apply_move() stubs
- Initialize commander zone in from_sim_state()
- Sync land_drop_used from engine stats
turn_manager.py (bugs 8,10,11):
- Use sim_state.get_battlefield() + card.tapped attr access
- Replace asyncio.get_event_loop() with get_running_loop()
- Fix APNAP iterations counter (always increment)
- Fix drawn.name and discarded.name (was dict .get())
threat_assessor.py (bugs 12,13,14):
- Use game_state.battlefield(seat) for card iteration
- Use Card dataclass attrs (c.type_line, c.oracle_text, etc)
- Move import re to module top level
models.py (bug 15):
- Word-boundary regex in has_keyword() (fixes reach/ward FPs)
prompt_builder.py (bug 16):
- Remove @staticmethod from module-level _category_label()
rules.py (bug 17):
- Evaluate ramp detection independently of is_removal flag
2026-03-16 20:50:09 +00:00
KoalaTrapLord
2f117eedcb
fix: Java 17 compat - inline ternary in this() call instead of local var
2026-03-16 20:34:05 +00:00
KoalaTrapLord
8f8abb79c6
fix: match actual Forge verbose log format - cast/played/Life:/Zone Change: patterns
2026-03-16 20:25:35 +00:00
KoalaTrapLord
78898f6da0
fix: regex patterns match Forge verbose output, single-winner resolution, 300s clock for 4p
2026-03-16 17:34:12 +00:00
KoalaTrapLord
69242a8f6e
fix: remove duplicate numPlayers declaration in parseForgeOutput
2026-03-16 17:13:48 +00:00
KoalaTrapLord
2b6ccac3ea
fix: hardcoded 3-element arrays in BatchRunner causing empty stats for 4-player games
2026-03-16 17:09:57 +00:00
KoalaTrapLord
94bb369866
feat: add --deck4/--commander4 support for 4-player games in LabCli + BatchRunner
2026-03-16 02:28:06 +00:00
KoalaTrapLord
b57fc9dc2f
fix: add missing stdlib imports (threading, os, re, csv, io, datetime) across route modules
2026-03-16 01:55:17 +00:00
KoalaTrapLord
e1f2b5d89f
fix: add missing os import to collection.py
2026-03-16 01:53:17 +00:00
KoalaTrapLord
9b354e019b
fix: add missing Path import to collection.py
2026-03-16 01:42:37 +00:00
KoalaTrapLord
ac3b76793b
fix: add missing Path, os, threading imports to routes/collection.py
2026-03-15 21:05:35 -04:00
KoalaTrapLord
c60719a0a9
refactor: extract deckgen (14) + coach (12) routes
...
- routes/deckgen.py: classic generator, Perplexity V1, V3 generator + exports
Helpers: _resolve_commander, _generate_deck, _build_collection_summary,
_call_pplx_api, _fill_basic_lands, etc.
Uses _coach._deck_gen_v3 via module reference for V3 state
- routes/coach.py: all coaching endpoints + init_coach_service(),
_build_deck_report_from_db, globals (_coach_service, _deck_gen_v3, etc.)
- lab_api.py: 3265 -> 1063 lines (16 remaining: ML + SPA catch-all)
- Total: 90 extracted + 16 remaining = 106 endpoints verified
2026-03-15 07:26:09 +00:00
KoalaTrapLord
87a2090c68
refactor: extract scanner (6) + deepseek/sim (9) routes
...
- routes/scanner.py: scan, scan/add, re-enrich, auto-classify, auto-classify-all, edhrec
- routes/deepseek.py: sim/run, sim/status, sim/result, sim/run-from-deck,
sim/run-deepseek, deepseek/connect, deepseek/status, deepseek/configure, deepseek/logs
- lab_api.py: 4464 -> 3265 lines (42 remaining endpoints)
- Total: 64 extracted + 42 remaining = 106 endpoints verified
2026-03-15 06:56:02 +00:00
KoalaTrapLord
463b7c1483
Phase 8: Full multiplayer — lobby, private hands, LAN discovery, spectator mode, chat
2026-03-14 23:04:32 -04:00
KoalaTrapLord
a093ab4949
Phase 7: Integration tests, AI benchmarking suite, conftest, pytest config, coverage setup
2026-03-14 21:13:26 -04:00
KoalaTrapLord
b6b1616dad
Phase 6: AI politics engine (deal-making, threat comms, spite logic) + targeting memory
2026-03-14 20:42:48 -04:00
KoalaTrapLord
92bb9b9445
Phase 5: FastAPI server, WebSocket game channel, Scryfall art proxy, REST API, static web client, tests
2026-03-14 20:36:06 -04:00
KoalaTrapLord
3c3dceb737
Phase 4: Add Pygame prototype GUI (gui/ package + tests/test_phase4.py)
2026-03-14 20:10:43 -04:00
KoalaTrapLord
605ff774ed
Phase 3: Add turn_manager.py, threat_assessor.py, tests/test_phase3.py
2026-03-14 19:35:50 -04:00
KoalaTrapLord
441ba7dd74
Phase 2: Add ai_opponent.py, personality_prompts.py, tests/test_phase2.py
2026-03-14 16:53:43 -04:00
KoalaTrapLord
d0e2824038
Phase 1: Add game_state.py, prompt_builder.py, state_logger.py
2026-03-14 16:43:16 -04:00
KoalaTrapLord
8a6fbfaa8a
fix: 3 post-refactor bugs (COMMANDER_META, PRECON_INDEX, startup)
...
Task 1: Move BUILTIN_COMMANDERS + load_commander_meta() to shared.py
Fix import_routes.py to use _shared.COMMANDER_META (module ref)
Task 2: Rewrite precon.py to use _shared.PRECON_INDEX (module ref)
Task 3: Add @app.on_event('startup') safety net for uvicorn --reload
2026-03-14 19:08:21 +00:00
KoalaTrapLord
36077c94ab
refactor: extract 49 endpoints into 5 route modules
...
- Extract collection (10), deckbuilder (18), precon (4), import (5), lab (12) routes
- All share helpers/models/state from routes/shared.py
- Gut lab_api.py from 8872 to 4487 lines (57 remaining endpoints)
- Delete routes/_wire.py and routes/_autoload.py (replaced by include_router)
- Add _scryfall_fuzzy_lookup to shared.py
- 106 total endpoints verified: 49 extracted + 57 remaining
2026-03-14 18:55:32 +00:00
KoalaTrapLord
2c6748a736
feat(brain): swap default model to GPT-OSS 20B via Ollama (localhost:11434)
2026-03-14 14:34:14 -04:00
KoalaTrapLord
585cc1d4a3
feat(engine): load learned_weights.json automatically via load_weights()
2026-03-14 14:30:28 -04:00
KoalaTrapLord
c52eb1c3ef
refactor: extract all shared state, helpers, models into routes/shared.py
2026-03-14 03:15:12 -04:00
KoalaTrapLord
d68b2368b4
fix: remove export_deck_to_sim and _edhrec_cache* from _wire.py (not yet in lab_api.py)
2026-03-14 03:02:45 -04:00
KoalaTrapLord
8d1a916f04
feat(ml): add update_weights.py — outcome-weighted RL learning from decision logs
2026-03-14 02:58:32 -04:00
KoalaTrapLord
2b2383f5c8
wire routes._autoload.register_startup(app) after CORSMiddleware
2026-03-14 02:02:53 -04:00
KoalaTrapLord
911fde9f5f
wire routes._autoload.register_startup(app) after CORSMiddleware
2026-03-14 02:02:26 -04:00
KoalaTrapLord
6799f0c402
wire routes._autoload.register_startup(app) after CORSMiddleware
2026-03-14 01:57:18 -04:00
KoalaTrapLord
da4e225db0
wire routes._autoload.register_startup(app) after CORSMiddleware
2026-03-14 01:55:50 -04:00
KoalaTrapLord
71428c89db
docs: add ROUTES_WIRING.md — final integration instructions for lab_api.py
...
Explains exactly what 2 lines to add to lab_api.py to activate
all 5 routers. Part of Batch 6/6.
2026-03-14 01:50:47 -04:00
KoalaTrapLord
c14402494b
feat(routes): add _autoload.py — FastAPI startup event that wires routers
...
Adds an @app.on_event('startup') hook that imports routes._wire.
This means lab_api.py needs zero changes — the routers self-register
when the app boots. Drop this file into the repo root and it works.
Alternatively, add to lab_api.py after app creation:
from routes import _autoload # noqa
2026-03-14 01:49:52 -04:00
KoalaTrapLord
5ea512bfef
feat(routes): add _wire.py — registers shared symbols and includes all routers
...
Called via `import routes._wire` at the bottom of lab_api.py (after all
symbols are defined). Registers every shared object into routes.shared
and mounts all five APIRouters onto the FastAPI app.
Batch 6/6 — final wiring step.
2026-03-14 01:49:18 -04:00
KoalaTrapLord
d92345927f
refactor: Batch 5 — routes/deckbuilder.py (deck CRUD, cards, analysis, recs, bulk-add, export)
2026-03-14 01:47:04 -04:00
KoalaTrapLord
e1a46202b2
refactor: Batch 4 — routes/collection.py (collection CRUD, import, export, scryfall cache)
2026-03-14 01:46:33 -04:00
KoalaTrapLord
553e07980f
refactor: Batch 3 — routes/import_routes.py and routes/precon.py
2026-03-14 01:45:58 -04:00
KoalaTrapLord
b0666bb3fd
refactor: Batch 2 — routes/lab.py (simulator, status, decks-list, profiles, analytics, deepseek)
2026-03-14 01:45:17 -04:00
KoalaTrapLord
4b1d2f71f5
refactor: Batch 1 — add routes/ package with shared state, config, and models
2026-03-14 01:44:37 -04:00
KoalaTrapLord
2d02fcc770
Add files via upload
2026-03-14 01:00:25 -04:00
KoalaTrapLord
3d00b68566
Delete lab_api_patched.py
2026-03-14 00:59:15 -04:00
KoalaTrapLord
dda82ad1e6
Add files via upload
2026-03-14 00:55:54 -04:00
KoalaTrapLord
6c547664fb
Delete lab_api.py
2026-03-14 00:55:32 -04:00
KoalaTrapLord
d95f0b57c0
fix: commander card correctly flagged in deck tracker
...
Two fixes:
1. _parse_text_decklist(): replace fragile startswith() section-header
detection with case-insensitive regex so [Commander], [Main], [Deck]
etc. are always recognised regardless of capitalisation.
2. add_deck_card endpoint: when a card is added with is_commander=1,
also update the deck-level commander_name + commander_scryfall_id
so the portrait and top-bar label stay in sync.
2026-03-14 00:48:19 -04:00
KoalaTrapLord
264fb33957
fix: commander card correctly flagged in deck tracker
...
Two fixes:
1. _parse_text_decklist(): replace fragile startswith() section header
detection with proper case-insensitive regex so [Commander], [Main],
[Deck] etc. are always recognised regardless of capitalisation.
2. add_deck_card endpoint: when a card is added with is_commander=1,
also update the deck-level commander_name and commander_scryfall_id
fields so the portrait and top-bar label stay in sync without
requiring a full reload.
2026-03-14 00:47:59 -04:00