Commit Graph
88 Commits
Author SHA1 Message Date
Julian Tabel 5582d9028f Complete Game Data Cleanup epic 2026-02-11 15:34:02 +01:00
Julian Tabel 1683b60a5e Bean completed 2026-02-11 15:22:59 +01:00
Julian TabelandClaude Opus 4.6 d0b0f08665 Fix and complete route ordering for all games
CI / backend-lint (push) Successful in 7s
CI / frontend-lint (push) Successful in 29s
Rewrote route_order.json with correct progression ordering for all 15
version groups (Gen 1-9), validated against encounter data files. Added
generate_route_order.py script for reproducible generation and validation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 15:21:18 +01:00
Julian TabelandClaude Opus 4.6 157e9ed987 Add starters for all games to special_encounters.json
CI / backend-lint (push) Successful in 7s
CI / frontend-lint (push) Successful in 30s
Added starter data for Gen 4-9, Legends Arceus, and Legends Z-A.
Fixed Yellow and Let's Go which were incorrectly aliased to the
firered-leafgreen Gen 1 trio — they now have their own entries.
Added aliases for Platinum, BD/SP, B2/W2, and USUM.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 14:52:38 +01:00
Julian TabelandClaude Opus 4.6 9a0cf7a552 Remove redundant gift/fossil entries from special_encounters.json
Gifts, trades, and fossils are already in the per-game encounter data.
Only starters need to remain in special_encounters.json. Updated the
corresponding bean to reflect the narrowed scope.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 14:48:23 +01:00
Julian TabelandClaude Opus 4.6 c81a697879 Mark encounter data beans as completed
Encounter data is now complete for Gen 8+ stub games and ORAS/Let's Go titles.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 14:41:45 +01:00
Julian Tabel dfa49e62fe Update bean 2026-02-11 13:42:44 +01:00
Julian TabelandClaude Opus 4.6 174b145e84 Fix webp sprites not loading in production nginx
CI / backend-lint (push) Successful in 7s
CI / frontend-lint (push) Successful in 30s
Include mime.types at the server block level to ensure .webp files
are served with the correct Content-Type (image/webp).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 13:23:58 +01:00
Julian Tabel 02367a8e3a Merge branch 'develop' of ssh://192.168.1.10:2222/TheFurya/nuzlocke-tracker into develop
CI / backend-lint (push) Successful in 7s
CI / frontend-lint (push) Successful in 31s
2026-02-11 13:03:49 +01:00
Julian Tabel 42764b2485 Add sprites 2026-02-11 13:02:18 +01:00
Julian TabelandClaude Opus 4.6 aadd730002 Mark PokeDB import feature and subtasks as completed
CI / backend-lint (push) Successful in 11s
CI / frontend-lint (push) Successful in 30s
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 11:56:25 +01:00
Julian TabelandClaude Opus 4.6 872d7872ce Validate and regenerate all seed data from PokeDB
- Regenerate seed JSON for all 37 games with more complete PokeDB data
- Add category field to games.json (original/enhanced/remake/sequel/spinoff)
- Include all 1350 pokemon in pokemon.json with types and local sprites
- Build reverse index for PokeDB form lookups (types/sprites for evolutions)
- Move sprites to frontend/public/sprites, reference as /sprites/{id}.webp
- Truncate Sw/Sh den names to fit DB VARCHAR(100) limit
- Deduplicate route names and merge unnamed child areas into parent routes
- Populate 7 previously empty games (Sw/Sh, BDSP, PLA, Sc/Vi)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 11:52:51 +01:00
Julian TabelandClaude Opus 4.6 df55233c62 Add seed JSON output (per-game, games.json, pokemon.json)
Wire output module into CLI pipeline: route ordering, special encounter
merging, and JSON writing for per-game encounters, global games list,
and pokemon list with types and sprite paths.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 10:59:56 +01:00
Julian TabelandClaude Opus 4.6 29b954726a Add PokeDB sprite downloading (100x100 WebP)
Download pokemon sprites from PokeDB CDN during import, cached locally
as {pokeapi_id}.webp. Replaces PokeAPI GitHub sprite URLs. ~4.6MB for
all 1119 unique sprites.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 10:24:43 +01:00
Julian TabelandClaude Opus 4.6 d80c59047c Add core encounter processing pipeline
Filter by game version, parse levels and rate variants across all
generations, aggregate encounters by pokemon+method, and build
parent/child route hierarchy. Also completes encounter method coverage
(73/73) and pokemon form mapping (1180/1181) with manual overrides.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 10:12:55 +01:00
Julian TabelandClaude Opus 4.6 df7ea64b9e Add reference data mappings and auto-download for PokeDB import tool
Add mappings module with pokemon form, location area, encounter method,
and version mappings. Auto-download PokeDB JSON exports from CDN on
first run, caching in .pokedb_cache/.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 10:02:57 +01:00
Julian TabelandClaude Opus 4.6 1aa67665ff Add Python tool scaffold for PokeDB data import
Set up tools/import-pokedb/ with CLI, JSON loader, and output models.
Replaces the Go/PokeAPI approach with local PokeDB.org JSON processing.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 09:49:51 +01:00
Julian TabelandClaude Opus 4.6 45a34ecf31 Add rebrand to Another Nuzlocke Tracker (ANT) bean
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 15:57:55 +01:00
Julian TabelandClaude Opus 4.6 27ec0194bc Add seed container evaluation bean, blocked on PokeDB import
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 15:31:36 +01:00
Julian TabelandClaude Opus 4.6 00dead68f7 Add PokeDB.org data import bean, encounter display bean, complete data source research
- Complete exploration of automated data sources (q5vd): PokeDB.org
  identified as ideal single source of truth with JSON data export
