@AGENTS.md # Festipod Project This project has two parts: 1. **Festipod App** - Mobile app mockups with sketchy hand-drawn UI 2. **Prototyping Tool** - Web app to view mockups, user stories, and BDD specs ## Architecture Feature-based architecture: code is organized by business domain (module), not by technical layer. A module can only import from `shared/` — never from another module. Multi-layer BDD: each module has `steps/frontend/`, `steps/backend/`, `steps/e2e/` directories. Shared step definitions live in `src/shared/steps/`. ## Project Structure ``` src/ modules/ # Business domain modules event/ # Events (create, discover, detail, update, invite, participants, meeting points) screens/ # EventsScreen, EventDetailScreen, CreateEventScreen, etc. features/ # Gherkin .feature files for this domain steps/ # BDD step definitions frontend/ # Frontend-layer steps backend/ # Backend-layer steps (planned) e2e/ # E2E steps (planned) user/ # User profiles, friends, sharing screens/ # ProfileScreen, FriendsListScreen, ShareProfileScreen, etc. features/ steps/ home/ # Home dashboard, settings screens/ # HomeScreen, SettingsScreen auth/ # Authentication, onboarding screens/ # LoginScreen, WelcomeScreen workshop/ # Workshop/atelier specs (no screens yet) features/ steps/ meeting/ # Meeting point specs features/ steps/ notification/ # Notification specs features/ steps/ shared/ # Shared code (importable by all modules) components/ sketchy/ # Hand-drawn UI components (Button, Card, Avatar, etc.) ui/ # Shadcn/Radix components context/ # ThemeContext, NextGraphContext, FestipodDataContext data/ # User stories, features.ts (auto-generated), testResults.ts hooks/ # Custom hooks (useShapeWithDefaults) shapes/ # SHEX shapes + ORM bindings (NextGraph) utils/ # ngSession, ngBootstrap steps/ # Shared BDD step definitions (cross-domain) frontend/ # navigation.steps.ts, form.steps.ts, screen.steps.ts backend/ support/ # Cucumber hooks.ts, world.ts types/ # TypeScript type definitions lib/ # Utility functions (cn, etc.) app/ # Prototyping tool (app shell) App.tsx # Root component with providers router.tsx # Hash-based routing frontend.tsx # React entry point components/ # Gallery, DemoMode, ThemeToggle, specs/ screens/ index.ts # Screen registry (imports from all modules) scripts/ # Build scripts for parsing features docs/ # Documentation ``` ## Key Commands ```bash bun run dev # Start dev server with HMR bun run test:cucumber # Run Cucumber tests bun run features:parse # Regenerate features.ts from .feature files bun run steps:extract # Extract step definitions for tooltips ``` ## Conventions - Gherkin specs are in French (Étant donné, Quand, Alors) - UI labels are in French - User stories are prefixed US-1 to US-26 - Screens use the sketchy component library, not Tailwind - Specs pages use Tailwind + Shadcn components with system font (not sketchy font) - GherkinHighlighter uses card-based layout, not code/text style --- Default to using Bun instead of Node.js. - Use `bun ` instead of `node ` or `ts-node ` - Use `bun test` instead of `jest` or `vitest` - Use `bun build ` instead of `webpack` or `esbuild` - Use `bun install` instead of `npm install` or `yarn install` or `pnpm install` - Use `bun run ``` With the following `frontend.tsx`: ```tsx#frontend.tsx import React from "react"; import { createRoot } from "react-dom/client"; // import .css files directly and it works import './index.css'; const root = createRoot(document.body); export default function Frontend() { return

Hello, world!

; } root.render(); ``` Then, run index.ts ```sh bun --hot ./index.ts ``` For more information, read the Bun API docs in `node_modules/bun-types/docs/**.mdx`.