Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ LTCG-v2/
│ ├── lunchtable-tcg-match/ # Convex component: event-sourced matches
│ └── lunchtable-tcg-story/ # Convex component: story mode progression
├── apps/web-tanstack/ # Frontend (TanStack Start + React 19)
── apps/web/ # Legacy archive (excluded from default flows)
│ └── src/legacy/ # Legacy React Router compatibility modules
├── reference/frontend/ # Reference frontend (patterns only)
└── docs/ # Architecture + agent docs
```
Expand Down Expand Up @@ -105,7 +105,7 @@ import { apiAny, useConvexMutation, useConvexQuery } from "@/lib/convexHelpers";

## Theming: Zine Aesthetic

Source of truth: original LTCG at `/Users/home/Desktop/LTCG/apps/web/app/globals.css`
Source of truth: `apps/web-tanstack/src/styles/legacy.css`

### Core Design System

Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@ curl -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/setWebhook" \
LTCG-v2/
├── convex/ # Convex backend (host layer)
├── apps/web-tanstack/ # Primary frontend (TanStack Start)
── apps/web/ # Legacy archive (React Router; excluded from default flows)
│ └── src/legacy/ # Legacy React Router compatibility modules
├── packages/
│ ├── engine/ # Pure TS game engine
│ ├── plugin-ltcg/ # ElizaOS plugin
Expand Down
6 changes: 3 additions & 3 deletions docs/VERCEL_BLOB_SETUP.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ This Vercel Function handles image uploads:

## Upload Component

**File:** `apps/web/src/components/ImageUpload.tsx` (legacy client)
**File:** `apps/web-tanstack/src/legacy/components/ImageUpload.tsx` (legacy compatibility client)

Usage:

Expand Down Expand Up @@ -121,9 +121,9 @@ Or use the component with automatic URL handling.
api/
└── blob-upload.ts # Vercel Function for uploads

apps/web/ # Legacy React Router client (optional uploader UI)
apps/web-tanstack/
├── src/
│ ├── components/
│ ├── legacy/components/
│ │ └── ImageUpload.tsx # React upload component
│ └── ...
└── public/
Expand Down
22 changes: 11 additions & 11 deletions docs/architecture/VICE_SYSTEM.md
Original file line number Diff line number Diff line change
Expand Up @@ -113,38 +113,38 @@ Additionally, `CARD_DESTROYED` fires with `reason: "breakdown"` when the card is

## The 10 Canonical Vice Types

![The Ten-Fold Curse](/Users/home/.gemini/antigravity/brain/e67c5c5b-7a39-4849-ab1d-cb7bc6e34507/vice_master_splash_landscape_1771172852490.png)
![The Ten-Fold Curse](../../apps/web-tanstack/public/lunchtable/vices/vice-splash.png)

Defined in `GAME_CONFIG.VICE_TYPES`. Each vice is a character flaw that can trigger a breakdown.

### 1. Gambling ::: ![Gambling](/Users/home/Desktop/LTCG-v2/apps/web/public/lunchtable/vices/gambling.png)
### 1. Gambling ::: ![Gambling](../../apps/web-tanstack/public/lunchtable/vices/gambling.png)
**Description:** Can't stop betting -- doubles down even when losing.

### 2. Alcohol ::: ![Alcohol](/Users/home/.gemini/antigravity/brain/e67c5c5b-7a39-4849-ab1d-cb7bc6e34507/vice_alcohol_comic_1771172385924.png)
### 2. Alcohol ::: ![Alcohol](../../apps/web-tanstack/public/lunchtable/vices/alcohol.png)
**Description:** Party lifestyle that spirals out of control.

### 3. Social Media ::: ![Social Media](/Users/home/.gemini/antigravity/brain/e67c5c5b-7a39-4849-ab1d-cb7bc6e34507/vice_social_media_comic_1771172400411.png)
### 3. Social Media ::: ![Social Media](../../apps/web-tanstack/public/lunchtable/vices/social-media.png)
**Description:** Addicted to likes, shares, and online validation.

### 4. Crypto ::: ![Crypto](/Users/home/.gemini/antigravity/brain/e67c5c5b-7a39-4849-ab1d-cb7bc6e34507/vice_crypto_comic_1771172423409.png)
### 4. Crypto ::: ![Crypto](../../apps/web-tanstack/public/lunchtable/vices/crypto.png)
**Description:** All-in on digital assets, blind to risk.

### 5. Validation ::: ![Validation](/Users/home/.gemini/antigravity/brain/e67c5c5b-7a39-4849-ab1d-cb7bc6e34507/vice_validation_comic_retry_1771172446648.png)
### 5. Validation ::: ![Validation](../../apps/web-tanstack/public/lunchtable/vices/validation.png)
**Description:** Desperate need for approval and recognition.

### 6. Conspiracy ::: ![Conspiracy](/Users/home/Desktop/LTCG-v2/apps/web/public/lunchtable/vices/conspiracy.png)
### 6. Conspiracy ::: ![Conspiracy](../../apps/web-tanstack/public/lunchtable/vices/conspiracy.png)
**Description:** Lost in paranoid theories, disconnected from reality.

### 7. Narcissism ::: ![Narcissism](/Users/home/.gemini/antigravity/brain/e67c5c5b-7a39-4849-ab1d-cb7bc6e34507/vice_narcissism_comic_1771172480416.png)
### 7. Narcissism ::: ![Narcissism](../../apps/web-tanstack/public/lunchtable/vices/narcissism.png)
**Description:** Self-obsession that alienates everyone.

### 8. Adderall ::: ![Adderall](/Users/home/.gemini/antigravity/brain/e67c5c5b-7a39-4849-ab1d-cb7bc6e34507/vice_adderall_comic_1771172503606.png)
### 8. Adderall ::: ![Adderall](../../apps/web-tanstack/public/lunchtable/vices/adderall.png)
**Description:** Stimulant dependency, burnout from hyperfocus.

### 9. MLM ::: ![MLM](/Users/home/.gemini/antigravity/brain/e67c5c5b-7a39-4849-ab1d-cb7bc6e34507/vice_mlm_comic_1771172520609.png)
### 9. MLM ::: ![MLM](../../apps/web-tanstack/public/lunchtable/vices/mlm.png)
**Description:** Multi-level marketing delusion, hustle culture.

### 10. Rage ::: ![Rage](/Users/home/.gemini/antigravity/brain/e67c5c5b-7a39-4849-ab1d-cb7bc6e34507/vice_rage_comic_1771172538190.png)
### 10. Rage ::: ![Rage](../../apps/web-tanstack/public/lunchtable/vices/rage.png)
**Description:** Uncontrolled anger that destroys relationships.

---
Expand Down
4 changes: 2 additions & 2 deletions docs/plans/2026-02-15-card-balance-plan.md
Original file line number Diff line number Diff line change
Expand Up @@ -967,7 +967,7 @@ git commit -m "feat(backend): update match creation and AI for new resource syst
## Task 12: Update Frontend PlayerView Usage

**Files:**
- Modify: `apps/web/src/pages/Play.tsx`
- Modify: `apps/web-tanstack/src/legacy/pages/Play.tsx`

**Step 1: Replace LP display with Reputation/Stability/Clout**

Expand All @@ -981,7 +981,7 @@ Replace all `lifePoints` / `opponentLifePoints` references.
**Step 2: Commit**

```bash
git add apps/web/src/pages/Play.tsx
git add apps/web-tanstack/src/legacy/pages/Play.tsx
git commit -m "feat(frontend): display reputation/stability/clout on game board"
```

Expand Down
10 changes: 5 additions & 5 deletions docs/plans/2026-02-15-ltcg-v2-implementation.md
Original file line number Diff line number Diff line change
Expand Up @@ -580,9 +580,9 @@ git commit -m "feat: seed module — card definitions, starter decks, story chap
### Task 5: Update frontend to point at new API

**Files:**
- Modify: `apps/web/src/lib/convexHelpers.ts`
- Modify: `apps/web/src/hooks/story/useStoryMode.ts`
- Modify: `apps/web/src/hooks/story/useStoryChapter.ts`
- Modify: `apps/web-tanstack/src/legacy/lib/convexHelpers.ts`
- Modify: `apps/web-tanstack/src/legacy/hooks/story/useStoryMode.ts`
- Modify: `apps/web-tanstack/src/legacy/hooks/story/useStoryChapter.ts`
- Modify: frontend game board hooks to use new match-based API

The frontend hooks currently reference `typedApi.progression.story.*` and `typedApi.progression.storyBattle.*`. The new API is flat: `api.game.getChapters`, `api.game.startStoryBattle`, etc.
Expand All @@ -609,7 +609,7 @@ The PlayerView type from the engine defines the shape of the response.
**Step 4: Commit**

```bash
git add apps/web/src/
git add apps/web-tanstack/src/legacy/
git commit -m "feat: update frontend hooks to use new flat game API"
```

Expand All @@ -621,7 +621,7 @@ git commit -m "feat: update frontend hooks to use new flat game API"

```bash
bunx convex dev &
cd apps/web && bun dev
cd apps/web-tanstack && bun dev
```

**Step 2: Test flow**
Expand Down
4 changes: 2 additions & 2 deletions docs/plans/2026-02-15-playable-game-design.md
Original file line number Diff line number Diff line change
Expand Up @@ -313,7 +313,7 @@ Implement `legalMoves(state, seat)` in engine to return all valid commands:
### New Files

```
apps/web/src/components/game/
apps/web-tanstack/src/legacy/components/game/
GameBoard.tsx # Root board layout
PlayerHand.tsx # Fan hand container
HandCard.tsx # Individual hand card
Expand Down Expand Up @@ -352,7 +352,7 @@ packages/engine/src/
convex/
game.ts # Replace AI stub with heuristic logic