- Add bean for PokeDB.org data import tool (bs05)
- Add bean for improving encounter rate display with time/weather
  variants (oqfo)
- Mark branding cleanup bean (xvaw) as completed

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 15:16:26 +01:00
Julian TabelandClaude Opus 4.6 597ad91629 Prioritize beans and add pre-commit hooks task
Game Data Cleanup → critical, Tests → high, pre-commit hooks → high,
boss battles → low, remaining epics → deferred.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 13:06:13 +01:00
Julian TabelandClaude Opus 4.6 617f92a7ea Mark branding cleanup bean as completed
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 13:02:30 +01:00
Julian TabelandClaude Opus 4.6 1842aa947b Add pull-before-merge rule to CLAUDE.md
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 12:58:52 +01:00
Julian TabelandClaude Opus 4.6 03b5572429 Clean up frontend branding and metadata
CI / backend-lint (pull_request) Successful in 7s
CI / frontend-lint (pull_request) Successful in 31s
Replace Vite defaults with Nuzlocke Tracker branding: custom pokeball-
skull favicon (SVG + PNG + ICO), page title, meta description, Open
Graph tags, theme-color, web manifest, and package.json name.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 12:44:09 +01:00
Julian TabelandClaude Opus 4.6 66bd1a421f Update deployment docs, complete Deployment Strategy epic
Rewrite DEPLOYMENT.md to reflect current state (CI/CD, backups, merge
strategy). Expand CI paths-ignore to skip docs, license, gitignore,
and deploy workflow changes. Add merge strategy to CLAUDE.md.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 12:38:34 +01:00
Julian TabelandClaude Opus 4.6 132dac0a2e Update deployment docs, complete Deployment Strategy epic
CI / backend-lint (push) Successful in 7s
CI / frontend-lint (push) Successful in 29s
Rewrite DEPLOYMENT.md to reflect current state (CI/CD, backups, merge
strategy). Expand CI paths-ignore to skip docs, license, gitignore,
and deploy workflow changes. Add merge strategy to CLAUDE.md.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 12:37:43 +01:00
Julian TabelandClaude Opus 4.6 7e8d55ec06 Skip CI on bean-only changes
CI / backend-lint (push) Successful in 7s
CI / frontend-lint (push) Successful in 29s
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 12:29:52 +01:00
Julian TabelandClaude Opus 4.6 29f0b930f8 Mark lint cleanup bean as completed
CI / backend-lint (push) Successful in 7s
CI / frontend-lint (push) Successful in 28s
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 12:28:45 +01:00
Julian TabelandClaude Opus 4.6 e4111c67bc Fix linting errors across backend and frontend
CI / backend-lint (push) Successful in 7s
CI / frontend-lint (push) Successful in 29s
Backend: auto-fix and format all ruff issues, manually fix B904/B023/
SIM117/B007/E741/F841 errors, suppress B008 (FastAPI Depends) and F821
(SQLAlchemy forward refs) in config. Frontend: allow constant exports,
disable React compiler-specific rules (set-state-in-effect,
preserve-manual-memoization).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 12:26:57 +01:00
Julian TabelandClaude Opus 4.6 7f8890086f Add CI and deploy workflows for Gitea Actions
CI / backend-lint (push) Failing after 1m43s
CI / frontend-lint (push) Failing after 1m6s
CI runs ruff and eslint/tsc on push to develop and PRs. Deploy
workflow is manual (workflow_dispatch) and builds, pushes, and
deploys images to Unraid via SSH.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 12:17:20 +01:00
Julian TabelandClaude Opus 4.6 0c4cc815be Remove cron job setup from deploy script
Backup scheduling will be handled via the Unraid User Scripts plugin
instead, which persists across reboots.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 12:02:35 +01:00
Julian TabelandClaude Opus 4.6 58475d9cba Add database backup script with daily cron and 7-day retention
pg_dump-based backup script deployed alongside compose file. Deploy
script now installs a daily cron job (03:00) on Unraid automatically.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 11:55:27 +01:00
Julian TabelandClaude Opus 4.6 7b383dd982 Set up branching structure and add branching rules to CLAUDE.md
Create develop branch from main and document the branching strategy
(main/develop/feature/*) in CLAUDE.md to enforce the workflow.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 11:50:11 +01:00
Julian TabelandClaude Opus 4.6 bd267499b8 Add Gitea Actions CI/CD pipeline task to deployment epic
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 10:38:59 +01:00
Julian TabelandClaude Opus 4.6 3254103cf6 Add frontend branding and metadata cleanup task
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 10:36:37 +01:00
Julian TabelandClaude Opus 4.6 6f4ed3460b Add Unit & Integration Tests epic with subtasks
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 10:34:45 +01:00
Julian TabelandClaude Opus 4.6 fae6532b8a Add Game Data Cleanup epic with subtasks
Track the work needed to audit and complete encounter data and route
ordering across all supported games. Covers automated source exploration,
Gen 8+ stub population, ORAS/Let's Go completion, route ordering for
Gen 5+, Gen 1-4 ordering audit, and special encounters review.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 10:00:14 +01:00
Julian TabelandClaude Opus 4.6 31355975e1 Update deployment beans to reflect SSH-based approach
Remove Portainer references, mark NPM and env management as
completed, update epic checklist and decided approach.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 09:45:58 +01:00
Julian TabelandClaude Opus 4.6 83a17c8f15 Build images for linux/amd64 to run on Unraid
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 09:43:18 +01:00
Julian TabelandClaude Opus 4.6 7ea6b30396 Rework deploy script to SSH directly into Unraid
Replace Portainer-based redeployment with direct SSH approach:
- Auto-detect podman/docker for local builds
- SCP compose file to Unraid
- Generate Postgres password in .env if missing
- Pull images and (re)start containers via SSH

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 09:32:41 +01:00
Julian TabelandClaude Opus 4.6 3f39b5f0cb Use bind mount for prod database storage instead of named volume
Store PostgreSQL data at ./data/postgres relative to the compose file
so persistent data lives on the Unraid disk at
/mnt/user/appdata/nuzlocke-tracker/data/postgres.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 09:17:14 +01:00
Julian TabelandClaude Opus 4.6 6a86c56e3b Add deployment strategy child task beans
Split the deployment strategy epic into 11 individual task beans
with blocking dependencies.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 16:32:04 +01:00
Julian TabelandClaude Opus 4.6 e6646fc3e0 Add deployment strategy epic bean
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 16:29:28 +01:00
Julian TabelandClaude Opus 4.6 f9f94e5e9c Add post-game completion rule option
Add postGameCompletion toggle to nuzlocke rules so players can indicate
whether a run ends after the Champion or continues into post-game. Adds
a new "Completion" category section in rules configuration with a green
badge color.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 12:24:06 +01:00
Julian TabelandClaude Opus 4.6 6d955439eb Fix team sort: add to RunEncounters and fix hook ordering
Add sort dropdown to RunEncounters (the encounters page with the
expandable team section) and move all useMemo hooks before early
returns in both RunDashboard and RunEncounters to fix React hook
ordering violations.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 12:21:07 +01:00
Julian TabelandClaude Opus 4.6 bc9bcf4c4b Add sort options to run team overview
Add a dropdown to sort Active Team and Graveyard by route order,
catch level, species name, or national dex number.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 12:11:54 +01:00
Julian TabelandClaude Opus 4.6 c67621295a Mark genlocke tracking epic and edge cases bean as completed
All 14 success criteria met, all 10 child tasks completed.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 12:08:18 +01:00
Julian TabelandClaude Opus 4.6 924efa9073 Show error feedback when run deletion is blocked
Add optional error prop to DeleteConfirmModal and wire it into AdminRuns
so the backend's rejection message is displayed to the user.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 12:07:09 +01:00
Julian TabelandClaude Opus 4.6 f0307f0625 Guard genlocke data integrity edge cases
Block deletion of runs linked to a genlocke leg, prevent reactivating
completed/failed genlocke-linked runs, and guard encounter deletion
against genlocke transfer references with clear 400 errors.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 12:03:58 +01:00
Julian TabelandClaude Opus 4.6 d3b65e3c79 Add genlocke lineage tracking with aligned timeline view
Implement read-only lineage view that traces Pokemon across genlocke legs
via existing transfer records. Backend walks transfer chains to build
lineage entries; frontend renders them as cards with a column-aligned
timeline grid so leg dots line up vertically across all lineages.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 11:58:38 +01:00
Julian TabelandClaude Opus 4.6 4e00e3cad8 Fix HoF display for transfers/shinies and hook ordering
Move alive and hofTeam into useMemo hooks above early returns to fix
React hook ordering violation. Include transfer and shiny encounters
in alive so they appear in the team section and can be selected for
the Hall of Fame.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 11:45:29 +01:00
Julian TabelandClaude Opus 4.6 c2e946f500 Restrict transfers to HoF team and prevent blocking starter route
Transfer modal now only appears when a Hall of Fame team is selected,
using the existing hofTeam data instead of the survivors endpoint.
Without a HoF selection, advance proceeds directly with no transfer step.

Transferred encounters are now a separate category: they appear in their
own "Transferred Pokemon" section, don't occupy route slots in the
encounter map, and don't block the route-lock check (excluded via
genlocke_transfers subquery). The run detail endpoint returns
transferEncounterIds so the frontend can distinguish them.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 11:35:05 +01:00
Julian TabelandClaude Opus 4.6 e1dac10d27 Fix run deletion crash and transfer modal initialization error
Run deletion now properly cleans up boss_results, genlocke_transfers,
and genlocke_leg references before deleting the run. Also fix
showTransferModal being referenced before initialization in
RunEncounters by moving its useState declaration above useLegSurvivors.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 11:28:22 +01:00
Julian TabelandClaude Opus 4.6 c5910ec75c Add genlocke transfer UI with transfer selection modal and backend support
When advancing to the next genlocke leg, users can now select surviving
Pokemon to transfer. Transferred Pokemon are bred down to their base
evolutionary form and appear as level-1 egg encounters in the next leg.
A GenlockeTransfer record links source and target encounters for lineage tracking.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 11:20:49 +01:00
Julian TabelandClaude Opus 4.6 3bd4250305 Add genlocke cumulative graveyard with backend endpoint and UI
Aggregates all fainted encounters across every leg of a genlocke into a
unified graveyard view. Backend serves GET /genlockes/{id}/graveyard with
per-entry leg/game context and summary stats (total deaths, deaths per
leg, deadliest leg). Frontend adds a toggle button on the genlocke detail
page that reveals a filterable/sortable grid of grayscale Pokemon cards.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 11:00:37 +01:00
Julian TabelandClaude Opus 4.6 d39898a7a1 Add run deletion guard to genlocke edge cases bean
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 10:52:21 +01:00
Julian TabelandClaude Opus 4.6 a81a17c485 Add genlocke admin panel with CRUD endpoints and UI
Backend: PATCH/DELETE genlocke, POST/DELETE legs with order
re-numbering. Frontend: admin list page with status filter,
detail page with inline editing, legs table, and stats display.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 10:51:47 +01:00
Julian TabelandClaude Opus 4.6 08f6857451 Add genlocke list and detail pages
Add GET /genlockes and GET /genlockes/{id} endpoints with aggregate
encounter/death stats per leg, and a frontend list page at /genlockes
plus a detail page at /genlockes/:genlockeId showing progress timeline,
cumulative stats, configuration, retired families, and quick actions.
Update nav link to point to the list page instead of /genlockes/new.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 10:39:59 +01:00
Julian TabelandClaude Opus 4.6 c7c66c76d3 Mark HoF team selection and genlocke retirement integration as completed
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 10:27:29 +01:00
Julian TabelandClaude Opus 4.6 056bef9f75 Scope genlocke retireHoF to HoF team instead of all alive Pokemon
advance_leg() now checks current_run.hof_encounter_ids first and only
retires those Pokemon and their families. Falls back to all alive
non-shiny Pokemon when no HoF team is selected (backwards compatible).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 10:26:49 +01:00
Julian TabelandClaude Opus 4.6 58d36c4433 Fix hooks order violation in RunEncounters
Move hofTeam useMemo before early returns to comply with Rules of Hooks.
It was placed after the loading/error guards, causing a "rendered more
hooks than during the previous render" crash.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 10:22:54 +01:00
Julian TabelandClaude Opus 4.6 08a5e5c621 Add Hall of Fame team selection for completed runs
After marking a run as completed, a modal prompts the player to select
which Pokemon (up to 6) entered the Hall of Fame. The selection is stored
as hof_encounter_ids on the run, displayed in the victory banner, and
can be edited later. This lays the foundation for scoping genlocke
retireHoF to only the actual HoF team.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 10:19:56 +01:00
Julian TabelandClaude Opus 4.6 89f46e2b12 Add HoF team selection and genlocke retirement integration beans
The current retireHoF logic retires all alive Pokemon instead of just
the HoF team. Add beans to track the fix: a general HoF team selection
feature for all runs, and a follow-up task to integrate it into genlocke
retirement logic.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 10:16:13 +01:00
Julian TabelandClaude Opus 4.6 48b56f9360 Implement Retire HoF (Gauntlet) rule enforcement for genlockes
When retireHoF is enabled, surviving HoF Pokemon and their evolutionary
families are retired at leg advancement and treated as duplicates in all
subsequent legs — both in the encounter modal and bulk randomize.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 10:05:03 +01:00
Julian TabelandClaude Opus 4.6 3ff132f284 Add genlocke edge cases tracking bean (draft)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 09:49:26 +01:00
Julian TabelandClaude Opus 4.6 07343e94e2 Add genlocke leg progression with advance endpoint and run context
When a run belonging to a genlocke is completed or failed, the genlocke
status updates accordingly. The run detail API now includes genlocke
context (leg order, total legs, genlocke name). A new advance endpoint
creates the next leg's run, and the frontend shows genlocke-aware UI
including a "Leg X of Y" banner, advance button, and contextual
messaging in the end-run modal.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 09:47:28 +01:00
Julian TabelandClaude Opus 4.6 96178622f9 Add genlocke admin management bean
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 09:38:39 +01:00
Julian TabelandClaude Opus 4.6 fa6f3c97d2 Add end-of-run condition rule bean, mark genlocke wizard completed
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 09:36:03 +01:00
Julian TabelandClaude Opus 4.6 7851e14c2f Add genlocke creation wizard with backend API and 4-step frontend
Implements the genlocke creation feature end-to-end: Genlocke and
GenlockeLeg models with migration, POST /genlockes endpoint that
creates the genlocke with all legs and auto-starts the first run,
and a 4-step wizard UI (Name, Select Games with preset templates,
Rules, Confirm) at /genlockes/new.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 09:33:37 +01:00
Julian TabelandClaude Opus 4.6 aaaeb2146e Add game category and region metadata for genlocke presets
Add `category` field (original/remake/enhanced/sequel/spinoff) to the
Game model and tag all 38 games. Create regions.json with generation
mapping, ordering, and genlocke preset defaults per region. Add
GET /games/by-region endpoint returning games grouped by region.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 09:06:15 +01:00
Julian TabelandClaude Opus 4.6 dab0cf986f Add soullink tracking epic (draft)
Multiplayer nuzlocke variant where players' Pokemon are linked in
pairs — if one dies, both die. Blocked by user authentication epic.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 08:57:42 +01:00
Julian TabelandClaude Opus 4.6 3a1aedda32 Refine genlocke epic with user flow, child features, and action items
Break down the genlocke tracking epic into 8 child beans with
checklists, dependency chains, and success criteria. Add CLAUDE.md
instruction for updating parent checklists on child completion.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 08:47:49 +01:00
Julian TabelandClaude Opus 4.5 574e36ee22 Add bean for updating PokeAPI data submodule
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-06 11:54:42 +01:00
Julian TabelandClaude Opus 4.5 93d0d8a9e2 Use game.color for GameCard fallback instead of static gradients
Replace hardcoded Tailwind gradient classes with dynamic background
color from the game's color field. Falls back to indigo if no color
is set.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-06 11:51:28 +01:00
Julian TabelandClaude Opus 4.5 f7f5417b6b Add all Gen 1-9 games with colors to seed data
- Add 37 games from Gen 1-9 (Red/Blue through Scarlet/Violet)
- Add color field to Game model matching box art/branding
- Add migration for games.color column
- Update fetch_pokeapi.py to fetch all games and output colors
- Update seed loader to upsert game colors
- Update frontend Game type to include color field

Games without PokeAPI encounter data (ORAS, Let's Go, Sword/Shield,
BDSP, Legends Arceus, Scarlet/Violet) have location structure but
empty encounter tables.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-06 11:46:10 +01:00
Julian TabelandClaude Opus 4.5 5406e5a386 Add bean for run completion (success/failure) feature
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-06 11:22:49 +01:00
Julian TabelandClaude Opus 4.5 1c8e7562c8 Add bean for test data injection in dev environment
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-06 11:20:15 +01:00
Julian TabelandClaude Opus 4.5 fce6756cc2 Seed all Pokemon species and add admin pagination
- Update fetch_pokeapi.py to import all 1025 Pokemon species instead of
  only those appearing in encounters
- Add paginated response for /pokemon endpoint with total count
- Add pagination controls to AdminPokemon page (First/Prev/Next/Last)
- Show current page and total count in admin UI
- Add bean for Pokemon forms support task
- Update UX improvements bean with route grouping polish item

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-06 11:19:05 +01:00
Julian TabelandClaude Opus 4.5 2aa60f0ace Add hierarchical route grouping for multi-area locations
Locations like Mt. Moon (with 1F, B1F, B2F floors) are now grouped so
only one encounter can be logged per location group, enforcing Nuzlocke
first-encounter rules correctly.

- Add parent_route_id column with self-referential FK to routes table
- Add parent/children relationships on Route model
- Update games API to return hierarchical route structure
- Add validation in encounters API to prevent parent route encounters
  and duplicate encounters within sibling routes (409 conflict)
- Update frontend with collapsible RouteGroup component
- Auto-derive route groups from PokeAPI location/location-area structure
- Regenerate seed data with 70 parent routes and 315 child routes

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-06 11:07:45 +01:00
Julian TabelandClaude Opus 4.5 628c621fa9 Add beans for evolutions, area grouping, UX pass, and gift encounters
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 15:28:59 +01:00
Julian TabelandClaude Opus 4.5 689c1de107 Add local Fire Red box art image
Store box art in public/boxart/ to avoid slow external image loads
from Bulbagarden.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 15:28:54 +01:00
Julian TabelandClaude Opus 4.5 66b3c9286f Add run dashboard and encounter tracking interface
Run list at /runs shows all runs with status badges. Run dashboard at
/runs/:id displays stats, active team, graveyard, and rule badges.
Encounter tracking at /runs/:runId/encounters shows route list with
status indicators, progress bar, filters, and a modal for logging or
editing encounters with pokemon picker.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 15:28:50 +01:00
Julian TabelandClaude Opus 4.5 982154b348 Add game selection screen and new run wizard
Build a 3-step wizard at /runs/new: select game (themed gradient cards
grouped by generation with filter tabs), configure rules (reuses existing
RulesConfiguration), and name/create run. Remove standalone Games and Rules
pages since they're now integrated into the wizard flow.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 15:09:25 +01:00
Julian TabelandClaude Opus 4.5 7c65775c8b Add frontend API client and TanStack Query hooks
Install @tanstack/react-query, create a fetch-based API client with typed
functions for all endpoints, and add query/mutation hooks for games, pokemon,
runs, and encounters. Includes Vite dev proxy for /api and QueryClientProvider
setup.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 15:09:14 +01:00
Julian TabelandClaude Opus 4.5 13e90eb308 Add REST API endpoints for games, runs, and encounters
Implement 13 endpoints: read-only reference data (games, routes, pokemon),
run CRUD with cascading deletes, and encounter management. Uses Pydantic v2
with camelCase alias generation to match frontend types, and nested response
schemas for detail views.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 15:09:05 +01:00
Julian TabelandClaude Opus 4.5 cfd4c51514 Add game data seeding from PokeAPI with level ranges
Seed the database with Pokemon game data for 5 games (FireRed, LeafGreen,
Emerald, HeartGold, SoulSilver) using pokebase. Includes Alembic migrations
for route unique constraints and encounter level ranges, a two-phase seed
system (offline fetch to JSON, then idempotent upserts), and Dockerfile
updates for the seed runner.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 15:08:54 +01:00
Julian TabelandClaude Opus 4.5 08c05f2a2f Add frontend TypeScript types for game data models
Define Game, Route, Pokemon, RouteEncounter, Encounter, and NuzlockeRun
types mirroring the backend schema, with EncounterStatus and RunStatus
discriminated union types.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 13:34:21 +01:00
Julian TabelandClaude Opus 4.5 d94364d6ce Add database schema with SQLAlchemy async + Alembic migrations
Set up PostgreSQL database layer with async SQLAlchemy 2.0 and asyncpg driver.
Implements 6 core tables (games, routes, pokemon, route_encounters, nuzlocke_runs,
encounters) with foreign keys, indexes, and an initial Alembic migration.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 13:29:34 +01:00