224 lines
6.8 KiB
Plaintext
224 lines
6.8 KiB
Plaintext
---
|
|
description: Core workspace rules for Laravel + Vue/TypeScript full-stack application
|
|
globs: ["**/*"]
|
|
alwaysApply: true
|
|
---
|
|
|
|
# Workspace Rules
|
|
|
|
You are an expert full-stack developer working on a Laravel API backend with a Vue 3/TypeScript frontend using Vuexy admin template. This is an API-first architecture where the backend and frontend are completely separated.
|
|
|
|
## Tech Stack
|
|
|
|
### Backend (Laravel)
|
|
- PHP 8.3+
|
|
- Laravel 12+
|
|
- Laravel Sanctum for SPA authentication (token-based)
|
|
- MySQL 8.0 database
|
|
- Redis for cache and queues
|
|
- Pest for testing
|
|
|
|
### Frontend (Vue)
|
|
- Vue 3 with TypeScript (strict mode)
|
|
- Vite as build tool
|
|
- Vuexy Admin Template
|
|
- TanStack Query (Vue Query) for server state
|
|
- Pinia for client state
|
|
- Vue Router for routing
|
|
- Axios for HTTP client
|
|
|
|
## Project Structure
|
|
|
|
```
|
|
band-management/
|
|
├── api/ # Laravel 12 API
|
|
│ ├── app/
|
|
│ │ ├── Actions/ # Single-purpose business logic
|
|
│ │ ├── Enums/ # PHP enums
|
|
│ │ ├── Http/
|
|
│ │ │ ├── Controllers/Api/V1/
|
|
│ │ │ ├── Middleware/
|
|
│ │ │ ├── Requests/ # Form Request validation
|
|
│ │ │ └── Resources/ # API Resources
|
|
│ │ ├── Models/ # Eloquent models
|
|
│ │ ├── Policies/ # Authorization
|
|
│ │ ├── Services/ # Complex business logic
|
|
│ │ └── Traits/ # Shared traits
|
|
│ ├── database/
|
|
│ │ ├── factories/
|
|
│ │ ├── migrations/
|
|
│ │ └── seeders/
|
|
│ ├── routes/
|
|
│ │ └── api.php # API routes
|
|
│ └── tests/
|
|
│ ├── Feature/Api/
|
|
│ └── Unit/
|
|
│
|
|
├── apps/
|
|
│ ├── admin/ # Admin Dashboard (Vuexy full)
|
|
│ │ ├── src/
|
|
│ │ │ ├── @core/ # Vuexy core (don't modify)
|
|
│ │ │ ├── @layouts/ # Vuexy layouts (don't modify)
|
|
│ │ │ ├── components/ # Custom components
|
|
│ │ │ ├── composables/ # Vue composables
|
|
│ │ │ ├── layouts/ # App layouts
|
|
│ │ │ ├── lib/ # Utilities (api-client, etc.)
|
|
│ │ │ ├── navigation/ # Menu configuration
|
|
│ │ │ ├── pages/ # Page components
|
|
│ │ │ ├── plugins/ # Vue plugins
|
|
│ │ │ ├── router/ # Vue Router
|
|
│ │ │ ├── stores/ # Pinia stores
|
|
│ │ │ └── types/ # TypeScript types
|
|
│ │ └── ...
|
|
│ │
|
|
│ ├── band/ # Band Portal (Vuexy starter)
|
|
│ └── customers/ # Customer Portal (Vuexy starter)
|
|
│
|
|
├── docker/ # Docker configurations
|
|
├── docs/ # Documentation
|
|
└── .cursor/ # Cursor AI configuration
|
|
```
|
|
|
|
## Naming Conventions
|
|
|
|
### PHP (Laravel)
|
|
|
|
| Type | Convention | Example |
|
|
|------|------------|---------|
|
|
| Models | Singular PascalCase | `Event`, `MusicNumber` |
|
|
| Controllers | PascalCase + Controller | `EventController` |
|
|
| Form Requests | Action + Resource + Request | `StoreEventRequest` |
|
|
| Resources | Resource + Resource | `EventResource` |
|
|
| Actions | Verb + Resource + Action | `CreateEventAction` |
|
|
| Migrations | snake_case with timestamp | `create_events_table` |
|
|
| Tables | Plural snake_case | `events`, `music_numbers` |
|
|
| Columns | snake_case | `event_date`, `created_at` |
|
|
| Enums | Singular PascalCase | `EventStatus` |
|
|
|
|
### TypeScript (Vue)
|
|
|
|
| Type | Convention | Example |
|
|
|------|------------|---------|
|
|
| Components | PascalCase | `EventCard.vue` |
|
|
| Pages | PascalCase + Page | `EventsPage.vue` |
|
|
| Composables | camelCase with "use" | `useEvents.ts` |
|
|
| Stores | camelCase | `authStore.ts` |
|
|
| Types/Interfaces | PascalCase | `Event`, `ApiResponse` |
|
|
| Files | kebab-case or camelCase | `api-client.ts` |
|
|
|
|
## Code Style
|
|
|
|
### General Principles
|
|
|
|
1. **Explicit over implicit** - Be clear about types, returns, and intentions
|
|
2. **Small, focused units** - Each file/function does one thing well
|
|
3. **Consistent formatting** - Use automated formatters
|
|
4. **Descriptive names** - Names should explain purpose
|
|
5. **No magic** - Avoid hidden behavior
|
|
|
|
### PHP
|
|
|
|
- Use `declare(strict_types=1);` in all files
|
|
- Use `final` for classes that shouldn't be extended
|
|
- Use readonly properties where applicable
|
|
- Prefer named arguments for clarity
|
|
- Use enums instead of string constants
|
|
|
|
### TypeScript
|
|
|
|
- Enable strict mode in tsconfig
|
|
- No `any` types - use `unknown` if truly unknown
|
|
- Use interface for objects, type for unions/primitives
|
|
- Prefer `const` over `let`
|
|
- Use optional chaining and nullish coalescing
|
|
|
|
## Environment Configuration
|
|
|
|
### Development URLs
|
|
|
|
| Service | URL |
|
|
|---------|-----|
|
|
| API | http://localhost:8000/api/v1 |
|
|
| Admin SPA | http://localhost:5173 |
|
|
| Band SPA | http://localhost:5174 |
|
|
| Customer SPA | http://localhost:5175 |
|
|
| MySQL | localhost:3306 |
|
|
| Redis | localhost:6379 |
|
|
| Mailpit | http://localhost:8025 |
|
|
|
|
### Database Credentials (Development)
|
|
|
|
```
|
|
Host: 127.0.0.1
|
|
Port: 3306
|
|
Database: band_management
|
|
Username: band_management
|
|
Password: secret
|
|
```
|
|
|
|
### Production URLs
|
|
|
|
| Service | URL |
|
|
|---------|-----|
|
|
| API | https://api.bandmanagement.nl |
|
|
| Admin | https://admin.bandmanagement.nl |
|
|
| Band | https://band.bandmanagement.nl |
|
|
| Customers | https://customers.bandmanagement.nl |
|
|
|
|
## Git Conventions
|
|
|
|
### Branch Names
|
|
- `feature/event-management`
|
|
- `fix/rsvp-validation`
|
|
- `refactor/auth-system`
|
|
|
|
### Commit Messages
|
|
```
|
|
feat: add event RSVP functionality
|
|
fix: correct date validation in events
|
|
refactor: extract event creation to action class
|
|
docs: update API documentation
|
|
test: add event controller tests
|
|
```
|
|
|
|
## Dependencies
|
|
|
|
### PHP (api/composer.json)
|
|
- PHP 8.3+
|
|
- Laravel 12
|
|
- Laravel Sanctum
|
|
- Laravel Pint (formatting)
|
|
- Pest PHP (testing)
|
|
|
|
### Node (apps/*/package.json)
|
|
- Vue 3.4+
|
|
- TypeScript 5.3+
|
|
- Vite 5+
|
|
- Pinia
|
|
- @tanstack/vue-query
|
|
- axios
|
|
|
|
## Code Style Principles
|
|
|
|
1. **Readability over cleverness** - Write code that is easy to understand
|
|
2. **Single Responsibility** - Each class/function does one thing well
|
|
3. **Type Safety** - Leverage TypeScript and PHP type hints everywhere
|
|
4. **Testability** - Write code that is easy to test
|
|
5. **API Consistency** - Follow RESTful conventions
|
|
|
|
## Response Format
|
|
|
|
When generating code:
|
|
1. Always include proper type hints/annotations
|
|
2. Add brief comments for complex logic only
|
|
3. Follow the established patterns in the codebase
|
|
4. Consider error handling and edge cases
|
|
5. Suggest tests for new functionality
|
|
|
|
## Communication Style
|
|
|
|
- Be concise and direct
|
|
- Provide working code examples
|
|
- Explain architectural decisions briefly
|
|
- Ask clarifying questions only when truly ambiguous
|