apps/web/src/
apps/web-tanstack/src/legacy/
pages/Play.tsx # Replace skeleton with GameBoard
```

Expand Down
84 changes: 42 additions & 42 deletions docs/plans/2026-02-15-playable-game.md
Original file line number Diff line number Diff line change
Expand Up @@ -697,7 +697,7 @@ git commit -m "feat(engine): wire card effects into spell/trap activation + new
### Task 4: Create useGameState hook

**Files:**
- Create: `apps/web/src/components/game/hooks/useGameState.ts`
- Create: `apps/web-tanstack/src/legacy/components/game/hooks/useGameState.ts`

```typescript
import { useMemo } from "react";
Expand Down Expand Up @@ -853,7 +853,7 @@ export function useGameState(matchId: string | undefined) {
**Step 2: Commit**

```bash
git add apps/web/src/components/game/hooks/useGameState.ts
git add apps/web-tanstack/src/legacy/components/game/hooks/useGameState.ts
git commit -m "feat(ui): add useGameState hook with valid action derivation"
```

Expand All @@ -862,7 +862,7 @@ git commit -m "feat(ui): add useGameState hook with valid action derivation"
### Task 5: Create useGameActions hook

**Files:**
- Create: `apps/web/src/components/game/hooks/useGameActions.ts`
- Create: `apps/web-tanstack/src/legacy/components/game/hooks/useGameActions.ts`

```typescript
import { useState, useCallback } from "react";
Expand Down Expand Up @@ -923,7 +923,7 @@ export function useGameActions(matchId: string | undefined) {
**Commit:**

```bash
git add apps/web/src/components/game/hooks/useGameActions.ts
git add apps/web-tanstack/src/legacy/components/game/hooks/useGameActions.ts
git commit -m "feat(ui): add useGameActions hook wrapping all command types"
```

Expand All @@ -932,12 +932,12 @@ git commit -m "feat(ui): add useGameActions hook wrapping all command types"
### Task 6: Build core game board components

**Files:**
- Create: `apps/web/src/components/game/LPBar.tsx`
- Create: `apps/web/src/components/game/PhaseBar.tsx`
- Create: `apps/web/src/components/game/BoardSlot.tsx`
- Create: `apps/web/src/components/game/FieldRow.tsx`
- Create: `apps/web/src/components/game/HandCard.tsx`
- Create: `apps/web/src/components/game/PlayerHand.tsx`
- Create: `apps/web-tanstack/src/legacy/components/game/LPBar.tsx`
- Create: `apps/web-tanstack/src/legacy/components/game/PhaseBar.tsx`
- Create: `apps/web-tanstack/src/legacy/components/game/BoardSlot.tsx`
- Create: `apps/web-tanstack/src/legacy/components/game/FieldRow.tsx`
- Create: `apps/web-tanstack/src/legacy/components/game/HandCard.tsx`
- Create: `apps/web-tanstack/src/legacy/components/game/PlayerHand.tsx`

Each component should use the zine aesthetic (paper-panel, ink borders, Special Elite font, #121212 ink, #ffcc00 accent). Use Framer Motion for hover/tap animations. Use `cardLookup` to resolve card names and stats from IDs.

Expand All @@ -960,7 +960,7 @@ These are UI-only components — no game logic, just rendering + click callbacks
**Commit after creating all 6:**

```bash
git add apps/web/src/components/game/
git add apps/web-tanstack/src/legacy/components/game/
git commit -m "feat(ui): add core board components — LPBar, PhaseBar, BoardSlot, FieldRow, HandCard, PlayerHand"
```

Expand All @@ -969,10 +969,10 @@ git commit -m "feat(ui): add core board components — LPBar, PhaseBar, BoardSlo
### Task 7: Build action sheets and selectors

**Files:**
- Create: `apps/web/src/components/game/ActionSheet.tsx`
- Create: `apps/web/src/components/game/TributeSelector.tsx`
- Create: `apps/web/src/components/game/AttackTargetSelector.tsx`
- Create: `apps/web/src/components/game/GraveyardBrowser.tsx`
- Create: `apps/web-tanstack/src/legacy/components/game/ActionSheet.tsx`
- Create: `apps/web-tanstack/src/legacy/components/game/TributeSelector.tsx`
- Create: `apps/web-tanstack/src/legacy/components/game/AttackTargetSelector.tsx`
- Create: `apps/web-tanstack/src/legacy/components/game/GraveyardBrowser.tsx`

**ActionSheet**: Bottom sheet modal (Framer Motion slide-up). Shows card name + options based on card type:
- Monster in hand: "Summon ATK" / "Summon DEF" / "Set Face-Down" / Cancel
Expand All @@ -990,10 +990,10 @@ git commit -m "feat(ui): add core board components — LPBar, PhaseBar, BoardSlo
**Commit:**

```bash
git add apps/web/src/components/game/ActionSheet.tsx
git add apps/web/src/components/game/TributeSelector.tsx
git add apps/web/src/components/game/AttackTargetSelector.tsx
git add apps/web/src/components/game/GraveyardBrowser.tsx
git add apps/web-tanstack/src/legacy/components/game/ActionSheet.tsx
git add apps/web-tanstack/src/legacy/components/game/TributeSelector.tsx
git add apps/web-tanstack/src/legacy/components/game/AttackTargetSelector.tsx
git add apps/web-tanstack/src/legacy/components/game/GraveyardBrowser.tsx
git commit -m "feat(ui): add ActionSheet, TributeSelector, AttackTargetSelector, GraveyardBrowser"
```

Expand All @@ -1002,8 +1002,8 @@ git commit -m "feat(ui): add ActionSheet, TributeSelector, AttackTargetSelector,
### Task 8: Build GameBoard root component and wire into Play page

**Files:**
- Create: `apps/web/src/components/game/GameBoard.tsx`
- Modify: `apps/web/src/pages/Play.tsx` — replace skeleton with GameBoard
- Create: `apps/web-tanstack/src/legacy/components/game/GameBoard.tsx`
- Modify: `apps/web-tanstack/src/legacy/pages/Play.tsx` — replace skeleton with GameBoard

**GameBoard.tsx**: The root layout component. Manages selection state:
- `selectedHandCard: string | null`
Expand All @@ -1030,7 +1030,7 @@ ActionSheet callbacks route to appropriate `useGameActions` methods.
**Commit:**

```bash
git add apps/web/src/components/game/GameBoard.tsx apps/web/src/pages/Play.tsx
git add apps/web-tanstack/src/legacy/components/game/GameBoard.tsx apps/web-tanstack/src/legacy/pages/Play.tsx
git commit -m "feat(ui): build GameBoard root component and wire into Play page"
```

Expand Down Expand Up @@ -1310,14 +1310,14 @@ git commit -m "feat(engine): add chain/priority system with LIFO resolution"
### Task 11: Build ChainPrompt frontend component

**Files:**
- Create: `apps/web/src/components/game/ChainPrompt.tsx`
- Create: `apps/web-tanstack/src/legacy/components/game/ChainPrompt.tsx`

Bottom-overlay prompt shown when opponent activates something and player has activatable traps. Shows: "Opponent activated [card]! Respond?" with list of activatable traps and a "Pass" button. 5-second auto-pass timer (countdown shown). Calls `chainResponse()` from useGameActions.

**Commit:**

```bash
git add apps/web/src/components/game/ChainPrompt.tsx
git add apps/web-tanstack/src/legacy/components/game/ChainPrompt.tsx
git commit -m "feat(ui): add ChainPrompt component for trap response window"
```

Expand All @@ -1326,14 +1326,14 @@ git commit -m "feat(ui): add ChainPrompt component for trap response window"
### Task 12: Build GameOverOverlay

**Files:**
- Create: `apps/web/src/components/game/GameOverOverlay.tsx`
- Create: `apps/web-tanstack/src/legacy/components/game/GameOverOverlay.tsx`

Full-screen overlay with victory/defeat result. Shows stars, rewards (for story mode), and navigation buttons. Reuses existing VictoryScreen for story mode, adds a simpler overlay for non-story matches.

**Commit:**

```bash
git add apps/web/src/components/game/GameOverOverlay.tsx
git add apps/web-tanstack/src/legacy/components/game/GameOverOverlay.tsx
git commit -m "feat(ui): add GameOverOverlay component"
```

Expand Down Expand Up @@ -1385,21 +1385,21 @@ packages/engine/src/effects/interpreter.ts
packages/engine/src/effects/operations.ts
packages/engine/src/rules/chain.ts
packages/engine/src/__tests__/effects.test.ts
apps/web/src/components/game/hooks/useGameState.ts
apps/web/src/components/game/hooks/useGameActions.ts
apps/web/src/components/game/GameBoard.tsx
apps/web/src/components/game/PlayerHand.tsx
apps/web/src/components/game/HandCard.tsx
apps/web/src/components/game/FieldRow.tsx
apps/web/src/components/game/BoardSlot.tsx
apps/web/src/components/game/PhaseBar.tsx
apps/web/src/components/game/LPBar.tsx
apps/web/src/components/game/ActionSheet.tsx
apps/web/src/components/game/TributeSelector.tsx
apps/web/src/components/game/AttackTargetSelector.tsx
apps/web/src/components/game/GraveyardBrowser.tsx
apps/web/src/components/game/ChainPrompt.tsx
apps/web/src/components/game/GameOverOverlay.tsx
apps/web-tanstack/src/legacy/components/game/hooks/useGameState.ts
apps/web-tanstack/src/legacy/components/game/hooks/useGameActions.ts
apps/web-tanstack/src/legacy/components/game/GameBoard.tsx
apps/web-tanstack/src/legacy/components/game/PlayerHand.tsx
apps/web-tanstack/src/legacy/components/game/HandCard.tsx
apps/web-tanstack/src/legacy/components/game/FieldRow.tsx
apps/web-tanstack/src/legacy/components/game/BoardSlot.tsx
apps/web-tanstack/src/legacy/components/game/PhaseBar.tsx
apps/web-tanstack/src/legacy/components/game/LPBar.tsx
apps/web-tanstack/src/legacy/components/game/ActionSheet.tsx
apps/web-tanstack/src/legacy/components/game/TributeSelector.tsx
apps/web-tanstack/src/legacy/components/game/AttackTargetSelector.tsx
apps/web-tanstack/src/legacy/components/game/GraveyardBrowser.tsx
apps/web-tanstack/src/legacy/components/game/ChainPrompt.tsx
apps/web-tanstack/src/legacy/components/game/GameOverOverlay.tsx
```

### Modified Files (4)
Expand All @@ -1409,5 +1409,5 @@ packages/engine/src/engine.ts — legalMoves() + new evolve handlers
packages/engine/src/rules/spellsTraps.ts — wire effects into activation
packages/engine/src/__tests__/engine.test.ts — legalMoves tests
convex/game.ts — AI heuristic logic
apps/web/src/pages/Play.tsx — wire in GameBoard
apps/web-tanstack/src/legacy/pages/Play.tsx — wire in GameBoard
```
Loading
Loading