mirror of
https://github.com/soconnor0919/beenvoice.git
synced 2026-05-08 09:38:55 -04:00
fbeca7cfee
- Deleted the start.sh script for container management. - Added AGENTS.md for project guidelines and development principles. - Introduced new SQL migration files for user appearance preferences and platform settings. - Implemented appearance provider to manage user interface themes and preferences. - Created branding utility to define and manage branding-related constants and types. Co-authored-by: Copilot <copilot@github.com>
14 KiB
14 KiB
beenvoice - AI Assistant Rules
Project Overview
beenvoice is a professional invoicing application built with the T3 stack (Next.js 15, tRPC, Drizzle/LibSQL, NextAuth.js) and shadcn/ui components. This is a business-critical application where reliability, security, and professional user experience are paramount.
Core Development Principles
1. Business-First Approach
- Priority: Reliability and security over flashy features
- User Experience: Professional, clean, and intuitive interface
- Data Integrity: Always validate and sanitize user input
- Error Handling: Graceful degradation with clear user feedback
2. Type Safety & Code Quality
- TypeScript: Use strict TypeScript for all new code
- tRPC: All API calls must go through tRPC for type safety
- Validation: Use Zod schemas for all input validation
- Error Boundaries: Implement proper error handling at all levels
Tech Stack Guidelines
Frontend (Next.js 15 + App Router)
- Use App Router patterns consistently
- Implement proper loading states and error boundaries
- Follow Next.js 15 best practices for performance
- Use React Server Components where appropriate
Backend (tRPC + Drizzle)
- All business logic goes through tRPC routers
- Use Drizzle ORM for all database operations
- Implement proper transactions for multi-table operations
- Follow existing router patterns in
src/server/api/routers/
Database (LibSQL/SQLite)
- Use Drizzle migrations for schema changes
- Implement proper indexes for performance
- Follow existing schema patterns
- Use transactions for data consistency
Authentication (NextAuth.js)
- Email/password authentication with bcrypt hashing
- Proper session management
- Protected routes require authentication
- Follow NextAuth.js security best practices
Development Tools
- Use ESLint and Prettier for code formatting
- Use TypeScript for type safety
- Exclusively use bun for development and production. Do not use Node.js or Deno.
- Stay away from starting development servers or running builds unless absolutely necessary.
- Run lints and typechecks when helpful.
Component Architecture
UI Components (shadcn/ui)
- Use shadcn/ui components as the foundation
- Follow existing component patterns
- Use
cn()utility for conditional className merging - Maintain consistent spacing (4px grid system)
Component Organization
- Base UI Components:
src/components/ui/- Pure, portable shadcn/ui components - Project Components:
src/components/- Project-specific reusable components - Page Components:
src/app/_components/- Page-specific components
UI Component Rules
What Belongs in src/components/ui/ (Portable)
- Pure shadcn/ui components: button, input, select, dialog, etc.
- Generic layout components: page-layout, card, table
- Basic form components: input, textarea, checkbox, switch
- Navigation components: breadcrumb, navigation-menu
- Feedback components: badge, alert-dialog, toast
- Data display: table, skeleton, progress
- Overlay components: dialog, sheet, popover, dropdown-menu
What Should Move to src/components/ (Project-Specific)
- Business logic components: address-form, status-badge, data-table
- Domain-specific forms: client-form, invoice-form, business-form
- Custom layouts: page-header, dashboard-breadcrumbs
- Feature components: invoice-list, client-list, editable-invoice-items
- Navigation: Sidebar, Navbar, navigation
- Branding: logo, AddressAutocomplete
Immediate Reorganization Needed
Move from src/components/ui/ to src/components/forms/:
address-form.tsx- Business-specific address handlingfile-upload.tsx- Project-specific file upload logic
Move from src/components/ui/ to src/components/data/:
data-table.tsx- Enhanced with business logicstatus-badge.tsx- Invoice status specificstats-card.tsx- Dashboard-specific statistics
Move from src/components/ui/ to src/components/layout/:
page-layout.tsx- Project-specific layout patternsquick-action-card.tsx- Dashboard-specific actionsfloating-action-bar.tsx- Project-specific floating actions
Keep in src/components/ui/ (Portable):
button.tsx,input.tsx,select.tsx- Pure shadcn/uidialog.tsx,sheet.tsx,popover.tsx- Generic overlaystable.tsx,card.tsx,badge.tsx- Base componentscalendar.tsx,date-picker.tsx- Generic date componentsdropdown-menu.tsx,navigation-menu.tsx- Generic navigationskeleton.tsx,progress.tsx- Generic loading states
Component Design Principles
- High Reusability: Components should accept props for customization
- Composition over Inheritance: Use children props and render props
- Default Values: Provide sensible defaults for all optional props
- Type Safety: Use TypeScript interfaces for all props
- Accessibility: Include proper ARIA labels and keyboard navigation
- Responsive Design: Mobile-first approach with responsive variants
Component Props Pattern
interface ComponentProps {
// Required props
title: string;
// Optional props with defaults
variant?: "default" | "success" | "warning" | "error";
size?: "sm" | "md" | "lg";
// Styling props
className?: string;
// Event handlers
onClick?: () => void;
onChange?: (value: string) => void;
// Content
children?: React.ReactNode;
// Accessibility
"aria-label"?: string;
}
Component Reusability Guidelines
- Configurable Content: Use props for text, labels, and content
- Flexible Styling: Accept className and style props for customization
- Variant System: Use variant props for different visual states
- Size Variants: Provide consistent size options (sm, md, lg, xl)
- Icon Support: Accept icon props for visual customization
- Loading States: Include loading/skeleton variants
- Error States: Handle error states gracefully
- Empty States: Provide empty state components
Component Customization Examples
// Good: Highly customizable component
interface DataTableProps<TData> {
columns: ColumnDef<TData>[];
data: TData[];
title?: string;
description?: string;
actions?: React.ReactNode;
searchKey?: string;
searchPlaceholder?: string;
showPagination?: boolean;
pageSize?: number;
className?: string;
emptyState?: React.ReactNode;
loading?: boolean;
}
// Good: Flexible form component
interface FormFieldProps {
label: string;
name: string;
type?: "text" | "email" | "password" | "number";
placeholder?: string;
required?: boolean;
error?: string;
className?: string;
leftIcon?: React.ReactNode;
rightIcon?: React.ReactNode;
disabled?: boolean;
onChange?: (value: string) => void;
}
Component File Structure
src/components/
├── ui/ # Portable base components
│ ├── button.tsx # Pure shadcn/ui components
│ ├── input.tsx
│ └── ...
├── forms/ # Project-specific forms
│ ├── address-form.tsx
│ ├── client-form.tsx
│ └── invoice-form.tsx
├── layout/ # Layout components
│ ├── page-header.tsx
│ ├── sidebar.tsx
│ └── navbar.tsx
├── data/ # Data display components
│ ├── data-table.tsx
│ ├── status-badge.tsx
│ └── invoice-list.tsx
├── navigation/ # Navigation components
│ ├── breadcrumbs.tsx
│ └── navigation.tsx
└── branding/ # Brand-specific components
├── logo.tsx
└── address-autocomplete.tsx
Styling Guidelines
- Primary Color: Green (#16a34a) for branding
- Font: Geist font family for professional typography
- Tailwind CSS: Use utility classes consistently
- Responsive Design: Mobile-first approach
Business Logic Patterns
Invoice Management
- Invoice Creation: Multi-step process with validation
- Line Items: Flexible pricing with custom rates
- Status Tracking: draft → sent → paid/overdue
- PDF Generation: Professional invoice formatting
Client Management
- Contact Information: Complete address and contact details
- Search & Filter: Efficient client lookup
- Data Validation: Proper email and phone validation
Business Profile
- Default Business: One default business per user
- Logo Support: Professional branding
- Tax Information: Business tax details
API Development Rules
tRPC Router Patterns
// Follow this pattern for all routers
export const exampleRouter = createTRPCRouter({
create: protectedProcedure
.input(z.object({ /* validation schema */ }))
.mutation(async ({ ctx, input }) => {
// Business logic here
}),
list: protectedProcedure
.input(z.object({ /* pagination/filtering */ }))
.query(async ({ ctx, input }) => {
// Query logic here
}),
});
Error Handling
- Use toast notifications for user feedback
- Implement proper form validation
- Handle API errors gracefully
- Provide clear error messages
Security
- Always validate user input with Zod
- Check user permissions for all operations
- Sanitize data before database operations
- Use proper authentication checks
Database Schema Rules
Table Structure
- UUID Primary Keys: Use
crypto.randomUUID()for all IDs - Timestamps: Include
createdAtandupdatedAtfields - User Relations: All business data linked to users
- Indexes: Proper indexing for performance
Relationships
- Users → Clients: One-to-many
- Users → Businesses: One-to-many
- Users → Invoices: One-to-many
- Clients → Invoices: One-to-many
- Businesses → Invoices: One-to-many
- Invoices → Invoice Items: One-to-many
File Naming Conventions
Components & Pages
- Components: PascalCase (e.g.,
ClientList.tsx) - Pages: kebab-case (e.g.,
new-client.tsx) - Layouts:
layout.tsx(Next.js convention) - API Routes:
route.ts(Next.js convention)
Utilities & Helpers
- Utilities: camelCase (e.g.,
formatCurrency.ts) - Constants: UPPER_SNAKE_CASE
- Types: PascalCase (e.g.,
InvoiceStatus)
Development Workflow
Adding New Features
- Database Schema: Update schema with migrations
- tRPC Router: Add procedures with validation
- UI Components: Create components using shadcn/ui
- Pages: Implement pages with proper routing
- Testing: Verify functionality and error handling
Code Quality
- ESLint: Follow existing linting rules
- Prettier: Consistent code formatting
- TypeScript: Strict type checking
- Performance: Optimize database queries and React components
Business Logic Specifics
Invoice Calculations
- Subtotal: Sum of all line items
- Tax: Apply tax rate to subtotal
- Total: Subtotal + tax
- Currency: Handle decimal precision properly
Status Management
- Draft: Initial state, editable
- Sent: Invoice sent to client
- Paid: Payment received
- Overdue: Past due date
Data Validation
- Email: Proper email format validation
- Phone: International phone number support
- Address: Complete address validation
- Currency: Proper decimal handling
Performance Guidelines
Database Optimization
- Use proper indexes for frequently queried fields
- Implement pagination for large datasets
- Use transactions for data consistency
- Optimize query patterns
Frontend Performance
- Use React.memo for expensive components
- Implement proper loading states
- Optimize bundle size
- Use Next.js Image component for images
Caching Strategy
- Use React Query for client-side caching
- Implement proper cache invalidation
- Use Next.js caching where appropriate
Security Considerations
Authentication & Authorization
- All routes require proper authentication
- Check user ownership for all operations
- Implement proper session management
- Use secure password hashing
Data Protection
- Validate all user inputs
- Sanitize data before database operations
- Implement proper error handling
- Use HTTPS in production
Business Data Security
- User data isolation
- Proper access controls
- Audit trails for sensitive operations
- Secure API endpoints
Testing & Quality Assurance
Manual Testing Checklist
- Authentication flows work correctly
- Form validation provides clear feedback
- Responsive design on all screen sizes
- Database operations handle errors gracefully
- PDF generation works correctly
- Navigation and routing function properly
Code Review Guidelines
- Check for proper error handling
- Verify type safety
- Ensure consistent styling
- Review security implications
- Test business logic accuracy
Deployment & Production
Environment Configuration
- Use proper environment variables
- Secure database connections
- Configure NextAuth.js properly
- Set up proper logging
Database Management
- Use migrations for schema changes
- Backup data regularly
- Monitor database performance
- Handle database errors gracefully
Common Patterns & Anti-Patterns
✅ Do's
- Use tRPC for all API calls
- Implement proper loading states
- Use toast notifications for feedback
- Follow existing component patterns
- Validate all user inputs
- Use proper TypeScript types
❌ Don'ts
- Don't use direct fetch calls
- Don't skip input validation
- Don't ignore error handling
- Don't hardcode business logic
- Don't use any types unnecessarily
- Don't skip proper authentication checks
Emergency Procedures
Critical Issues
- Data Loss: Immediate database backup
- Security Breach: Rotate all secrets
- Performance Issues: Database query optimization
- User Complaints: Prioritize user experience fixes
Rollback Strategy
- Keep database migrations reversible
- Maintain version control for all changes
- Test rollback procedures regularly
- Document emergency procedures
Remember
This is a business application where reliability, security, and professional user experience are critical. Every decision should prioritize these values over development convenience or flashy features.
- Don't create demo pages unless absolutely necessary.
- Don't create unnecessary complexity.
- Don't run builds unless absolutely necessary, if you do, kill the dev servers.
- Don't start new dev servers unless asked.
- Don't start drizzle studio- you cannot do anything with it.