Files
AITrader/.github/copilot-instructions.md
T
henry 4206b93614
Copilot Setup Steps / copilot-setup-steps (push) Failing after 17s
Add Playwright configuration and initial tests for landing page
- Created playwright.config.ts for test configuration
- Added .last-run.json to store test run status
- Implemented landing.test.ts with tests for navbar visibility and navigation
- Removed unused server proxy configuration from vite.config.ts
2026-05-12 22:10:51 +02:00

117 lines
5.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Copilot Instructions for AITrader
## Quick Start
This is a stock trading application built with React Router 7, TypeScript, and TailwindCSS, integrating with the Alpaca trading API.
### Essential Commands
- `npm install` Install dependencies (first time only)
- `npm run dev` Start development server at `http://localhost:5173`
- `npm run build` Create production build in `./build`
- `npm start` Serve production build (requires `npm run build` first)
- `npm run typecheck` Validate TypeScript (`react-router typegen` + `tsc`) — **must run before committing**
- `npm run test:e2e` Run Playwright end-to-end tests
## Architecture Overview
### Project Structure
```
app/
├── root.tsx # Root layout and error boundary
├── routes.ts # Route configuration (React Router 7 RouteConfig API)
├── routes/
│ ├── landing.tsx # Landing page
│ ├── home.tsx # Main application page
│ ├── stocks.tsx # Stock dashboard
│ └── api/ # Server-side API routes
│ ├── indicators.ts # Stock indicator calculations
│ └── alpaca/ # Alpaca broker integration
│ └── account.ts # Account data endpoints
├── components/ # Reusable React components
│ ├── StockViewer.tsx # Stock symbol search and indicator display
│ └── AlpacaAccountInfo.tsx # Account balance and portfolio info
├── utils/
│ ├── indicators.ts # Technical indicator logic (SMA, EMA, RSI, MACD)
│ └── __tests__/ # Unit tests via Vitest
├── types.ts # TypeScript interfaces (IndicatorData, AlpacaAccount)
└── app.css # Global styles
```
### Full-Stack Data Flow
1. **Client (React Components)** User interacts with `StockViewer` or `AlpacaAccountInfo`
2. **Server Routes (`/routes/api/`)** Handle business logic (fetch data from external APIs, run calculations)
3. **Utils** Pure functions for indicators and shared logic (testable with Vitest)
4. **External APIs** Alpaca API for account/trading data
### Server-Side Rendering (SSR)
- Enabled by default (`ssr: true` in `react-router.config.ts`)
- Routes can export loaders for initial data fetching
- Use `loader` functions in route definitions for data pre-loading
## Key Conventions
### TypeScript & Type Safety
- **Path alias** Use `~/` for app imports (e.g., `import { IndicatorData } from "~/types"`)
- **Generated types** React Router generates types in `.react-router/types/` after running `typecheck`
- **Route types** Import `type { Route }` from `./+types/[routename]` for loader/action types
- **Never skip `react-router typegen`** Directly running `tsc` will fail; always run `npm run typecheck`
- **ES Module syntax** Project uses `"type": "module"`; include file extensions in imports where needed
### Component Patterns
- **Client-side interactivity** Use React hooks (`useState`, `useEffect`) in components
- **API calls** Fetch from `/api/*` endpoints; proxy configured in `vite.config.ts` routes to local dev server
- **Error handling** Wrap API calls in try/catch; set error state for UI display
- **Loading states** Track `loading` boolean to show spinners/disable buttons during async work
### API Route Patterns
- Handlers in `app/routes/api/**/*.ts` are server-only functions
- Export a default `export default function(...)` that receives request context
- Return JSON responses or error responses
- Use utilities in `~/utils/` for shared logic (e.g., indicator calculations)
### Testing
- **Unit tests** Use Vitest (`npm run test:e2e` actually runs Playwright, but unit tests exist via `vitest`)
- Located alongside source files in `__tests__/` directories
- Test format: `*.test.ts` or `*.test.tsx`
- **E2E tests** Playwright configured in `playwright.config.ts`
- Tests in `./tests/` directory
- Dev server starts automatically during test runs
- HTML report generated in `test-results/`
### Styling
- **TailwindCSS** Configured via Vite plugin (`@tailwindcss/vite`); no separate build step needed
- **Global styles** Edit `app/app.css`
- **Component styles** Use Tailwind utility classes directly in JSX
### Import Paths
- **Absolute imports** Use `~/` alias for app folder (e.g., `~/components/StockViewer`)
- **Relative imports** Use `./` or `../` sparingly within same directory tree
## Common Pitfalls
- **`npm start` fails if build doesn't exist** Always run `npm run build` first
- **TypeScript compilation errors after route changes** Missing `npm run typecheck` step; regenerated types in `.react-router/types/` are required
- **Vite proxy not working in dev** Ensure dev server is running and API endpoints match `vite.config.ts` proxy config (default: `/api``http://127.0.0.1:3000`)
- **No test framework exists for unit tests** Repository includes Vitest/Playwright dependencies but no test runner script; configure as needed
- **Port conflicts** Dev server uses `5173`, Docker/production uses `3000`
## Deployment
### Docker
```bash
docker build -t aitrader .
docker run -p 3000:3000 aitrader
```
Ensure `npm run build` is run in the Dockerfile before the final `CMD`.
### Environment Variables
- Check Dockerfile for any required environment setup
- Alpaca API credentials likely needed for trading features (not present in repo; set at runtime)
## Debugging Tips
- **Type errors** Run `npm run typecheck` to regenerate React Router types and validate all TS
- **Module resolution** Check `tsconfig.json` for path aliases and ensure imports match configured paths
- **Component not rendering** Check route configuration in `routes.ts` and ensure component is exported as default
- **API calls failing** Verify Vite proxy config and that the target server is running