chore: archive 42 completed/scrapped beans
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,32 @@
|
||||
---
|
||||
# nuzlocke-tracker-12cw
|
||||
title: 'Crash: Crash: User model, run ownership, and visibility migration'
|
||||
status: completed
|
||||
type: bug
|
||||
priority: high
|
||||
created_at: 2026-03-20T19:13:06Z
|
||||
updated_at: 2026-03-20T19:21:27Z
|
||||
parent: nuzlocke-tracker-bw1m
|
||||
blocking:
|
||||
- nuzlocke-tracker-gez0
|
||||
---
|
||||
|
||||
Agent crashed while working on nuzlocke-tracker-gez0.
|
||||
|
||||
## Exit Code
|
||||
1
|
||||
|
||||
## Last Output
|
||||
```
|
||||
Failed to authenticate. API Error: 401 {"type":"error","error":{"type":"authentication_error","message":"OAuth token has expired. Please obtain a new token or refresh your existing token."},"request_id":"req_011CZEs5bfrivterCHgjXoWG"}
|
||||
|
||||
```
|
||||
|
||||
## Context
|
||||
- Bean: nuzlocke-tracker-gez0
|
||||
- Title: Crash: User model, run ownership, and visibility migration
|
||||
- Type: bug
|
||||
|
||||
## Reasons for Scrapping
|
||||
|
||||
This crash was caused by an expired OAuth token during agent execution - a transient session management issue, not a code bug. The underlying task (nuzlocke-tracker-bnhh) remains blocked by nuzlocke-tracker-2561 (Supabase setup) and can be resumed once that prerequisite is complete.
|
||||
@@ -0,0 +1,21 @@
|
||||
---
|
||||
# nuzlocke-tracker-2561
|
||||
title: Supabase Auth project setup and provider config
|
||||
status: completed
|
||||
type: task
|
||||
priority: normal
|
||||
created_at: 2026-03-20T15:28:08Z
|
||||
updated_at: 2026-03-20T20:04:40Z
|
||||
parent: nuzlocke-tracker-d98o
|
||||
---
|
||||
|
||||
Set up Supabase project with Auth enabled. Configure Google and Discord as social login providers. Add Supabase URL and keys to backend/frontend environment variables. This is the foundation — nothing else can start until the Supabase project exists.
|
||||
|
||||
## Checklist
|
||||
- [ ] Create Supabase project (or configure existing one)
|
||||
- [ ] Enable email/password auth
|
||||
- [ ] Configure Google OAuth provider
|
||||
- [ ] Configure Discord OAuth provider
|
||||
- [x] Add SUPABASE_URL, SUPABASE_ANON_KEY, SUPABASE_JWT_SECRET to backend env
|
||||
- [x] Add VITE_SUPABASE_URL, VITE_SUPABASE_ANON_KEY to frontend env
|
||||
- [x] Document setup steps for local development
|
||||
@@ -0,0 +1,34 @@
|
||||
---
|
||||
# nuzlocke-tracker-3psa
|
||||
title: 'Crash: Bug: TypeScript build fails due to optional property type mismatches in journal components'
|
||||
status: completed
|
||||
type: bug
|
||||
priority: high
|
||||
tags:
|
||||
- failed
|
||||
created_at: 2026-03-20T19:00:37Z
|
||||
updated_at: 2026-03-20T19:17:34Z
|
||||
parent: nuzlocke-tracker-bw1m
|
||||
blocking:
|
||||
- nuzlocke-tracker-d5ht
|
||||
---
|
||||
|
||||
Agent crashed while working on nuzlocke-tracker-d5ht.
|
||||
|
||||
## Exit Code
|
||||
1
|
||||
|
||||
## Last Output
|
||||
```
|
||||
Failed to authenticate. API Error: 401 {"type":"error","error":{"type":"authentication_error","message":"OAuth token has expired. Please obtain a new token or refresh your existing token."},"request_id":"req_011CZEr8PbYrEx4DTBz6e1Z7"}
|
||||
|
||||
```
|
||||
|
||||
## Context
|
||||
- Bean: nuzlocke-tracker-d5ht
|
||||
- Title: Bug: TypeScript build fails due to optional property type mismatches in journal components
|
||||
- Type: bug
|
||||
|
||||
## Summary of Changes
|
||||
|
||||
Resolved by nuzlocke-tracker-xsdr - TypeScript build errors fixed.
|
||||
@@ -0,0 +1,50 @@
|
||||
---
|
||||
# nuzlocke-tracker-52rw
|
||||
title: 'Bug: Tailwind typography plugin unresolvable in Docker dev container'
|
||||
status: completed
|
||||
type: bug
|
||||
priority: deferred
|
||||
created_at: 2026-03-20T19:23:06Z
|
||||
updated_at: 2026-03-20T20:26:50Z
|
||||
---
|
||||
|
||||
## Problem
|
||||
|
||||
After commit 1cd1389 added `@tailwindcss/typography` and the `@plugin '@tailwindcss/typography'` directive in `index.css`, the frontend Docker dev container fails to start with:
|
||||
|
||||
```
|
||||
[plugin:@tailwindcss/vite:generate:serve] Can't resolve '@tailwindcss/typography' in '/app/src'
|
||||
```
|
||||
|
||||
## Root Cause
|
||||
|
||||
The `docker-compose.yml` volume mount `./frontend/src:/app/src:cached` overlays the host's `src/` directory into the container. The new `src/index.css` contains `@plugin '@tailwindcss/typography'`, which Tailwind's Vite plugin tries to resolve starting from `/app/src/`.
|
||||
|
||||
Two possible causes:
|
||||
1. **Stale Docker image** — If the image wasn't rebuilt after `@tailwindcss/typography` was added to `package.json`, the container's `node_modules` doesn't have the package. Fix: `docker compose build frontend` or `docker compose up --build`.
|
||||
2. **Resolution path issue** — Tailwind v4's `@plugin` resolution may not walk up to `/app/node_modules` from `/app/src/index.css`. This would be a persistent issue even after rebuilding.
|
||||
|
||||
## Fix
|
||||
|
||||
- [x] Rebuild the Docker image and test if the error persists (FIXED - error was due to stale image)
|
||||
- [~] If it persists after rebuild, add volume mounts (N/A - not needed, rebuild fixed it)
|
||||
- [~] If resolution is the issue, consider moving the `@plugin` directive (N/A - not needed)
|
||||
- [x] Verify the frontend starts correctly in Docker with `docker compose up frontend`
|
||||
|
||||
## Files
|
||||
|
||||
- `docker-compose.yml` (line 27: src volume mount)
|
||||
- `frontend/src/index.css` (line 2: `@plugin '@tailwindcss/typography'`)
|
||||
- `frontend/package.json` (line 22: `@tailwindcss/typography` dependency)
|
||||
- `frontend/Dockerfile`
|
||||
|
||||
## Summary of Changes
|
||||
|
||||
The issue was caused by a **stale Docker image** that was built before `@tailwindcss/typography` was added to `package.json`. The cached `npm ci` layer didn't include the new dependency.
|
||||
|
||||
**Resolution:** Running `docker compose build frontend` rebuilt the image with the updated dependencies. After rebuild:
|
||||
- The frontend container starts correctly
|
||||
- The `@plugin '@tailwindcss/typography'` directive resolves successfully
|
||||
- The `.prose` typography styles are included in the compiled CSS
|
||||
|
||||
**No code changes required.** This is a documentation of the root cause for future reference - users experiencing this error should rebuild their Docker images.
|
||||
@@ -0,0 +1,32 @@
|
||||
---
|
||||
# nuzlocke-tracker-8vev
|
||||
title: 'Crash: Frontend auth flow (login, signup, session management)'
|
||||
status: completed
|
||||
type: bug
|
||||
priority: high
|
||||
tags:
|
||||
- failed
|
||||
created_at: 2026-03-20T19:01:00Z
|
||||
updated_at: 2026-03-20T19:21:54Z
|
||||
parent: nuzlocke-tracker-bw1m
|
||||
blocking:
|
||||
- nuzlocke-tracker-l9xh
|
||||
---
|
||||
|
||||
Agent crashed while working on nuzlocke-tracker-l9xh.
|
||||
|
||||
## Exit Code
|
||||
1
|
||||
|
||||
## Last Output
|
||||
```
|
||||
Failed to authenticate. API Error: 401 {"type":"error","error":{"type":"authentication_error","message":"OAuth token has expired. Please obtain a new token or refresh your existing token."},"request_id":"req_011CZErA6rXo6bi18BfjCwD7"}
|
||||
|
||||
```
|
||||
|
||||
## Context
|
||||
- Bean: nuzlocke-tracker-l9xh
|
||||
- Title: Frontend auth flow (login, signup, session management)
|
||||
- Type: feature
|
||||
|
||||
## Resolution\n\nThis was an infrastructure issue (Claude API OAuth token expired), not a code bug. Continuing work on the original feature bean (nuzlocke-tracker-l9xh).
|
||||
@@ -0,0 +1,34 @@
|
||||
---
|
||||
# nuzlocke-tracker-9nmp
|
||||
title: 'Crash: Crash: User Account integration'
|
||||
status: completed
|
||||
type: bug
|
||||
priority: high
|
||||
created_at: 2026-03-20T19:12:56Z
|
||||
updated_at: 2026-03-20T19:18:39Z
|
||||
parent: nuzlocke-tracker-bw1m
|
||||
blocking:
|
||||
- nuzlocke-tracker-ndpz
|
||||
---
|
||||
|
||||
Agent crashed while working on nuzlocke-tracker-ndpz.
|
||||
|
||||
## Exit Code
|
||||
1
|
||||
|
||||
## Last Output
|
||||
```
|
||||
Failed to authenticate. API Error: 401 {"type":"error","error":{"type":"authentication_error","message":"OAuth token has expired. Please obtain a new token or refresh your existing token."},"request_id":"req_011CZEs4pUWwh8wYoPHzaGmx"}
|
||||
|
||||
```
|
||||
|
||||
## Context
|
||||
- Bean: nuzlocke-tracker-ndpz
|
||||
- Title: Crash: User Account integration
|
||||
- Type: bug
|
||||
|
||||
## Resolution
|
||||
|
||||
This crash was caused by Claude's OAuth token expiring during an agent session. This is an environmental/infrastructure issue, not a code bug. The token has been refreshed by starting a new agent session.
|
||||
|
||||
No code changes required.
|
||||
@@ -0,0 +1,35 @@
|
||||
---
|
||||
# nuzlocke-tracker-9zpm
|
||||
title: 'Crash: Backend auth middleware and JWT verification'
|
||||
status: scrapped
|
||||
type: bug
|
||||
priority: high
|
||||
created_at: 2026-03-20T19:00:53Z
|
||||
updated_at: 2026-03-20T19:20:40Z
|
||||
parent: nuzlocke-tracker-bw1m
|
||||
blocking:
|
||||
- nuzlocke-tracker-b311
|
||||
---
|
||||
|
||||
Agent crashed while working on nuzlocke-tracker-b311.
|
||||
|
||||
## Exit Code
|
||||
1
|
||||
|
||||
## Last Output
|
||||
```
|
||||
Failed to authenticate. API Error: 401 {"type":"error","error":{"type":"authentication_error","message":"OAuth token has expired. Please obtain a new token or refresh your existing token."},"request_id":"req_011CZEr9WsspBGfYrbAM9JRc"}
|
||||
|
||||
```
|
||||
|
||||
## Context
|
||||
- Bean: nuzlocke-tracker-b311
|
||||
- Title: Backend auth middleware and JWT verification
|
||||
- Type: task
|
||||
|
||||
|
||||
## Reasons for Scrapping
|
||||
|
||||
This is not a code bug. The crash occurred because the agent's OAuth token to the Anthropic API expired during execution. This is an infrastructure/authentication issue, not an actionable bug in the nuzlocke-tracker codebase.
|
||||
|
||||
The original task (`nuzlocke-tracker-b311`) can proceed once its actual prerequisite (`nuzlocke-tracker-2561` - Supabase Auth setup) is completed.
|
||||
@@ -0,0 +1,32 @@
|
||||
---
|
||||
# nuzlocke-tracker-a8q0
|
||||
title: 'Crash: Supabase Auth project setup and provider config'
|
||||
status: scrapped
|
||||
type: bug
|
||||
priority: high
|
||||
created_at: 2026-03-20T19:00:47Z
|
||||
updated_at: 2026-03-20T19:19:24Z
|
||||
parent: nuzlocke-tracker-bw1m
|
||||
blocking:
|
||||
- nuzlocke-tracker-2561
|
||||
---
|
||||
|
||||
Agent crashed while working on nuzlocke-tracker-2561.
|
||||
|
||||
## Exit Code
|
||||
1
|
||||
|
||||
## Last Output
|
||||
```
|
||||
Failed to authenticate. API Error: 401 {"type":"error","error":{"type":"authentication_error","message":"OAuth token has expired. Please obtain a new token or refresh your existing token."},"request_id":"req_011CZEr97WSkvKQrZSFbN2DA"}
|
||||
|
||||
```
|
||||
|
||||
## Context
|
||||
- Bean: nuzlocke-tracker-2561
|
||||
- Title: Supabase Auth project setup and provider config
|
||||
- Type: task
|
||||
|
||||
## Reasons for Scrapping
|
||||
|
||||
This crash was caused by an OAuth token expiration (401 authentication error), not a code bug. The agent's API credentials expired while it was running. This is an infrastructure issue that cannot be fixed by code changes - the original task simply needs to be retried with valid credentials.
|
||||
@@ -0,0 +1,47 @@
|
||||
---
|
||||
# nuzlocke-tracker-b311
|
||||
title: Backend auth middleware and JWT verification
|
||||
status: completed
|
||||
type: task
|
||||
priority: normal
|
||||
created_at: 2026-03-20T15:28:13Z
|
||||
updated_at: 2026-03-20T20:11:23Z
|
||||
parent: nuzlocke-tracker-d98o
|
||||
blocked_by:
|
||||
- nuzlocke-tracker-2561
|
||||
---
|
||||
|
||||
Add Supabase JWT verification to the FastAPI backend. Create a reusable dependency that extracts and validates the Bearer token, resolves the current user, and provides it to endpoints. Protect all write endpoints (POST/PUT/DELETE) while leaving read endpoints open.
|
||||
|
||||
## Checklist
|
||||
- [x] Add python-jose[cryptography] or PyJWT dependency
|
||||
- [x] Create auth dependency that extracts Bearer token from Authorization header
|
||||
- [x] Verify JWT against Supabase JWT secret
|
||||
- [x] Create `get_current_user` dependency (returns User or None)
|
||||
- [x] Create `require_auth` dependency (raises 401 if not authenticated)
|
||||
- [x] Apply `require_auth` to all write endpoints (POST, PUT, DELETE)
|
||||
- [x] Add tests for auth middleware (valid token, expired token, missing token)
|
||||
|
||||
|
||||
## Summary of Changes
|
||||
|
||||
Added JWT authentication middleware to the FastAPI backend:
|
||||
|
||||
- Added `PyJWT==2.10.1` dependency to `pyproject.toml`
|
||||
- Added Supabase config fields (`supabase_url`, `supabase_anon_key`, `supabase_jwt_secret`) to `core/config.py`
|
||||
- Created `core/auth.py` with:
|
||||
- `AuthUser` dataclass for authenticated user info
|
||||
- `_extract_token()` to parse Bearer tokens from Authorization header
|
||||
- `_verify_jwt()` to validate tokens against Supabase JWT secret (HS256 with "authenticated" audience)
|
||||
- `get_current_user()` dependency that returns `AuthUser | None`
|
||||
- `require_auth()` dependency that raises 401 if not authenticated
|
||||
- Applied `require_auth` to all write endpoints (POST, PUT, PATCH, DELETE) in:
|
||||
- `runs.py` (3 endpoints)
|
||||
- `encounters.py` (4 endpoints)
|
||||
- `genlockes.py` (7 endpoints)
|
||||
- `bosses.py` (9 endpoints)
|
||||
- `journal_entries.py` (3 endpoints)
|
||||
- `games.py` (9 endpoints)
|
||||
- Added `tests/test_auth.py` with tests for valid/expired/invalid/missing tokens
|
||||
- Updated `tests/conftest.py` with `auth_client` fixture for tests requiring authentication
|
||||
- Updated `test_games.py` and `test_runs.py` to use `auth_client` for write operations
|
||||
@@ -0,0 +1,37 @@
|
||||
---
|
||||
# nuzlocke-tracker-bnhh
|
||||
title: User model, run ownership, and visibility migration
|
||||
status: completed
|
||||
type: task
|
||||
priority: normal
|
||||
created_at: 2026-03-20T15:28:18Z
|
||||
updated_at: 2026-03-20T20:16:39Z
|
||||
parent: nuzlocke-tracker-d98o
|
||||
blocked_by:
|
||||
- nuzlocke-tracker-2561
|
||||
---
|
||||
|
||||
Create a User model synced from Supabase Auth. Add owner_id FK to runs table. Add visibility column (public/private) to runs with default public. Existing runs will have NULL owner_id (unowned).
|
||||
|
||||
## Checklist
|
||||
- [x] Create User model (id matches Supabase user UUID, email, display_name, created_at)
|
||||
- [x] Alembic migration: create users table
|
||||
- [x] Alembic migration: add owner_id (nullable FK to users) and visibility (enum: public/private, default public) to runs table
|
||||
- [x] Update Run model with owner relationship and visibility field
|
||||
- [x] Create user sync endpoint or webhook (on first login, upsert user record from Supabase JWT claims)
|
||||
- [x] Update RunResponse schema to include owner and visibility
|
||||
- [x] Add visibility enforcement: private runs return 403 unless requester is owner
|
||||
|
||||
|
||||
## Summary of Changes
|
||||
|
||||
- Created `User` model in `backend/src/app/models/user.py` with UUID primary key (matching Supabase), email, display_name, and created_at fields
|
||||
- Added Alembic migrations: `n5c6d7e8f9a0_create_users_table.py` and `o6d7e8f9a0b1_add_owner_and_visibility_to_runs.py`
|
||||
- Updated `NuzlockeRun` model with `owner_id` FK, `visibility` enum (public/private), and `owner` relationship
|
||||
- Created `POST /users/me` endpoint for user sync on first login (upserts from JWT claims)
|
||||
- Added `GET /users/me` and `PATCH /users/me` for user profile management
|
||||
- Updated `RunResponse` and `RunDetailResponse` schemas with `owner` and `visibility` fields
|
||||
- Implemented visibility enforcement in `list_runs`, `get_run`, `update_run`, and `delete_run`
|
||||
- Private runs return 403 unless requester is owner
|
||||
- Unowned runs (legacy) remain accessible to all
|
||||
- Run list filters to show only public runs + user's own private runs
|
||||
11
.beans/archive/nuzlocke-tracker-bw1m--errors.md
Normal file
11
.beans/archive/nuzlocke-tracker-bw1m--errors.md
Normal file
@@ -0,0 +1,11 @@
|
||||
---
|
||||
# nuzlocke-tracker-bw1m
|
||||
title: Errors
|
||||
status: completed
|
||||
type: epic
|
||||
priority: normal
|
||||
created_at: 2026-03-20T15:19:43Z
|
||||
updated_at: 2026-03-20T15:39:27Z
|
||||
---
|
||||
|
||||
Container for crash and blocker beans created by Talos.
|
||||
@@ -0,0 +1,32 @@
|
||||
---
|
||||
# nuzlocke-tracker-cm1c
|
||||
title: 'Crash: Crash: Supabase Auth project setup and provider config'
|
||||
status: completed
|
||||
type: bug
|
||||
priority: high
|
||||
created_at: 2026-03-20T19:12:59Z
|
||||
updated_at: 2026-03-20T19:19:28Z
|
||||
parent: nuzlocke-tracker-bw1m
|
||||
blocking:
|
||||
- nuzlocke-tracker-a8q0
|
||||
---
|
||||
|
||||
Agent crashed while working on nuzlocke-tracker-a8q0.
|
||||
|
||||
## Exit Code
|
||||
1
|
||||
|
||||
## Last Output
|
||||
```
|
||||
Failed to authenticate. API Error: 401 {"type":"error","error":{"type":"authentication_error","message":"OAuth token has expired. Please obtain a new token or refresh your existing token."},"request_id":"req_011CZEs55SvwXFYVzyWoU1B9"}
|
||||
|
||||
```
|
||||
|
||||
## Context
|
||||
- Bean: nuzlocke-tracker-a8q0
|
||||
- Title: Crash: Supabase Auth project setup and provider config
|
||||
- Type: bug
|
||||
|
||||
## Reasons for Scrapping
|
||||
|
||||
This crash was caused by an OAuth token expiration (401 authentication error), not a code bug. The agent's API credentials expired while it was running. This is an infrastructure issue that cannot be fixed by code changes - the original task simply needs to be retried with valid credentials.
|
||||
@@ -0,0 +1,38 @@
|
||||
---
|
||||
# nuzlocke-tracker-d5ht
|
||||
title: 'Bug: TypeScript build fails due to optional property type mismatches in journal components'
|
||||
status: completed
|
||||
type: bug
|
||||
priority: high
|
||||
tags:
|
||||
- failed
|
||||
created_at: 2026-03-20T15:39:00Z
|
||||
updated_at: 2026-03-20T19:17:34Z
|
||||
parent: nuzlocke-tracker-bw1m
|
||||
---
|
||||
|
||||
The frontend TypeScript build fails with 3 errors due to `exactOptionalPropertyTypes` being enabled.
|
||||
|
||||
## Errors
|
||||
|
||||
1. `JournalEntryPage.tsx:76` - `bossResults` and `bosses` props passed as `undefined` to `JournalEditor`
|
||||
2. `JournalEntryPage.tsx:92` - `bossResult` and `boss` props passed as `undefined` to `JournalEntryView`
|
||||
3. `RunEncounters.tsx:1170` - `bossResults` and `bosses` props passed as `undefined` to `JournalSection`
|
||||
|
||||
## Root Cause
|
||||
|
||||
Optional props in interfaces are declared as `prop?: Type` but callers pass `undefined` values from React Query hooks. With `exactOptionalPropertyTypes: true`, TypeScript requires `prop?: Type | undefined` to allow explicit `undefined` values.
|
||||
|
||||
## Fix
|
||||
|
||||
Update the interfaces in these files:
|
||||
- `JournalEditor.tsx` lines 9-10: change to `bossResults?: BossResult[] | undefined` and `bosses?: BossBattle[] | undefined`
|
||||
- `JournalEntryView.tsx` lines 8-9: change to `bossResult?: BossResult | null | undefined` and `boss?: BossBattle | null | undefined`
|
||||
- `JournalSection.tsx` lines 9-10: change to `bossResults?: BossResult[] | undefined` and `bosses?: BossBattle[] | undefined`
|
||||
|
||||
## Summary of Changes
|
||||
|
||||
TypeScript build errors fixed by adding `| undefined` to optional property types in journal components:
|
||||
- `JournalEditor.tsx`: `bossResults` and `bosses` props
|
||||
- `JournalEntryView.tsx`: `bossResult` and `boss` props
|
||||
- `JournalSection.tsx`: `bossResults` and `bosses` props
|
||||
@@ -0,0 +1,69 @@
|
||||
---
|
||||
# nuzlocke-tracker-d68l
|
||||
title: 'Frontend: Journal entry editor and list view'
|
||||
status: completed
|
||||
type: task
|
||||
priority: normal
|
||||
created_at: 2026-03-20T15:15:55Z
|
||||
updated_at: 2026-03-20T15:37:39Z
|
||||
parent: nuzlocke-tracker-mz16
|
||||
blocked_by:
|
||||
- nuzlocke-tracker-vmto
|
||||
---
|
||||
|
||||
Create the frontend UI for writing and viewing journal entries.
|
||||
|
||||
## Design Decisions
|
||||
- Plain markdown textarea (no WYSIWYG)
|
||||
- Images via markdown URL syntax (``)
|
||||
- Blank slate — no templates
|
||||
- Private only (no sharing UI)
|
||||
|
||||
## Checklist
|
||||
|
||||
- [x] Add `JournalEntry` TypeScript types to `frontend/src/types/`
|
||||
- [x] Create API client functions for journal CRUD
|
||||
- [x] Create `JournalList` component — chronological list of entries for a run
|
||||
- Show title, date, preview snippet, and linked boss (if any)
|
||||
- Link each entry to its detail/edit view
|
||||
- [x] Create `JournalEditor` component — markdown textarea with title input
|
||||
- Optional boss result selector dropdown (link entry to a boss battle)
|
||||
- Preview tab to render markdown
|
||||
- Save and delete actions
|
||||
- [x] Create `JournalEntryView` component — rendered markdown display
|
||||
- [x] Add journal section/tab to the run detail page
|
||||
- [x] Add route for journal entry detail/edit view
|
||||
|
||||
|
||||
## Summary of Changes
|
||||
|
||||
Implemented the frontend journal entry editor and list view with the following components:
|
||||
|
||||
**Types created:**
|
||||
- `frontend/src/types/journal.ts` - TypeScript types for JournalEntry, CreateJournalEntryInput, UpdateJournalEntryInput
|
||||
|
||||
**API client created:**
|
||||
- `frontend/src/api/journal.ts` - CRUD functions for journal entries
|
||||
- `frontend/src/hooks/useJournal.ts` - React Query hooks for journal data fetching and mutations
|
||||
|
||||
**Components created:**
|
||||
- `frontend/src/components/journal/JournalList.tsx` - Chronological list of entries with title, date, preview snippet, and linked boss display
|
||||
- `frontend/src/components/journal/JournalEditor.tsx` - Markdown textarea with title input, boss result selector, write/preview tabs, save/delete actions
|
||||
- `frontend/src/components/journal/JournalEntryView.tsx` - Rendered markdown display with entry metadata
|
||||
- `frontend/src/components/journal/JournalSection.tsx` - Wrapper component for embedding in RunEncounters page
|
||||
|
||||
**Pages created:**
|
||||
- `frontend/src/pages/JournalEntryPage.tsx` - Standalone page for viewing/editing a single journal entry
|
||||
|
||||
**Modified files:**
|
||||
- `frontend/src/types/index.ts` - Added journal type exports
|
||||
- `frontend/src/pages/index.ts` - Added JournalEntryPage export
|
||||
- `frontend/src/App.tsx` - Added route `/runs/:runId/journal/:entryId`
|
||||
- `frontend/src/pages/RunEncounters.tsx` - Added Encounters/Journal tab navigation with JournalSection integration
|
||||
|
||||
**Features:**
|
||||
- Tab navigation in run detail page to switch between Encounters and Journal views
|
||||
- Create new journal entries with markdown content and optional boss battle linking
|
||||
- Edit and delete existing entries
|
||||
- Write/Preview toggle in editor
|
||||
- Rendered markdown display with full prose styling
|
||||
@@ -0,0 +1,92 @@
|
||||
---
|
||||
# nuzlocke-tracker-d98o
|
||||
title: User Account integration
|
||||
status: completed
|
||||
type: epic
|
||||
priority: normal
|
||||
created_at: 2026-02-04T16:17:01Z
|
||||
updated_at: 2026-03-20T20:16:30Z
|
||||
blocking:
|
||||
- nuzlocke-tracker-0jec
|
||||
---
|
||||
|
||||
Enable user accounts so players can track multiple Nuzlocke runs, access them from any device, and view detailed statistics across all their playthroughs.
|
||||
|
||||
## Goals
|
||||
- Users can create accounts and log in securely
|
||||
- Support social login providers for frictionless onboarding
|
||||
- Each user can have multiple runs (no longer single-user assumption)
|
||||
- Provide an overview dashboard of all runs
|
||||
- Provide detailed statistics aggregated across all runs
|
||||
|
||||
## Features
|
||||
|
||||
### Authentication
|
||||
- [ ] Email/password registration and login
|
||||
- [ ] Social login with Google
|
||||
- [ ] Social login with Apple
|
||||
- [ ] Password reset flow via email
|
||||
- [ ] Session management (remember me, logout)
|
||||
- [ ] Secure token handling (JWT or session-based)
|
||||
|
||||
### User Profile
|
||||
- [ ] Basic profile info (display name, avatar)
|
||||
- [ ] Account settings page
|
||||
- [ ] Delete account option (with data export)
|
||||
|
||||
### Multi-Run Support
|
||||
- [x] Associate runs with user accounts
|
||||
- [ ] Users can have unlimited runs
|
||||
- [ ] Migrate any existing local/anonymous runs to account
|
||||
- [x] Run visibility settings (public by default, can be set to private)
|
||||
|
||||
### Runs Overview Page
|
||||
- [ ] Dashboard showing all user's runs
|
||||
- [ ] Display per run: game, start date, status (active/completed/abandoned), team snapshot
|
||||
- [ ] Filter/sort runs by game, status, date
|
||||
- [ ] Quick actions: continue run, view details, archive
|
||||
- [ ] Visual indicator for currently active run(s)
|
||||
- [ ] Create new run button
|
||||
|
||||
### Detailed Stats Page
|
||||
- [ ] Aggregate statistics across all runs:
|
||||
- [ ] Total runs started / completed / abandoned
|
||||
- [ ] Total Pokémon caught / lost
|
||||
- [ ] Favorite games (most runs)
|
||||
- [ ] Average run completion rate
|
||||
- [ ] Longest surviving Pokémon across runs
|
||||
- [ ] Most common cause of death
|
||||
- [ ] Per-game statistics breakdown
|
||||
- [ ] Historical timeline of runs
|
||||
- [ ] Achievements/milestones (e.g., "Completed 5 runs", "No deaths in a run")
|
||||
|
||||
## Technical Considerations
|
||||
- Backend: Add user model, auth middleware, update all run endpoints
|
||||
- Frontend: Auth context/provider, protected routes, login/register forms
|
||||
- Database: Users table, user_id foreign key on runs
|
||||
- Consider OAuth libraries (e.g., Authlib for Python, or Auth0/Firebase Auth)
|
||||
- GDPR considerations for EU users (data export, deletion)
|
||||
|
||||
## Dependencies
|
||||
- Requires MVP core features to be functional first
|
||||
- API endpoints need user-scoping
|
||||
- Database schema needs user table and migrations
|
||||
|
||||
## Out of Scope (for now)
|
||||
- Social features (sharing runs, leaderboards)
|
||||
- Team collaboration
|
||||
- Public run profiles
|
||||
|
||||
## Decisions (resolved 2026-03-20)
|
||||
|
||||
- **Auth provider:** Supabase Auth (third-party, self-hostable, AWS-compatible)
|
||||
- **Social login:** Google + Discord
|
||||
- **Run migration:** Existing runs stay unowned, admin assigns manually post-signup
|
||||
- **Auth scope:** Write operations require auth; per-run public/private visibility toggle
|
||||
- **Editor for journal (related):** Plain markdown
|
||||
|
||||
## Execution Order
|
||||
|
||||
1. `nuzlocke-tracker-2561` — Supabase project setup (unblocked)
|
||||
2. `nuzlocke-tracker-b311` + `nuzlocke-tracker-bnhh` + `nuzlocke-tracker-l9xh` — Backend auth, user model, frontend auth (parallel, after setup)
|
||||
3. `nuzlocke-tracker-k1l1` — Run ownership + visibility (after all above)
|
||||
@@ -0,0 +1,35 @@
|
||||
---
|
||||
# nuzlocke-tracker-evc8
|
||||
title: 'Crash: Crash: Backend auth middleware and JWT verification'
|
||||
status: completed
|
||||
type: bug
|
||||
priority: high
|
||||
created_at: 2026-03-20T19:13:03Z
|
||||
updated_at: 2026-03-20T19:20:46Z
|
||||
parent: nuzlocke-tracker-bw1m
|
||||
blocking:
|
||||
- nuzlocke-tracker-9zpm
|
||||
---
|
||||
|
||||
Agent crashed while working on nuzlocke-tracker-9zpm.
|
||||
|
||||
## Exit Code
|
||||
1
|
||||
|
||||
## Last Output
|
||||
```
|
||||
Failed to authenticate. API Error: 401 {"type":"error","error":{"type":"authentication_error","message":"OAuth token has expired. Please obtain a new token or refresh your existing token."},"request_id":"req_011CZEs5LCgi1Zh6MdRencGW"}
|
||||
|
||||
```
|
||||
|
||||
## Context
|
||||
- Bean: nuzlocke-tracker-9zpm
|
||||
- Title: Crash: Backend auth middleware and JWT verification
|
||||
- Type: bug
|
||||
|
||||
|
||||
## Reasons for Scrapping
|
||||
|
||||
This is not a code bug. The crash occurred because the agent's OAuth token to the Anthropic API expired during execution. This is an infrastructure/authentication issue, not an actionable bug in the nuzlocke-tracker codebase.
|
||||
|
||||
The original task (`nuzlocke-tracker-b311`) can proceed once its actual prerequisite (`nuzlocke-tracker-2561` - Supabase Auth setup) is completed.
|
||||
@@ -0,0 +1,32 @@
|
||||
---
|
||||
# nuzlocke-tracker-fbcs
|
||||
title: 'Crash: Add detailed boss pokemon information (ability, item, nature, moveset)'
|
||||
status: completed
|
||||
type: bug
|
||||
priority: high
|
||||
tags:
|
||||
- failed
|
||||
created_at: 2026-03-20T19:01:15Z
|
||||
updated_at: 2026-03-20T19:37:36Z
|
||||
parent: nuzlocke-tracker-bw1m
|
||||
blocking:
|
||||
- nuzlocke-tracker-nvd6
|
||||
---
|
||||
|
||||
Agent crashed while working on nuzlocke-tracker-nvd6.
|
||||
|
||||
## Exit Code
|
||||
1
|
||||
|
||||
## Last Output
|
||||
```
|
||||
Failed to authenticate. API Error: 401 {"type":"error","error":{"type":"authentication_error","message":"OAuth token has expired. Please obtain a new token or refresh your existing token."},"request_id":"req_011CZErBAtQPvCEsAZyGSYmc"}
|
||||
|
||||
```
|
||||
|
||||
## Context
|
||||
- Bean: nuzlocke-tracker-nvd6
|
||||
- Title: Add detailed boss pokemon information (ability, item, nature, moveset)
|
||||
- Type: feature
|
||||
|
||||
## Resolution\n\nThe crash was caused by OAuth token expiration. Work completed via nuzlocke-tracker-n926.
|
||||
@@ -0,0 +1,34 @@
|
||||
---
|
||||
# nuzlocke-tracker-gez0
|
||||
title: 'Crash: User model, run ownership, and visibility migration'
|
||||
status: scrapped
|
||||
type: bug
|
||||
priority: high
|
||||
tags:
|
||||
- failed
|
||||
created_at: 2026-03-20T19:00:55Z
|
||||
updated_at: 2026-03-20T19:21:18Z
|
||||
parent: nuzlocke-tracker-bw1m
|
||||
blocking:
|
||||
- nuzlocke-tracker-bnhh
|
||||
---
|
||||
|
||||
Agent crashed while working on nuzlocke-tracker-bnhh.
|
||||
|
||||
## Exit Code
|
||||
1
|
||||
|
||||
## Last Output
|
||||
```
|
||||
Failed to authenticate. API Error: 401 {"type":"error","error":{"type":"authentication_error","message":"OAuth token has expired. Please obtain a new token or refresh your existing token."},"request_id":"req_011CZEr9igHnUG4eR8RFWUEj"}
|
||||
|
||||
```
|
||||
|
||||
## Context
|
||||
- Bean: nuzlocke-tracker-bnhh
|
||||
- Title: User model, run ownership, and visibility migration
|
||||
- Type: task
|
||||
|
||||
## Reasons for Scrapping
|
||||
|
||||
This crash was caused by an expired OAuth token during agent execution - a transient session management issue, not a code bug. The underlying task (nuzlocke-tracker-bnhh) remains blocked by nuzlocke-tracker-2561 (Supabase setup) and can be resumed once that prerequisite is complete.
|
||||
@@ -0,0 +1,34 @@
|
||||
---
|
||||
# nuzlocke-tracker-jmkf
|
||||
title: 'Crash: Run ownership assignment and visibility toggle'
|
||||
status: completed
|
||||
type: bug
|
||||
priority: high
|
||||
created_at: 2026-03-20T19:01:04Z
|
||||
updated_at: 2026-03-20T19:28:57Z
|
||||
parent: nuzlocke-tracker-bw1m
|
||||
blocking:
|
||||
- nuzlocke-tracker-k1l1
|
||||
---
|
||||
|
||||
Agent crashed while working on nuzlocke-tracker-k1l1.
|
||||
|
||||
## Exit Code
|
||||
1
|
||||
|
||||
## Last Output
|
||||
```
|
||||
Failed to authenticate. API Error: 401 {"type":"error","error":{"type":"authentication_error","message":"OAuth token has expired. Please obtain a new token or refresh your existing token."},"request_id":"req_011CZErAP1dbTeqSqRccKWyb"}
|
||||
|
||||
```
|
||||
|
||||
## Context
|
||||
- Bean: nuzlocke-tracker-k1l1
|
||||
- Title: Run ownership assignment and visibility toggle
|
||||
- Type: feature
|
||||
|
||||
## Resolution
|
||||
|
||||
This crash was caused by OAuth token expiration during agent execution, not a code bug. The token expired mid-session, causing the API to return a 401 authentication error. No code changes are required.
|
||||
|
||||
The original feature (nuzlocke-tracker-k1l1) remains blocked by its dependencies (b311 and bnhh).
|
||||
@@ -0,0 +1,40 @@
|
||||
---
|
||||
# nuzlocke-tracker-k1l1
|
||||
title: Run ownership assignment and visibility toggle
|
||||
status: completed
|
||||
type: feature
|
||||
priority: normal
|
||||
created_at: 2026-03-20T15:28:27Z
|
||||
updated_at: 2026-03-20T20:21:01Z
|
||||
parent: nuzlocke-tracker-d98o
|
||||
blocked_by:
|
||||
- nuzlocke-tracker-b311
|
||||
- nuzlocke-tracker-bnhh
|
||||
- nuzlocke-tracker-l9xh
|
||||
---
|
||||
|
||||
Wire up run ownership in the UI. New runs created by logged-in users are automatically assigned to them. Add a visibility toggle (public/private) to run settings. Update run list to show owned runs and public runs separately.
|
||||
|
||||
## Checklist
|
||||
- [x] Auto-assign owner_id when creating a new run (if authenticated)
|
||||
- [x] Add visibility toggle to run settings/edit page
|
||||
- [x] Update run list view: show 'My Runs' section for authenticated users
|
||||
- [x] Show public/private badge on run cards
|
||||
- [x] Enforce visibility on frontend (don't show edit controls for non-owned runs)
|
||||
- [x] Admin script/endpoint to assign existing unowned runs to a user by ID
|
||||
|
||||
## Summary of Changes
|
||||
|
||||
### Frontend
|
||||
- Updated `NuzlockeRun` type to include `visibility` (public/private) and `owner` fields
|
||||
- Updated `CreateRunInput` and `UpdateRunInput` to support visibility setting
|
||||
- **RunList.tsx**: Added "My Runs" and "Public Runs" sections for authenticated users, with private badge on owned runs
|
||||
- **RunDashboard.tsx**: Added visibility toggle dropdown in settings, restricted edit controls to run owners
|
||||
- **NewRun.tsx**: Added visibility selector during run creation
|
||||
|
||||
### Backend
|
||||
- Created `scripts/assign_unowned_runs.py` admin script to migrate existing unowned runs to a user
|
||||
|
||||
### Notes
|
||||
- The backend already supported auto-assigning `owner_id` on run creation (from blocking bean)
|
||||
- Unowned runs (legacy) remain editable by anyone for backwards compatibility
|
||||
@@ -0,0 +1,41 @@
|
||||
---
|
||||
# nuzlocke-tracker-l9xh
|
||||
title: Frontend auth flow (login, signup, session management)
|
||||
status: completed
|
||||
type: feature
|
||||
priority: normal
|
||||
tags:
|
||||
- failed
|
||||
created_at: 2026-03-20T15:28:24Z
|
||||
updated_at: 2026-03-20T19:26:16Z
|
||||
parent: nuzlocke-tracker-d98o
|
||||
blocked_by:
|
||||
- nuzlocke-tracker-2561
|
||||
---
|
||||
|
||||
Add Supabase JS client to the frontend. Build login and signup pages with email/password and social login buttons (Google, Discord). Implement auth context/provider for session management, protected route wrapper, and auth-aware API client that attaches Bearer tokens.
|
||||
|
||||
## Checklist
|
||||
- [x] Install @supabase/supabase-js
|
||||
- [x] Create Supabase client singleton with env vars
|
||||
- [x] Create AuthContext/AuthProvider with session state, login, logout, signup methods
|
||||
- [x] Build login page (email/password form + Google/Discord buttons)
|
||||
- [x] Build signup page (email/password form + Google/Discord buttons)
|
||||
- [x] Add auth callback route for OAuth redirects
|
||||
- [x] Create ProtectedRoute wrapper component
|
||||
- [x] Update API client to attach Authorization header when user is logged in
|
||||
- [x] Add user menu (avatar/email, logout) to header when authenticated
|
||||
- [x] Handle token refresh automatically via Supabase client
|
||||
|
||||
## Summary of Changes
|
||||
|
||||
- Installed @supabase/supabase-js package
|
||||
- Created Supabase client singleton at `frontend/src/lib/supabase.ts`
|
||||
- Created AuthContext/AuthProvider at `frontend/src/contexts/AuthContext.tsx` with session state, login, logout, signup, and OAuth methods
|
||||
- Created Login page (`frontend/src/pages/Login.tsx`) with email/password form and Google/Discord OAuth buttons
|
||||
- Created Signup page (`frontend/src/pages/Signup.tsx`) with email/password form and Google/Discord OAuth buttons
|
||||
- Created auth callback route (`frontend/src/pages/AuthCallback.tsx`) for OAuth redirects
|
||||
- Created ProtectedRoute component (`frontend/src/components/ProtectedRoute.tsx`)
|
||||
- Updated API client to attach Authorization header automatically when user is logged in
|
||||
- Added UserMenu component to Layout header showing avatar/email and logout button
|
||||
- Token refresh is handled automatically by Supabase JS client
|
||||
@@ -0,0 +1,34 @@
|
||||
---
|
||||
# nuzlocke-tracker-ldyi
|
||||
title: 'Crash: Crash: Run ownership assignment and visibility toggle'
|
||||
status: completed
|
||||
type: bug
|
||||
priority: high
|
||||
created_at: 2026-03-20T19:13:16Z
|
||||
updated_at: 2026-03-20T19:29:03Z
|
||||
parent: nuzlocke-tracker-bw1m
|
||||
blocking:
|
||||
- nuzlocke-tracker-jmkf
|
||||
---
|
||||
|
||||
Agent crashed while working on nuzlocke-tracker-jmkf.
|
||||
|
||||
## Exit Code
|
||||
1
|
||||
|
||||
## Last Output
|
||||
```
|
||||
Failed to authenticate. API Error: 401 {"type":"error","error":{"type":"authentication_error","message":"OAuth token has expired. Please obtain a new token or refresh your existing token."},"request_id":"req_011CZEs6J7hxAdJni9KoTLcJ"}
|
||||
|
||||
```
|
||||
|
||||
## Context
|
||||
- Bean: nuzlocke-tracker-jmkf
|
||||
- Title: Crash: Run ownership assignment and visibility toggle
|
||||
- Type: bug
|
||||
|
||||
## Resolution
|
||||
|
||||
This crash was caused by OAuth token expiration during agent execution, not a code bug. The token expired mid-session, causing the API to return a 401 authentication error. No code changes are required.
|
||||
|
||||
The original feature (nuzlocke-tracker-k1l1) remains blocked by its dependencies (b311 and bnhh).
|
||||
@@ -0,0 +1,32 @@
|
||||
---
|
||||
# nuzlocke-tracker-mg99
|
||||
title: 'Crash: Add detailed boss battle information'
|
||||
status: scrapped
|
||||
type: bug
|
||||
priority: high
|
||||
created_at: 2026-03-20T19:01:08Z
|
||||
updated_at: 2026-03-20T19:29:55Z
|
||||
parent: nuzlocke-tracker-bw1m
|
||||
blocking:
|
||||
- nuzlocke-tracker-neqv
|
||||
---
|
||||
|
||||
Agent crashed while working on nuzlocke-tracker-neqv.
|
||||
|
||||
## Exit Code
|
||||
1
|
||||
|
||||
## Last Output
|
||||
```
|
||||
Failed to authenticate. API Error: 401 {"type":"error","error":{"type":"authentication_error","message":"OAuth token has expired. Please obtain a new token or refresh your existing token."},"request_id":"req_011CZErAh36SY2uCVFvs6pe8"}
|
||||
|
||||
```
|
||||
|
||||
## Context
|
||||
- Bean: nuzlocke-tracker-neqv
|
||||
- Title: Add detailed boss battle information
|
||||
- Type: epic
|
||||
|
||||
## Reasons for Scrapping
|
||||
|
||||
This is a crash report bean created when a previous agent session expired due to OAuth token timeout. This is a transient infrastructure issue, not a code bug. The original work is tracked in the child beans of nuzlocke-tracker-neqv.
|
||||
@@ -0,0 +1,32 @@
|
||||
---
|
||||
# nuzlocke-tracker-mygi
|
||||
title: 'Crash: Crash: Add detailed boss battle information'
|
||||
status: completed
|
||||
type: bug
|
||||
priority: high
|
||||
created_at: 2026-03-20T19:13:19Z
|
||||
updated_at: 2026-03-20T19:30:01Z
|
||||
parent: nuzlocke-tracker-bw1m
|
||||
blocking:
|
||||
- nuzlocke-tracker-mg99
|
||||
---
|
||||
|
||||
Agent crashed while working on nuzlocke-tracker-mg99.
|
||||
|
||||
## Exit Code
|
||||
1
|
||||
|
||||
## Last Output
|
||||
```
|
||||
Failed to authenticate. API Error: 401 {"type":"error","error":{"type":"authentication_error","message":"OAuth token has expired. Please obtain a new token or refresh your existing token."},"request_id":"req_011CZEs6XKwjZQ4HoyPLXVxp"}
|
||||
|
||||
```
|
||||
|
||||
## Context
|
||||
- Bean: nuzlocke-tracker-mg99
|
||||
- Title: Crash: Add detailed boss battle information
|
||||
- Type: bug
|
||||
|
||||
## Reasons for Scrapping
|
||||
|
||||
This is a crash report bean created when a previous agent session expired due to OAuth token timeout. This is a transient infrastructure issue, not a code bug. The original work is tracked in the child beans of nuzlocke-tracker-neqv.
|
||||
@@ -0,0 +1,38 @@
|
||||
---
|
||||
# nuzlocke-tracker-mz16
|
||||
title: Session Journal / Blog Posts
|
||||
status: completed
|
||||
type: epic
|
||||
priority: normal
|
||||
created_at: 2026-02-19T07:43:05Z
|
||||
updated_at: 2026-03-20T15:37:21Z
|
||||
---
|
||||
|
||||
Let users tell the story of their nuzlocke run through session journal entries (blog posts).
|
||||
|
||||
Nuzlockes are inherently story-driven — encounters you first think are weak become the star of the show, a needed sacrifice lets the run survive, one crit in a boss battle means defeat. Users should be able to capture those moments.
|
||||
|
||||
## Concept
|
||||
|
||||
For each play session, users can write a short post to document what happened. Posts can:
|
||||
|
||||
- Include rich text / markdown content
|
||||
- Embed screenshots and images
|
||||
- Automatically link to their current team (or a subset of it)
|
||||
- Reference deaths, new encounters, and other run events
|
||||
- Be tied to a specific run
|
||||
|
||||
The journal becomes a chronological narrative of the nuzlocke run, with game data woven in automatically.
|
||||
|
||||
## Decisions
|
||||
|
||||
- **Editor:** Plain markdown textarea with preview
|
||||
- **Images:** Via markdown URL syntax (no uploads)
|
||||
- **Run linkage:** Entries belong to a run, optionally linked to a boss battle
|
||||
- **Visibility:** Private only (no sharing — deferred until user accounts exist)
|
||||
- **Templates:** Blank slate — no templates
|
||||
|
||||
## Success Criteria
|
||||
|
||||
- [x] Backend: journal entries CRUD API is complete (`nuzlocke-tracker-vmto`)
|
||||
- [x] Frontend: journal list, editor, and view are functional (`nuzlocke-tracker-d68l`)
|
||||
@@ -0,0 +1,30 @@
|
||||
---
|
||||
# nuzlocke-tracker-n926
|
||||
title: 'Crash: Crash: Add detailed boss pokemon information (ability, item, nature, moveset)'
|
||||
status: completed
|
||||
type: bug
|
||||
priority: high
|
||||
created_at: 2026-03-20T19:13:24Z
|
||||
updated_at: 2026-03-20T19:37:57Z
|
||||
parent: nuzlocke-tracker-bw1m
|
||||
blocking:
|
||||
- nuzlocke-tracker-fbcs
|
||||
---
|
||||
|
||||
Agent crashed while working on nuzlocke-tracker-fbcs.
|
||||
|
||||
## Exit Code
|
||||
1
|
||||
|
||||
## Last Output
|
||||
```
|
||||
Failed to authenticate. API Error: 401 {"type":"error","error":{"type":"authentication_error","message":"OAuth token has expired. Please obtain a new token or refresh your existing token."},"request_id":"req_011CZEs6sYsQqU6dmmpwcmTM"}
|
||||
|
||||
```
|
||||
|
||||
## Context
|
||||
- Bean: nuzlocke-tracker-fbcs
|
||||
- Title: Crash: Add detailed boss pokemon information (ability, item, nature, moveset)
|
||||
- Type: bug
|
||||
|
||||
## Resolution\n\nThe crash was caused by OAuth token expiration. Resumed work and completed the original feature (nuzlocke-tracker-nvd6).
|
||||
@@ -0,0 +1,36 @@
|
||||
---
|
||||
# nuzlocke-tracker-ndpz
|
||||
title: 'Crash: User Account integration'
|
||||
status: completed
|
||||
type: bug
|
||||
priority: high
|
||||
tags:
|
||||
- failed
|
||||
created_at: 2026-03-20T19:00:42Z
|
||||
updated_at: 2026-03-20T19:18:25Z
|
||||
parent: nuzlocke-tracker-bw1m
|
||||
blocking:
|
||||
- nuzlocke-tracker-d98o
|
||||
---
|
||||
|
||||
Agent crashed while working on nuzlocke-tracker-d98o.
|
||||
|
||||
## Exit Code
|
||||
1
|
||||
|
||||
## Last Output
|
||||
```
|
||||
Failed to authenticate. API Error: 401 {"type":"error","error":{"type":"authentication_error","message":"OAuth token has expired. Please obtain a new token or refresh your existing token."},"request_id":"req_011CZEr8m1A9hiKCVyBgkCJB"}
|
||||
|
||||
```
|
||||
|
||||
## Context
|
||||
- Bean: nuzlocke-tracker-d98o
|
||||
- Title: User Account integration
|
||||
- Type: epic
|
||||
|
||||
## Resolution
|
||||
|
||||
This crash was caused by Claude's OAuth token expiring during an agent session. This is an environmental/infrastructure issue, not a code bug. The token has been refreshed by starting a new agent session.
|
||||
|
||||
No code changes required.
|
||||
@@ -0,0 +1,17 @@
|
||||
---
|
||||
# nuzlocke-tracker-neqv
|
||||
title: Add detailed boss battle information
|
||||
status: completed
|
||||
type: epic
|
||||
priority: low
|
||||
created_at: 2026-02-08T11:21:22Z
|
||||
updated_at: 2026-03-20T20:25:11Z
|
||||
---
|
||||
|
||||
Enhance boss battles with more detailed information. Split into child beans:
|
||||
|
||||
## Success Criteria
|
||||
- [x] Moves and abilities tables seeded (names + introduced generation)
|
||||
- [x] Boss pokemon entries support ability, held item, nature, and moveset
|
||||
- [x] Boss battle results can capture a team snapshot
|
||||
- [ ] (Future) Moves/abilities enriched with generation-specific stats
|
||||
@@ -0,0 +1,53 @@
|
||||
---
|
||||
# nuzlocke-tracker-nvd6
|
||||
title: Add detailed boss pokemon information (ability, item, nature, moveset)
|
||||
status: completed
|
||||
type: feature
|
||||
priority: low
|
||||
tags:
|
||||
- failed
|
||||
created_at: 2026-03-20T15:11:50Z
|
||||
updated_at: 2026-03-20T19:37:18Z
|
||||
parent: nuzlocke-tracker-neqv
|
||||
blocked_by:
|
||||
- nuzlocke-tracker-vc5o
|
||||
---
|
||||
|
||||
Add optional detail fields to boss pokemon entries: ability, held item, nature, and moveset (up to 4 moves).
|
||||
|
||||
## Approach
|
||||
- Ability and moves reference the seeded `moves`/`abilities` tables via FK (hybrid approach — names only, no gen-specific stats yet)
|
||||
- Held item and nature stored as plain strings (items table can come later; natures are static)
|
||||
|
||||
## Checklist
|
||||
- [x] **Migration**: Add columns to `boss_pokemon` — `ability_id` (FK|null), `held_item` (str|null), `nature` (str|null), `move1_id`–`move4_id` (FK|null)
|
||||
- [x] **Model**: Update `BossPokemon` in `backend/src/app/models/boss_pokemon.py` with relationships
|
||||
- [x] **Schemas**: Update `BossPokemonResponse` and `BossPokemonInput` in `backend/src/app/schemas/boss.py`
|
||||
- [x] **Admin UI**: Add fields to `BossTeamEditor.tsx` (ability autocomplete, item input, nature dropdown, 4 move autocomplete inputs)
|
||||
- [x] **Frontend types**: Update `BossPokemon` in `frontend/src/types/game.ts` and admin input types
|
||||
- [x] **Frontend display**: Show details on boss cards in `RunEncounters.tsx` and `BossDefeatModal.tsx`
|
||||
- [~] **Seed data**: (deferred) Update bulk import format to support new fields
|
||||
|
||||
## Dependencies
|
||||
- Requires moves and abilities tables to be seeded first
|
||||
|
||||
## Summary of Changes
|
||||
|
||||
### Backend
|
||||
- Created migration `l3a4b5c6d7e8_add_boss_pokemon_details.py` adding `ability_id`, `held_item`, `nature`, `move1_id`-`move4_id` columns
|
||||
- Updated `BossPokemon` model with relationships to `Ability` and `Move`
|
||||
- Updated `BossPokemonResponse` and `BossPokemonInput` schemas with detail fields
|
||||
- Created `/moves` and `/abilities` API endpoints for autocomplete search
|
||||
- Updated `set_boss_team` endpoint to handle new fields
|
||||
- Added eager loading for ability/moves in boss queries
|
||||
|
||||
### Frontend
|
||||
- Added `MoveRef` and `AbilityRef` types to game.ts
|
||||
- Extended `BossPokemon` type with detail fields
|
||||
- Extended `BossPokemonInput` admin type
|
||||
- Created `MoveSelector` and `AbilitySelector` autocomplete components
|
||||
- Updated `BossTeamEditor` with expandable detail section per pokemon
|
||||
- Updated `BossTeamPreview` and `BossDefeatModal` to display details
|
||||
|
||||
### Deferred
|
||||
- Bulk import format for seed data not updated (optional fields work with existing format)
|
||||
@@ -0,0 +1,30 @@
|
||||
---
|
||||
# nuzlocke-tracker-pl1m
|
||||
title: 'Crash: Crash: Frontend auth flow (login, signup, session management)'
|
||||
status: completed
|
||||
type: bug
|
||||
priority: high
|
||||
created_at: 2026-03-20T19:13:10Z
|
||||
updated_at: 2026-03-20T19:27:57Z
|
||||
parent: nuzlocke-tracker-bw1m
|
||||
blocking:
|
||||
- nuzlocke-tracker-8vev
|
||||
---
|
||||
|
||||
Agent crashed while working on nuzlocke-tracker-8vev.
|
||||
|
||||
## Exit Code
|
||||
1
|
||||
|
||||
## Last Output
|
||||
```
|
||||
Failed to authenticate. API Error: 401 {"type":"error","error":{"type":"authentication_error","message":"OAuth token has expired. Please obtain a new token or refresh your existing token."},"request_id":"req_011CZEs5tdpug65ZR5M3DSQS"}
|
||||
|
||||
```
|
||||
|
||||
## Context
|
||||
- Bean: nuzlocke-tracker-8vev
|
||||
- Title: Crash: Frontend auth flow (login, signup, session management)
|
||||
- Type: bug
|
||||
|
||||
## Resolution\n\nThis was an infrastructure issue (Claude API OAuth token expired), not a code bug. Continuing work on the original feature bean (nuzlocke-tracker-l9xh).
|
||||
@@ -0,0 +1,24 @@
|
||||
---
|
||||
# nuzlocke-tracker-t90q
|
||||
title: 'Crash: Backend: Journal entries model, API, and migration'
|
||||
status: completed
|
||||
type: bug
|
||||
priority: high
|
||||
created_at: 2026-03-20T15:30:02Z
|
||||
updated_at: 2026-03-20T15:39:13Z
|
||||
parent: nuzlocke-tracker-bw1m
|
||||
blocking:
|
||||
- nuzlocke-tracker-vmto
|
||||
---
|
||||
|
||||
Bean was found in 'in-progress' status on startup but no agent was running.
|
||||
This likely indicates a crash or unexpected termination.
|
||||
|
||||
Manual review required before retrying.
|
||||
|
||||
Bean: nuzlocke-tracker-vmto
|
||||
Title: Backend: Journal entries model, API, and migration
|
||||
|
||||
## Resolution
|
||||
|
||||
The underlying bean (nuzlocke-tracker-vmto) was already completed before the crash was detected. All backend work for journal entries is implemented and functional. A separate bug bean (nuzlocke-tracker-d5ht) was created for frontend TypeScript errors discovered during review.
|
||||
@@ -0,0 +1,30 @@
|
||||
---
|
||||
# nuzlocke-tracker-ueub
|
||||
title: 'Crash: Add team snapshot to boss battle results'
|
||||
status: completed
|
||||
type: bug
|
||||
priority: high
|
||||
tags:
|
||||
- failed
|
||||
created_at: 2026-03-20T19:01:23Z
|
||||
updated_at: 2026-03-20T19:41:51Z
|
||||
parent: nuzlocke-tracker-bw1m
|
||||
blocking:
|
||||
- nuzlocke-tracker-xd9j
|
||||
---
|
||||
|
||||
Agent crashed while working on nuzlocke-tracker-xd9j.
|
||||
|
||||
## Exit Code
|
||||
1
|
||||
|
||||
## Last Output
|
||||
```
|
||||
Failed to authenticate. API Error: 401 {"type":"error","error":{"type":"authentication_error","message":"OAuth token has expired. Please obtain a new token or refresh your existing token."},"request_id":"req_011CZErBmcConDqezwzK8kaP"}
|
||||
|
||||
```
|
||||
|
||||
## Context
|
||||
- Bean: nuzlocke-tracker-xd9j
|
||||
- Title: Add team snapshot to boss battle results
|
||||
- Type: feature
|
||||
@@ -0,0 +1,53 @@
|
||||
---
|
||||
# nuzlocke-tracker-vc5o
|
||||
title: Seed moves and abilities tables (names + introduced generation)
|
||||
status: completed
|
||||
type: task
|
||||
priority: normal
|
||||
created_at: 2026-03-20T15:11:44Z
|
||||
updated_at: 2026-03-20T15:25:11Z
|
||||
parent: nuzlocke-tracker-neqv
|
||||
---
|
||||
|
||||
Create and seed `moves` and `abilities` tables with name and generation data using the hybrid approach.
|
||||
|
||||
## Approach
|
||||
Seed move/ability **names** with `introduced_gen` only. Full generation-specific stats (power, accuracy, type changes, effect text) will be added in a follow-up bean.
|
||||
|
||||
This enables FK references and autocomplete from boss pokemon fields without blocking on a full moves database.
|
||||
|
||||
## Checklist
|
||||
- [x] **Migration**: Create `moves` table (`id`, `name`, `introduced_gen`, `type` optional)
|
||||
- [x] **Migration**: Create `abilities` table (`id`, `name`, `introduced_gen`)
|
||||
- [x] **Models**: Create `Move` and `Ability` SQLAlchemy models
|
||||
- [x] **Seed data**: Seed all move names with introduced generation (source: PokeAPI or Bulbapedia)
|
||||
- [x] **Seed data**: Seed all ability names with introduced generation
|
||||
- [x] **Seed script**: Add to existing seeding pipeline (`backend/src/app/seed/`)
|
||||
- [x] **Schemas**: Create basic response schemas for API consumption
|
||||
|
||||
## Summary of Changes
|
||||
|
||||
### Migration
|
||||
- Created `j1e2f3a4b5c6_add_moves_and_abilities_tables.py` migration
|
||||
- `moves` table: `id`, `name` (unique), `introduced_gen`, `type` (optional)
|
||||
- `abilities` table: `id`, `name` (unique), `introduced_gen`
|
||||
- Added indexes on `introduced_gen` for both tables
|
||||
|
||||
### Models
|
||||
- `backend/src/app/models/move.py`: `Move` SQLAlchemy model
|
||||
- `backend/src/app/models/ability.py`: `Ability` SQLAlchemy model
|
||||
- Updated `models/__init__.py` to export both
|
||||
|
||||
### Schemas
|
||||
- `backend/src/app/schemas/move.py`: `MoveResponse`, `AbilityResponse`, and paginated variants
|
||||
- Updated `schemas/__init__.py` to export all new schemas
|
||||
|
||||
### Seed Data
|
||||
- Created `backend/scripts/fetch_moves_abilities.py` to fetch data from PokeAPI
|
||||
- Generated `moves.json` (937 moves) and `abilities.json` (367 abilities)
|
||||
- Data includes name, introduced generation, and type (for moves)
|
||||
|
||||
### Seed Pipeline
|
||||
- Added `upsert_moves` and `upsert_abilities` functions to `loader.py`
|
||||
- Updated `run.py` to seed moves and abilities after Pokemon
|
||||
- Updated `verify()` to include move/ability counts
|
||||
@@ -0,0 +1,62 @@
|
||||
---
|
||||
# nuzlocke-tracker-vmto
|
||||
title: 'Backend: Journal entries model, API, and migration'
|
||||
status: completed
|
||||
type: task
|
||||
priority: normal
|
||||
tags:
|
||||
- failed
|
||||
created_at: 2026-03-20T15:15:48Z
|
||||
updated_at: 2026-03-20T15:30:47Z
|
||||
parent: nuzlocke-tracker-mz16
|
||||
---
|
||||
|
||||
Create the backend infrastructure for session journal entries.
|
||||
|
||||
## Data Model
|
||||
|
||||
`journal_entries` table:
|
||||
- `id` (UUID, PK)
|
||||
- `run_id` (FK to runs)
|
||||
- `boss_result_id` (FK to boss_results, nullable) — optional link to a boss battle
|
||||
- `title` (str, required)
|
||||
- `body` (text, required) — raw markdown content
|
||||
- `created_at`, `updated_at` (timestamps)
|
||||
|
||||
## Checklist
|
||||
|
||||
- [x] Create Alembic migration for `journal_entries` table
|
||||
- [x] Create `JournalEntry` SQLAlchemy model with relationships to `Run` and `BossResult`
|
||||
- [x] Create Pydantic schemas (`JournalEntryCreate`, `JournalEntryUpdate`, `JournalEntryResponse`)
|
||||
- [x] Create CRUD operations for journal entries
|
||||
- [x] Create API endpoints under `/runs/{run_id}/journal`:
|
||||
- `GET /` — list entries for a run (ordered by created_at desc)
|
||||
- `POST /` — create entry
|
||||
- `GET /{entry_id}` — get single entry
|
||||
- `PUT /{entry_id}` — update entry
|
||||
- `DELETE /{entry_id}` — delete entry
|
||||
- [x] Add optional `boss_result_id` query filter to GET list endpoint
|
||||
|
||||
|
||||
## Summary of Changes
|
||||
|
||||
Implemented backend infrastructure for session journal entries:
|
||||
|
||||
**Files created:**
|
||||
- `backend/src/app/alembic/versions/k2f3a4b5c6d7_add_journal_entries_table.py` - Migration creating `journal_entries` table with UUID PK, foreign keys to `nuzlocke_runs` and `boss_results`, and timestamp columns
|
||||
- `backend/src/app/models/journal_entry.py` - SQLAlchemy model with relationships to `NuzlockeRun` and `BossResult`
|
||||
- `backend/src/app/schemas/journal_entry.py` - Pydantic schemas for create, update, and response
|
||||
- `backend/src/app/api/journal_entries.py` - API endpoints for CRUD operations
|
||||
|
||||
**Files modified:**
|
||||
- `backend/src/app/models/nuzlocke_run.py` - Added `journal_entries` relationship
|
||||
- `backend/src/app/models/__init__.py` - Exported `JournalEntry`
|
||||
- `backend/src/app/schemas/__init__.py` - Exported journal entry schemas
|
||||
- `backend/src/app/api/routes.py` - Registered journal entries router
|
||||
|
||||
**API Endpoints:**
|
||||
- `GET /runs/{run_id}/journal` - List entries (supports `boss_result_id` filter)
|
||||
- `POST /runs/{run_id}/journal` - Create entry
|
||||
- `GET /runs/{run_id}/journal/{entry_id}` - Get single entry
|
||||
- `PUT /runs/{run_id}/journal/{entry_id}` - Update entry
|
||||
- `DELETE /runs/{run_id}/journal/{entry_id}` - Delete entry
|
||||
@@ -0,0 +1,39 @@
|
||||
---
|
||||
# nuzlocke-tracker-vw1z
|
||||
title: 'Crash: Crash: Add team snapshot to boss battle results'
|
||||
status: completed
|
||||
type: bug
|
||||
priority: high
|
||||
created_at: 2026-03-20T19:13:27Z
|
||||
updated_at: 2026-03-20T19:41:58Z
|
||||
parent: nuzlocke-tracker-bw1m
|
||||
blocking:
|
||||
- nuzlocke-tracker-ueub
|
||||
---
|
||||
|
||||
Agent crashed while working on nuzlocke-tracker-ueub.
|
||||
|
||||
## Exit Code
|
||||
1
|
||||
|
||||
## Last Output
|
||||
```
|
||||
Failed to authenticate. API Error: 401 {"type":"error","error":{"type":"authentication_error","message":"OAuth token has expired. Please obtain a new token or refresh your existing token."},"request_id":"req_011CZEs79fEcc7KikDZH5tuz"}
|
||||
|
||||
```
|
||||
|
||||
## Context
|
||||
- Bean: nuzlocke-tracker-ueub
|
||||
- Title: Crash: Add team snapshot to boss battle results
|
||||
- Type: bug
|
||||
|
||||
## Summary of Changes
|
||||
|
||||
This crash was caused by an OAuth token expiration, not a code issue. The original feature (add team snapshot to boss battle results) has been implemented:
|
||||
|
||||
- Created `boss_result_team` table migration
|
||||
- Added `BossResultTeam` model with relationships
|
||||
- Updated schemas with `BossResultTeamMemberInput` and `BossResultTeamMemberResponse`
|
||||
- Updated `POST /runs/{run_id}/boss-results` API to accept and save team snapshots
|
||||
- Updated `BossDefeatModal` with checkboxes for alive team members with level input
|
||||
- Added team snapshot display in boss cards on `RunEncounters.tsx`
|
||||
@@ -0,0 +1,34 @@
|
||||
---
|
||||
# nuzlocke-tracker-xd9j
|
||||
title: Add team snapshot to boss battle results
|
||||
status: completed
|
||||
type: feature
|
||||
priority: low
|
||||
tags:
|
||||
- failed
|
||||
created_at: 2026-03-20T15:11:53Z
|
||||
updated_at: 2026-03-20T19:41:44Z
|
||||
parent: nuzlocke-tracker-neqv
|
||||
---
|
||||
|
||||
When recording a boss battle result, allow the player to snapshot which alive team pokemon they used and at what levels. This gives a record of "what I brought to the fight."
|
||||
|
||||
## Checklist
|
||||
- [x] **Migration**: Create \`boss_result_team\` table (\`id\`, \`boss_result_id\` FK, \`encounter_id\` FK, \`level\`)
|
||||
- [x] **Model**: Create \`BossResultTeam\` model, add relationship to \`BossResult\`
|
||||
- [x] **Schemas**: Add \`BossResultTeamInput\` and update \`BossResultCreate\`/\`BossResultResponse\`
|
||||
- [x] **API**: Update \`POST /runs/{run_id}/boss-results\` to accept and save team snapshot
|
||||
- [x] **BossDefeatModal**: Add checkboxes for alive team members with optional level override
|
||||
- [x] **Display**: Show team snapshot when viewing past boss results in \`RunEncounters.tsx\`
|
||||
|
||||
|
||||
## Summary of Changes
|
||||
|
||||
Implemented team snapshot feature for boss battle results:
|
||||
|
||||
- Created `boss_result_team` table (`id`, `boss_result_id` FK, `encounter_id` FK, `level`)
|
||||
- Added `BossResultTeam` model with relationship to `BossResult`
|
||||
- Updated schemas with `BossResultTeamMemberInput` and `BossResultTeamMemberResponse`
|
||||
- Updated `POST /runs/{run_id}/boss-results` to validate and save team snapshot
|
||||
- Added team selection UI in `BossDefeatModal` with level override
|
||||
- Display team snapshot in defeated boss cards on `RunEncounters.tsx`
|
||||
@@ -0,0 +1,37 @@
|
||||
---
|
||||
# nuzlocke-tracker-xsdr
|
||||
title: 'Crash: Crash: Bug: TypeScript build fails due to optional property type mismatches in journal components'
|
||||
status: completed
|
||||
type: bug
|
||||
priority: high
|
||||
created_at: 2026-03-20T19:12:50Z
|
||||
updated_at: 2026-03-20T19:17:39Z
|
||||
parent: nuzlocke-tracker-bw1m
|
||||
blocking:
|
||||
- nuzlocke-tracker-3psa
|
||||
---
|
||||
|
||||
Agent crashed while working on nuzlocke-tracker-3psa.
|
||||
|
||||
## Exit Code
|
||||
1
|
||||
|
||||
## Last Output
|
||||
```
|
||||
Failed to authenticate. API Error: 401 {"type":"error","error":{"type":"authentication_error","message":"OAuth token has expired. Please obtain a new token or refresh your existing token."},"request_id":"req_011CZEs4QPgAQoZbS63nnkqT"}
|
||||
|
||||
```
|
||||
|
||||
## Context
|
||||
- Bean: nuzlocke-tracker-3psa
|
||||
- Title: Crash: Bug: TypeScript build fails due to optional property type mismatches in journal components
|
||||
- Type: bug
|
||||
|
||||
## Summary of Changes
|
||||
|
||||
Fixed TypeScript build errors caused by `exactOptionalPropertyTypes: true` requiring explicit `| undefined` in optional property types.
|
||||
|
||||
**Files changed:**
|
||||
- `JournalEditor.tsx`: Added `| undefined` to `bossResults` and `bosses` prop types
|
||||
- `JournalEntryView.tsx`: Added `| undefined` to `bossResult` and `boss` prop types
|
||||
- `JournalSection.tsx`: Added `| undefined` to `bossResults` and `bosses` prop types
|
||||
Reference in New Issue
Block a user