diff --git a/AGENTS.md b/AGENTS.md index d8cd0c4..46bf748 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -9,10 +9,54 @@ This project is a Nostr client application built with React 18.x, TailwindCSS 3. - **Vite**: Fast build tool and development server - **shadcn/ui**: Unstyled, accessible UI components built with Radix UI and Tailwind - **Nostrify**: Nostr protocol framework for Deno and web -- **React Router**: For client-side routing with BrowserRouter and ScrollToTop functionality +- **React Router**: `react-router-dom` with **HashRouter** (routes live in the URL hash, e.g. `/#/settings`) and ScrollToTop functionality - **TanStack Query**: For data fetching, caching, and state management - **TypeScript**: For type-safe JavaScript development +## 🧠 This file is the ONLY persistent memory — keep it in sync + +`AGENTS.md` is the single thing carried across sessions; a model starts every +session with **no other memory of this project**. So: + +- **Write important things down here in the same session you learn them.** If it + isn't in this file, the next agent doesn't know it and will re-derive (or get) + it wrong. +- **Record the non-obvious**: exact commands + flags, file paths, gotchas, + environment quirks, verified facts, and *why* a decision was made. Skip what + anyone can read from the code. +- **Fix stale entries immediately.** A wrong note here makes every future session + go off the rails — check claims against the repo before trusting them. +- **Keep it tight and factual**: commands/paths over prose, no essays. +- When you change something this file describes (scripts, kinds, deploy, hooks), + update that section as part of the same change. Date non-trivial claims: + `(verified 2026-09-26)`. + +### Project map (what exists right now) +- **Router**: `react-router-dom` **HashRouter** — real routes live in the URL + hash (`/#/settings`, `/#/marketplace`). A bare `/settings` renders the + homepage (this silently broke the boot smoke test once). `src/AppRouter.tsx`. +- **Custom protocol**: `NIP.md` is the source of truth for every custom/adopted + kind; the constants live in `src/lib/types.ts`. Highlights: + - `30818` skate spot · `30017` shop · `31923`/`31925` events + RSVP · `30823` tours + - `30402` NIP-99 listing = marketplace item, and the **Assertion Event** for trades + - `31871` trade attestation (sale/purchase) · `31872` trade confirmation request + → `src/hooks/useTradeAttestations.ts`; reputation UI in `TradeReputationCard` + - `35000–35012` role profiles (skater/filmer/coach/…) · `35006` crews · `30003` spot collections + - `24899` spot chat · `2259` spot status · `32671` Sasquatch Pro · `7103` event updates +- **Marketplace**: `GearSwapPage` + `MarketplaceItemCard`. Buyer/seller trade + attestations build mutual, WoT-weighted reputation. **No payments are + implemented** — "Buy" is intentionally absent; only Contact/Offer/Trade. +- **Wallet**: `useCashu` (coco-cashu) is **native-only** — it returns early on + web (mints are CORS-blocked). Zap rails are NWC + WebLN + Cashu melt (`useZaps`). +- **Group DMs**: NIP-17 (`useDirectMessages`, `GroupConversationPage`). +- **Lazy routes**: every route uses `lazyWithRetry` (`src/lib/lazyWithRetry.ts`) — + retries, then one full reload per session, so a chunk-load failure self-heals + instead of showing the error boundary. +- **Baselines** (verified 2026-09-26): `npm test` → 0 errors, **182 warnings**, + **86 tests**, build ok. `package.json` version **1.4.5**. +- **Untracked local junk — do NOT commit**: `assets/`, `resources/`, + `cvm-server/`, `bun.lock`. + ## Local Dev Environment, Build & Release (project-specific — read first) Machine-specific, verified operational notes. Use these instead of re-deriving workflows from scratch. @@ -66,8 +110,11 @@ Rules: - **Do not re-introduce custom `manualChunks`** without a boot test. Rollup's default splitting is cycle-safe. - `scripts/smoke-test.mjs` boots the built `dist/` in headless Chromium and - fails if `#root` doesn't mount. `scripts/auto-deploy.sh` runs it before every - deploy and **aborts the deploy** if it fails. + fails if `#root` doesn't mount **or** if any route shows the "This page + slammed" error boundary. It walks each route **in the URL hash** (HashRouter!): + `/`, `/marketplace`, `/leaderboards`, `/bounties`, `/settings`, `/stash`, + `/collections`, `/stats`, `/messages/group/abc123`. `scripts/auto-deploy.sh` + runs it before every deploy and **aborts the deploy** if it fails. - Any time the deploy output isn't verified by the smoke test, run `node scripts/smoke-test.mjs` manually before shipping. @@ -114,9 +161,12 @@ Rules: - `useWallet`: Unified wallet detection (WebLN + NWC) - `useNWC`: Nostr Wallet Connect connection management - `useNWCContext`: Access NWC context provider -- `/src/pages/`: Page components used by React Router (Index, NotFound) -- `/src/lib/`: Utility functions and shared logic -- `/src/contexts/`: React context providers (AppContext, NWCContext) +- `/src/pages/`: ~50 route pages (MapPage is the homepage; see `AppRouter.tsx`) +- `/src/lib/`: shared logic — `types.ts` (custom kind constants), `lazyWithRetry.ts`, `queryPersister.ts`, helpers +- `/src/contexts/`: React context providers (AppContext, LanguageContext, NWCContext) +- `NIP.md`: **source of truth** for every custom/adopted Nostr kind and its schema +- `AGENTS.md` (this file): the only cross-session memory — keep it current +- `UX_AUDIT.md`, `GROUP_MESSAGING.md`: feature decision/backlog docs - `/src/test/`: Testing utilities including TestApp component - `/public/`: Static assets - `App.tsx`: Main app component with provider setup (**CRITICAL**: this file is **already configured** with `QueryClientProvider`, `NostrProvider`, `UnheadProvider` and other important providers - **read this file before making changes**. Changes are usually not necessary unless adding new providers. Changing this file may break the application) @@ -215,10 +265,15 @@ The project includes a **`skills/`** directory containing specialized implementa ## System Prompt Management -The AI assistant's behavior and knowledge is defined by the AGENTS.md file, which serves as the system prompt. To modify the assistant's instructions or add new project-specific guidelines: +`AGENTS.md` is the assistant's system prompt **and its only persistent memory**. +Future sessions start with nothing but this file, so treat it as the project's +long-term memory: -1. Edit AGENTS.md directly -2. The changes take effect in the next session +1. Edit `AGENTS.md` directly when you learn something important or when a + described detail has changed. +2. Changes take effect in the next session — so record now, not "later". +3. Re-read the relevant section before relying on it; if it's out of date, fix it + in the same session rather than working around it. ## "Vibed with MKStack" @@ -960,17 +1015,24 @@ function SettingsPage() { ## Routing -The project uses React Router with a centralized routing configuration in `AppRouter.tsx`. To add new routes: +The project uses `react-router-dom`'s **HashRouter** with a centralized +configuration in `AppRouter.tsx`. Because it's a hash router, the route is the +part after `#` — `https://skate-spots.org/#/settings`. Links must use `` +(a bare `` or a plain path loads the homepage / 404s). To add +a route: 1. Create your page component in `/src/pages/` -2. Import it in `AppRouter.tsx` -3. Add the route above the catch-all `*` route: +2. Add it with **`lazyWithRetry`** (not bare `lazy`) and a `` above the + catch-all `*` route: ```tsx -} /> +const YourPage = lazyWithRetry(() => import("./pages/YourPage")); +// … +} /> ``` -The router includes automatic scroll-to-top functionality and a 404 NotFound page for unmatched routes. +The router includes automatic scroll-to-top functionality and a 404 NotFound +page for unmatched routes. ## Development Practices