{"_id":"@artomily/euphoria","_rev":"2-48bf25f16e879690f4a33d4eacc4cb89","name":"@artomily/euphoria","dist-tags":{"latest":"3.5.2"},"versions":{"3.5.1":{"name":"@artomily/euphoria","version":"3.5.1","_id":"@artomily/euphoria@3.5.1","maintainers":[{"name":"artomily","email":"vararakya@gmail.com"}],"dist":{"shasum":"bb7f0fc0eeaf1491b44f2530c0026af89a1a4d16","tarball":"https://registry.npmjs.org/@artomily/euphoria/-/euphoria-3.5.1.tgz","fileCount":169,"integrity":"sha512-J/VZ7WwVUHO0IVXjKCtmF8Iw9JfAaaZUTD1mJ3lqyRRW6q+i+aBCORTXK2fSQdLEIoiZ7zC+klCxWKhtDg7EAw==","signatures":[{"sig":"MEUCIQDkzNk5C8dpjQjoD3Z+/Fso7Lm2219GYq5fAkNMbimRDAIgSV6H6xPBpMWotv+sA5rCw8OyTT7YYH7FO8BlNsWWI98=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":18391251},"gitHead":"07113c85635390546550532066d2954bb23e6961","private":false,"scripts":{"dev":"next dev --port 3005","lint":"eslint","test":"vitest run","build":"next build","check":"tsc --noEmit","start":"next start","db:migrate":"node --env-file=.env scripts/db-migrate.mjs"},"_npmUser":{"name":"artomily","email":"vararakya@gmail.com"},"_npmVersion":"11.6.2","description":"**Trade Market Emotions, Not Charts.**","directories":{},"_nodeVersion":"24.11.1","dependencies":{"ai":"^6.0.197","zod":"^4.4.3","clsx":"^2.1.1","next":"16.2.7","viem":"^2.52.0","react":"19.2.4","three":"^0.184.0","wagmi":"^3.6.18","react-dom":"19.2.4","lucide-react":"^1.17.0","framer-motion":"^12.40.0","@privy-io/node":"^0.21.0","tailwind-merge":"^3.6.0","@privy-io/react-auth":"^3.29.2","@supabase/supabase-js":"^2.108.0","@tanstack/react-query":"^5.101.0","@neondatabase/serverless":"^1.1.0","@ai-sdk/openai-compatible":"^2.0.51","@openrouter/ai-sdk-provider":"^2.9.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9","vitest":"^4.1.9","typescript":"^5","@types/node":"^20","tailwindcss":"^4","@types/react":"^19","@types/three":"^0.184.1","@types/react-dom":"^19","eslint-config-next":"16.2.7","@tailwindcss/postcss":"^4"},"_npmOperationalInternal":{"tmp":"tmp/euphoria_3.5.1_1782353990233_0.24900418817750358","host":"s3://npm-registry-packages-npm-production"}},"3.5.2":{"name":"@artomily/euphoria","version":"3.5.2","private":false,"repository":{"type":"git","url":"git+https://github.com/artomily/euphoria.git"},"bugs":{"url":"https://github.com/artomily/euphoria/issues"},"homepage":"https://github.com/artomily/euphoria#readme","scripts":{"dev":"next dev --port 3005","build":"next build","start":"next start","lint":"eslint","check":"tsc --noEmit","test":"vitest run","db:migrate":"node --env-file=.env scripts/db-migrate.mjs"},"dependencies":{"@ai-sdk/openai-compatible":"^2.0.51","@neondatabase/serverless":"^1.1.0","@openrouter/ai-sdk-provider":"^2.9.0","@privy-io/node":"^0.21.0","@privy-io/react-auth":"^3.29.2","@supabase/supabase-js":"^2.108.0","@tanstack/react-query":"^5.101.0","ai":"^6.0.197","clsx":"^2.1.1","framer-motion":"^12.40.0","lucide-react":"^1.17.0","next":"16.2.7","react":"19.2.4","react-dom":"19.2.4","tailwind-merge":"^3.6.0","three":"^0.184.0","viem":"^2.52.0","wagmi":"^3.6.18","zod":"^4.4.3"},"devDependencies":{"@tailwindcss/postcss":"^4","@types/node":"^20","@types/react":"^19","@types/react-dom":"^19","@types/three":"^0.184.1","eslint":"^9","eslint-config-next":"16.2.7","tailwindcss":"^4","typescript":"^5","vitest":"^4.1.9"},"gitHead":"ef59cd9f1b7ed75620acdde18348474f76e07a8f","_id":"@artomily/euphoria@3.5.2","description":"**Trade Market Emotions, Not Charts.**","_nodeVersion":"24.11.1","_npmVersion":"11.6.2","dist":{"integrity":"sha512-UEP92mz4ioxNMcgIv8S9CzwWgSnejDHBTeiP7bK8FrrW/kBHiCGTfU8mgPPtn3y6wYlnkpRShjjSW4gs0D+3aA==","shasum":"0162a2ea6bb74a689760644f7b5059970d89aaf1","tarball":"https://registry.npmjs.org/@artomily/euphoria/-/euphoria-3.5.2.tgz","fileCount":169,"unpackedSize":18391486,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIAWWWGSPRJyFO66uXzaOEka1A4P71S4KnQB9ApE6rIlNAiBOg4VCrUsKFYUykO2qkj9L/gULejjj95dM/zUuMEBZGw=="}]},"_npmUser":{"name":"artomily","email":"vararakya@gmail.com"},"directories":{},"maintainers":[{"name":"artomily","email":"vararakya@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/euphoria_3.5.2_1782354733926_0.821002888316769"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-25T02:19:50.132Z","modified":"2026-06-25T02:32:14.437Z","3.5.1":"2026-06-25T02:19:50.622Z","3.5.2":"2026-06-25T02:32:14.322Z"},"description":"**Trade Market Emotions, Not Charts.**","maintainers":[{"name":"artomily","email":"vararakya@gmail.com"}],"readme":"# Euphoria\n\n**Trade Market Emotions, Not Charts.**\n\nRetail traders on BNB Chain don't lose money for lack of charts — they lose by **buying euphoria and selling fear.** Euphoria is the instrument that measures that emotion. It's a multi-agent **market-psychology engine** that quantifies crowd FOMO, narrative, and bubble risk, then turns them into BUY / SELL / WATCH signals — and ships the same thesis as a **deterministic, backtestable Strategy Skill** that beats buy & hold with 2–4× smaller drawdowns.\n\nInstead of RSI and candlesticks, Euphoria reads the one signal nobody else has instrumented: **how the crowd feels.**\n\n> 🏆 **Built for [BNB Hack: AI Trading Agent Edition](https://dorahacks.io/hackathon/bnbhack-twt-cmc)** (CoinMarketCap × Trust Wallet × BNB Chain) — **Track 2: Strategy Skills.**\n> Euphoria's psychology thesis ships as a deterministic, **backtestable Strategy Skill** (the [`euphoria-strategy`](packages/euphoria-strategy) npm package) that beats buy & hold with far lower drawdown. Sponsor capability: **CoinMarketCap** market data.\n>\n> 🎬 Demo video: [`demo/euphoria-demo.mp4`](demo/euphoria-demo.mp4)\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\n[![Next.js](https://img.shields.io/badge/Next.js-16-black)](https://nextjs.org)\n[![TypeScript](https://img.shields.io/badge/TypeScript-5-blue)](https://typescriptlang.org)\n\n---\n\n## Features\n\n### FOMO Radar\nScans BNB Chain for narrative-driven momentum. Identifies which themes (AI, Memecoin, RWA, DePIN, Gaming, DeFi) are generating the most crowd excitement in real time.\n\n### AI Agent Debate\nFive specialized AI agents collaborate and debate before producing a trade signal. Watch Crowd Agent argue the bull case while Reverse Agent argues the bear case — then see the Judge decide.\n\n### Backtestable Strategy Skill\nThe same psychology thesis, distilled into a **pure, deterministic strategy** you can backtest and ship. Packaged as [`euphoria-strategy`](packages/euphoria-strategy) (zero-dependency npm package) and exposed in-app at `/backtest`. Across BNB-ecosystem assets it preserves capital — going to cash when the crowd turns euphoric or fearful — beating buy & hold through drawdowns. See [Strategy Skill](#strategy-skill-npm-package).\n\n### Narrative Discovery\nUnderstands *why* markets move, not just that they moved. Each analysis surfaces the human story behind the price action.\n\n### FOMO Meter\nA 0–100 crowd excitement score with five psychological levels:\n\n| Score | Level |\n|---|---|\n| 0–20 | Calm |\n| 20–40 | Interest |\n| 40–60 | Bullish |\n| 60–80 | FOMO |\n| 80–100 | Euphoria |\n\n### Token Analysis Dashboard\nDeep-dive analysis for any BNB Chain token: volume score, momentum score, narrative classification, bubble probability, and final BUY / SELL / WATCH verdict.\n\n### Market Sentiment Analysis\nAggregated market-wide psychology view — which narratives are dominant, where crowd energy is concentrating, and what the overall market emotional state is.\n\n---\n\n## Architecture\n\n```mermaid\ngraph TB\n    subgraph Client[\"Browser / Next.js\"]\n        Dashboard[\"Dashboard Page\"]\n        Radar[\"FOMO Radar Page\"]\n        Token[\"Token Analysis Page\"]\n    end\n\n    subgraph Vercel[\"Vercel Serverless\"]\n        Orchestrator[\"Agent Orchestrator\\n/api/analyze (returns full debate + verdict)\"]\n        FOMO[\"FOMO Index\\n/api/fomo (Cron-precomputed)\"]\n        Narratives[\"Narratives\\n/api/narratives\"]\n    end\n\n    subgraph Agents[\"AI Agent Pipeline\"]\n        Scout[\"Scout Agent\\n(Market Data)\"]\n        Narrative[\"Narrative Agent\\n(Why It Moves)\"]\n        Crowd[\"Crowd Agent\\n(FOMO Score)\"]\n        Reverse[\"Reverse Agent\\n(Bubble Risk)\"]\n        Judge[\"Judge Agent\\n(Final Decision)\"]\n    end\n\n    subgraph External[\"External Services\"]\n        CMC[\"CoinMarketCap API\"]\n        Dex[\"DexScreener API\"]\n        OR[\"OpenRouter\\n(Gemini 2.5)\"]\n    end\n\n    subgraph Data[\"Data Layer\"]\n        Supabase[\"Supabase PostgreSQL\\n(RLS Enabled)\"]\n        Privy[\"Privy Auth\\n(Wallet Login)\"]\n    end\n\n    Dashboard --> Orchestrator\n    Token --> Orchestrator\n    Radar --> FOMO\n    Radar --> Narratives\n\n    Orchestrator --> Scout\n    Scout --> Narrative\n    Narrative --> Crowd\n    Narrative --> Reverse\n    Crowd --> Judge\n    Reverse --> Judge\n\n    Scout --> Dex\n    Scout -.optional.-> CMC\n    Narrative --> OR\n    Crowd --> OR\n    Reverse --> OR\n    Judge --> OR\n\n    Orchestrator --> Supabase\n    Dashboard --> Privy\n```\n\n---\n\n## Agent System\n\n```mermaid\nsequenceDiagram\n    participant User\n    participant API as /api/analyze\n    participant Orch as Orchestrator\n    participant Scout\n    participant Narr as Narrative\n    participant Crowd\n    participant Rev as Reverse\n    participant Judge\n\n    User->>API: POST { symbol: \"TOKEN\" }\n    API->>Orch: orchestrate(\"TOKEN\")\n    Orch->>Scout: execute({ symbol })\n    Scout-->>Orch: { volume_score, momentum_score }\n\n    Orch->>Narr: execute(scout)\n    Narr-->>Orch: { narrative, confidence }\n\n    par Crowd ∥ Reverse (both depend only on scout + narrative)\n        Orch->>Crowd: execute(scout, narrative)\n        Orch->>Rev: execute(scout, narrative)\n    end\n    Crowd-->>Orch: { fomo_score }\n    Rev-->>Orch: { bubble_probability }\n\n    Orch->>Judge: execute(scout, narrative, crowd, reverse)\n    Judge-->>Orch: { decision, confidence, reasoning }\n    Orch-->>API: full result (incl. crowd vs reverse debate)\n    API-->>User: JSON response\n```\n\n> The \"AI Debate\" is the Crowd and Reverse verdicts shown side by side — produced in one `/api/analyze` call, not a second round-trip. There is no separate `/api/debate` LLM pipeline (it would double cost and latency for the same answer).\n\n### Agent Responsibilities\n\n| Agent | Role | Model | Output |\n|---|---|---|---|\n| **Scout** | Fetches market data, calculates volume & momentum scores | Heuristic | `{ volume_score, momentum_score }` |\n| **Narrative** | Classifies the market narrative driving the token | Gemini 2.5 Pro | `{ narrative, confidence }` |\n| **Crowd** | Measures crowd excitement and FOMO intensity | Gemini 2.5 Flash | `{ fomo_score }` |\n| **Reverse** | Detects bubbles and overcrowded trades | Gemini 2.5 Flash | `{ bubble_probability }` |\n| **Judge** | Synthesizes all agents into a final trade signal | Gemini 2.5 Pro | `{ decision, confidence, reasoning }` |\n\n---\n\n## Strategy Skill (npm package)\n\n> **Track 2 deliverable.** Euphoria's market-psychology thesis as a deterministic, backtestable strategy — shippable on its own.\n\nThe package [`packages/euphoria-strategy`](packages/euphoria-strategy) is a **zero-dependency** TypeScript library that turns OHLCV candles into `BUY` / `SELL` / `WATCH` signals and backtests them vs buy & hold. It mirrors the live agents' logic (Scout → momentum, Crowd → FOMO, Reverse → bubble risk) but is pure and reproducible — no LLM, no randomness — so it can be unit-tested and replayed.\n\n```ts\nimport { runBacktest, signalFor, computeFeatures, WARMUP, type Candle } from \"euphoria-strategy\";\n\nconst candles: Candle[] = await loadDailyCandles(\"BTCUSDT\"); // Binance, CMC, etc.\nconst result = runBacktest(\"BTC\", candles);\n// → { totalReturnPct, buyHoldReturnPct, maxDrawdownPct, winRatePct, trades, sharpe, series }\n\nconst signal = signalFor(computeFeatures(candles.slice(-(WARMUP + 1)))); // \"BUY\" | \"SELL\" | \"WATCH\"\n```\n\n**Signal rules (long-only, with hysteresis):**\n- **BUY** — `momentum ≥ 55`, `bubble ≤ 60`, `fomo ≥ 30` (healthy trend, not over-extended)\n- **SELL** (risk-off) — `momentum ≤ 42` (broken trend / fear) **or** `fomo ≥ 75 && bubble ≥ 70` (euphoric top) → move to cash\n- **WATCH** — hold\n\nBuild & test:\n\n```bash\ncd packages/euphoria-strategy && npm run build   # → dist/ (publishable)\nnpm run test                                      # strategy + engine unit tests (from repo root)\n```\n\nThe in-app backtest UI (`/backtest`) and `GET /api/backtest?symbol=CAKE` run this same strategy over live historical candles.\n\n---\n\n## Tech Stack\n\n### Frontend\n| Technology | Version | Purpose |\n|---|---|---|\n| Next.js | 16 | Framework (App Router) |\n| React | 19 | UI Library |\n| TypeScript | 5 | Type Safety |\n| Tailwind CSS | 4 | Styling |\n| shadcn/ui | latest | Component Library |\n| Framer Motion | latest | Animations |\n\n### AI\n| Technology | Purpose |\n|---|---|\n| OpenAI-compatible gateway | LLM access via `lib/llm.ts` — provider-agnostic |\n| 9router (local) | Default gateway — routes to Claude / GPT / Gemini / DeepSeek |\n| OpenRouter | Production gateway (set `LLM_PROVIDER=openrouter`) |\n| Zod | Structured-output validation + normalization per agent |\n\n> Agents call `/chat/completions` directly (`lib/llm.ts`) and validate output with Zod — the gateway is selected by `LLM_PROVIDER` and models are env-configurable (`*_MODEL_PRO` / `*_MODEL_FLASH`). The two reasoning tiers are **pro** (Narrative, Judge) and **flash** (Crowd, Reverse); Scout is a pure heuristic with no LLM call.\n\n### Backend & Data\n| Technology | Purpose |\n|---|---|\n| Next.js Route Handlers | API Layer |\n| Supabase | PostgreSQL + Row Level Security |\n| Privy | Wallet Authentication |\n\n### Blockchain\n| Technology | Purpose |\n|---|---|\n| BNB Chain | Target Network |\n| Viem | Low-level Chain Interaction |\n| Wagmi | React Hooks for Blockchain |\n\n### Data Sources\n| Technology | Purpose |\n|---|---|\n| CoinMarketCap API | Market Data & Trending Tokens |\n| DexScreener API | DEX Volume & Price Data |\n\n### Infrastructure\n| Technology | Purpose |\n|---|---|\n| Vercel | Hosting, CI/CD, Serverless Functions |\n| Vercel Analytics | User Analytics |\n\n---\n\n## Installation\n\n### Prerequisites\n- Node.js 20+\n- npm 10+\n- A Vercel account\n- API keys (see Environment Variables)\n\n### Clone & Install\n\n```bash\ngit clone https://github.com/artomily/euphoria.git\ncd euphoria\nnpm install\n```\n\n### Configure Environment\n\n```bash\ncp .env.example .env.local\n```\n\nEdit `.env.local` with your API keys (see Environment Variables section below).\n\n### Install UI Dependencies\n\n```bash\n# Initialize shadcn/ui\nnpx shadcn@latest init\n\n# AI — Vercel AI SDK + the official OpenRouter provider\nnpm install ai @openrouter/ai-sdk-provider\n\n# UI\nnpm install framer-motion clsx tailwind-merge\n\n# Data + Auth\nnpm install @supabase/supabase-js\nnpm install @privy-io/react-auth @privy-io/node   # react-auth = client, node = server verification\n\n# Validation\nnpm install zod\n\n# Blockchain — only needed once you add on-chain reads (wallet balance, etc.).\n# Privy already provides wallet connect, so this can wait until after the MVP.\nnpm install viem wagmi @tanstack/react-query\n```\n\n> **Note:** Use `@openrouter/ai-sdk-provider` (`createOpenRouter`), not `@ai-sdk/openai`. Agents call `generateObject()` with Zod schemas for guaranteed structured output. The Privy **server** SDK is `@privy-io/node`, not `@privy-io/server`.\n\n### Database Setup\n\n```bash\n# Apply Supabase migrations\nnpx supabase db push\n```\n\n### Run\n\n```bash\nnpm run dev\n```\n\nOpen [http://localhost:3000](http://localhost:3000).\n\n---\n\n## Environment Variables\n\n| Variable | Required | Scope | Description |\n|---|---|---|---|\n| `NEXT_PUBLIC_PRIVY_APP_ID` | ✅ | Client | Privy app id, used by `<PrivyProvider>` |\n| `NEXT_PUBLIC_SUPABASE_URL` | ✅ | Client | Supabase project URL (browser anon client) |\n| `NEXT_PUBLIC_SUPABASE_ANON_KEY` | ✅ | Client | Supabase anon key — safe for client, RLS-gated |\n| `NEXT_PUBLIC_APP_URL` | ⬜ | Client | Public app URL — OG tags, OpenRouter attribution |\n| `LLM_PROVIDER` | ⬜ | Server | `9router` (default, local) or `openrouter` (production) |\n| `NINEROUTER_BASE_URL` | ⬜ | Server | 9router endpoint (default `http://localhost:20128/v1`) |\n| `NINEROUTER_API_KEY` | ⬜ | Server | 9router dashboard key (any value works locally) |\n| `NINEROUTER_MODEL_PRO` / `NINEROUTER_MODEL_FLASH` | ⬜ | Server | Model aliases per connected provider (e.g. `claude-sonnet-4.5`, `deepseek-v4-flash`) |\n| `OPENROUTER_API_KEY` | ⬜ | Server | Required only when `LLM_PROVIDER=openrouter` |\n| `DEXSCREENER_API_URL` | ✅ | Server | DexScreener base URL — on-chain BNB Chain DEX data |\n| `COINMARKETCAP_API_KEY` | ⬜ | Server | **Sponsor capability** — primary market read (price/volume/cap); free Basic key. App degrades to DexScreener-only without it |\n| `SUPABASE_SERVICE_ROLE_KEY` | ✅ | Server | Supabase service role key — full DB access |\n| `PRIVY_APP_SECRET` | ✅ | Server | Privy app secret for token verification |\n| `PRIVY_VERIFIER_KEY` | ✅ | Server | Privy JWT verification key (`jwtVerificationKey`, skips a network call) |\n\n> ⚠️ Never commit `.env.local`. Only `NEXT_PUBLIC_*` variables reach the browser — everything else is server-only. A `NEXT_PUBLIC_` prefix on a secret leaks it into the client bundle.\n\n---\n\n## Development\n\n### Commands\n\n```bash\nnpm run dev      # Start development server (localhost:3000)\nnpm run build    # Build for production (also type-checks)\nnpm run lint     # Run ESLint\nnpm start        # Start production server locally\n```\n\n### Project Structure\n\n```\neuphoria/\n├── app/\n│   ├── layout.tsx               # Root layout\n│   ├── page.tsx                 # Landing page\n│   ├── globals.css              # Global styles\n│   ├── dashboard/               # Main dashboard\n│   ├── radar/                   # FOMO Radar\n│   ├── token/[symbol]/          # Token analysis (live agent pipeline)\n│   ├── backtest/                # Strategy backtest UI\n│   └── api/                     # Route handlers\n│       ├── analyze/route.ts     # POST — run the agent pipeline\n│       └── backtest/route.ts    # GET  — backtest the strategy skill\n├── components/\n│   ├── layout/                  # Header, sidebar\n│   ├── dashboard/               # Dashboard widgets\n│   ├── token/                   # Token page components\n│   ├── agents/                  # Agent display cards\n│   └── ui/                      # Base UI primitives\n├── lib/\n│   ├── agents/                  # Agent logic (pure functions)\n│   │   ├── orchestrator.ts\n│   │   ├── scout.ts\n│   │   ├── narrative.ts\n│   │   ├── crowd.ts\n│   │   ├── reverse.ts\n│   │   ├── judge.ts\n│   │   └── prompts.ts\n│   ├── backtest/                # Strategy Skill (in-app)\n│   │   ├── strategy.ts          #   deterministic signal rules\n│   │   ├── engine.ts            #   backtest loop + metrics\n│   │   └── binance.ts           #   historical OHLCV source\n│   ├── cmc.ts                   # CoinMarketCap client (sponsor capability)\n│   ├── dexscreener.ts           # DexScreener client\n│   ├── llm.ts                   # LLM gateway (9router / OpenRouter, OpenAI-compatible)\n│   ├── format.ts\n│   └── utils.ts\n├── packages/\n│   └── euphoria-strategy/       # Publishable Strategy Skill (npm package)\n├── demo/                        # Demo video + assets\n├── types/\n└── docs/\n```\n\n---\n\n## Deployment\n\n### Vercel (Recommended)\n\n1. Push to GitHub\n2. Import project in [Vercel Dashboard](https://vercel.com/dashboard)\n3. Add all environment variables in Vercel project settings\n4. Deploy — Vercel handles the rest\n\n### Manual Deploy\n\n```bash\nnpm run build\nvercel deploy --prod\n```\n\n### CI/CD\n\nEvery push to `main` triggers an automatic production deployment. All pull requests get a preview deployment URL.\n\n---\n\n## Roadmap\n\n```mermaid\ngantt\n    title Euphoria Roadmap\n    dateFormat YYYY-MM-DD\n    section Phase 1 — Foundation\n        Project scaffold         :done, p1a, 2026-06-01, 3d\n        Auth + DB setup          :done, p1b, after p1a, 3d\n        Base layout + design     :done, p1c, after p1b, 2d\n    section Phase 2 — Core Features\n        FOMO Radar               :active, p2a, 2026-06-08, 3d\n        Token Analysis UI        :p2b, after p2a, 3d\n        Narrative Discovery      :p2c, after p2b, 2d\n    section Phase 3 — Agent Intelligence\n        Agent pipeline           :p3a, 2026-06-16, 4d\n        AI Debate UI             :p3b, after p3a, 2d\n        Streaming responses      :p3c, after p3b, 2d\n    section Phase 4 — Trading Features\n        FOMO Meter               :p4a, 2026-06-24, 2d\n        Analysis history         :p4b, after p4a, 2d\n        Portfolio view           :p4c, after p4b, 3d\n    section Phase 5 — Polish\n        Animations               :p5a, 2026-07-01, 2d\n        Mobile layout            :p5b, after p5a, 2d\n        Performance              :p5c, after p5b, 2d\n```\n\n---\n\n## Contributing\n\n### Getting Started\n\n1. Fork the repository\n2. Create a feature branch: `git checkout -b feature/my-feature`\n3. Make your changes\n4. Run checks: `npm run lint && npm run build`\n5. Commit: `git commit -m \"feat(scope): description\"`\n6. Push: `git push origin feature/my-feature`\n7. Open a Pull Request\n\n### Commit Format\n\n```\nfeat(agents): add Scout Agent with CMC integration\nfix(fomo-meter): correct animation direction\nchore(deps): upgrade framer-motion\ndocs(readme): update installation steps\n```\n\n### Code Standards\n\n- TypeScript strict mode — no `any`\n- Server Components by default\n- Tailwind only — no inline styles\n- Zod for all API validation\n- Every agent has try/catch with fallback\n\n### Pull Request Requirements\n\n- Clear title following commit format\n- Description of what and why\n- Screenshots for UI changes\n- All CI checks passing\n\n---\n\n## Disclaimer\n\nEuphoria produces **market-psychology signals for research and educational purposes only.** Nothing it outputs is financial, investment, or trading advice. AI agents can be wrong, market data can be stale, and crypto assets are volatile and high-risk. Always do your own research. You are solely responsible for your own decisions.\n\n---\n\n## License\n\nMIT © Euphoria Contributors\n","readmeFilename":"README.md","homepage":"https://github.com/artomily/euphoria#readme","repository":{"type":"git","url":"git+https://github.com/artomily/euphoria.git"},"bugs":{"url":"https://github.com/artomily/euphoria/issues"}}