skillby totti95

create-entity

Automate creation of complete CRUD entities (backend Laravel + frontend Vue) following Budget Manager project conventions. Use when the user asks to create a new entity, model, resource, or CRUD feature. Triggers on requests like "create a new category entity", "add a product model with CRUD", "generate an entity for transactions", or any request to scaffold a complete feature with database, API, and UI components.

Installs: 0
Used in: 1 repos
Updated: 2d ago
$npx ai-builder add skill totti95/create-entity

Installs to .claude/skills/create-entity/

# Create Entity

Automatically generate a complete CRUD entity following Budget Manager's architectural conventions: Laravel backend (migration, model, controller, routes) + Vue frontend (TypeScript interface, API client, Pinia store, page component, route).

## Quick Start

Generate an entity by running the Python script with entity name and fields:

```bash
python3 scripts/generate_entity.py <entity-name> --fields="field1:type1,field2:type2,..." [--soft-deletes]
```

**Example:**
```bash
python3 scripts/generate_entity.py category --fields="name:string,description:text,isActive:boolean"
```

## Workflow

When a user requests entity creation:

1. **Parse the request** - Identify entity name and required fields
2. **Determine field types** - Map user requirements to supported types (see [field-types.md](references/field-types.md))
3. **Run the generator script** with appropriate options
4. **Review generated files** and inform user of manual steps
5. **Execute manual integration steps** (add routes, update imports)

## Generator Script Usage

### Basic Syntax

```bash
python3 scripts/generate_entity.py <entity-name> --fields="<field-definitions>" [options]
```

### Parameters

- `<entity-name>`: Entity name (singular, any case - will be normalized)
- `--fields`: Comma-separated field definitions in format `fieldName:fieldType`
- `--soft-deletes`: Optional flag to add soft delete support
- `--output`: Optional output directory (default: current directory)

### Field Definition Format

Fields are defined as `name:type` pairs separated by commas:

```
--fields="name:string,amount:integer,isActive:boolean,userId:foreignId"
```

**Naming conventions:**
- Use camelCase for field names (e.g., `userId`, `createdBy`)
- Generator automatically converts to snake_case for backend
- For foreign keys, end with `Id` (e.g., `categoryId` → `category_id`)

### Supported Field Types

Common types (see [field-types.md](references/field-types.md) for complete list):

- `string` - Variable-length text (VARCHAR 255)
- `text` - Long text content
- `integer` - Integer numbers (use for money in cents)
- `boolean` - True/false values
- `date` - Date only
- `datetime` - Date and time
- `foreignId` - Foreign key reference
- `decimal`, `float`, `json`, `bigInteger`, `timestamp`

## Generated Files

### Backend (Laravel)

1. **Migration** - `backend/database/migrations/YYYY_MM_DD_HHMMSS_create_<entities>_table.php`
   - Creates table with specified fields
   - Includes timestamps (created_at, updated_at)
   - Optional soft deletes (deleted_at)
   - Foreign key constraints with cascade delete

2. **Model** - `backend/app/Models/<Entity>.php`
   - Eloquent model with fillable fields
   - Optional SoftDeletes trait
   - Follows Laravel conventions

3. **Controller** - `backend/app/Http/Controllers/<Entity>Controller.php`
   - RESTful API controller with CRUD methods
   - Validation rules based on field types
   - JSON responses

4. **Routes snippet** - `backend/routes/<entity>_routes.txt`
   - Route definition to manually add to `api.php`

### Frontend (Vue + TypeScript)

5. **TypeScript interface** - `frontend/src/types/<entity>_interface.ts`
   - Interface definition in camelCase
   - To manually add to `types/index.ts`

6. **API client** - `frontend/src/api/<entities>.ts`
   - Axios-based API methods (list, get, create, update, delete)
   - Typed responses

7. **Pinia store** - `frontend/src/stores/<entity>.ts`
   - State management with loading/error states
   - CRUD action methods
   - Reactive state

8. **Vue page** - `frontend/src/pages/<Entities>Page.vue`
   - Basic list view component
   - Table with actions
   - Ready to customize

9. **Route snippet** - `frontend/src/router/<entity>_route.txt`
   - Route definition to manually add to router

## Manual Integration Steps

After running the generator, integrate the generated code:

### 1. Add Backend Route

Edit `backend/routes/api.php`:

```php
// Add inside the auth:sanctum middleware group
Route::apiResource('<entities>', <Entity>Controller::class);
```

Copy from the generated `backend/routes/<entity>_routes.txt` file.

### 2. Add TypeScript Interface

Edit `frontend/src/types/index.ts`:

```typescript
export interface <Entity> {
  id: number;
  // ... fields from generated file
  createdAt: string;
  updatedAt: string;
}
```

Copy from the generated `frontend/src/types/<entity>_interface.ts` file.

### 3. Add Frontend Route

Edit `frontend/src/router/index.ts`:

```typescript
{
  path: '/<entities>',
  name: '<entities>',
  component: () => import('@/pages/<Entities>Page.vue'),
  meta: { requiresAuth: true },
}
```

Copy from the generated `frontend/src/router/<entity>_route.txt` file.

### 4. Run Migration

Execute the migration to create the database table:

```bash
make artisan CMD="migrate"
```

### 5. Customize Vue Component

Edit the generated page component to:
- Display actual entity fields in the table
- Add create/edit forms
- Implement proper styling
- Add validation

## Examples

### Simple Entity with Basic Fields

**User request:** "Create a category entity with name, description, and active status"

**Command:**
```bash
python3 scripts/generate_entity.py category --fields="name:string,description:text,isActive:boolean"
```

**Generated:**
- Backend: Migration, Category model, CategoryController, routes
- Frontend: Category interface, categoriesApi, category store, CategoriesPage, route

### Entity with Relationships

**User request:** "Create an expense entity with amount, description, date, and links to category and user"

**Command:**
```bash
python3 scripts/generate_entity.py expense --fields="amountCents:integer,description:text,expenseDate:date,categoryId:foreignId,userId:foreignId"
```

**Foreign keys:** Automatically creates constraints to `categories` and `users` tables with cascade delete.

### Entity with Soft Deletes

**User request:** "Create a product entity that shouldn't be permanently deleted"

**Command:**
```bash
python3 scripts/generate_entity.py product --fields="name:string,priceCents:integer,stock:integer,sku:string" --soft-deletes
```

**Result:** Adds `deleted_at` column and `SoftDeletes` trait to model.

## Important Conventions

### Case Conversion
- **Backend:** Always snake_case (database, models, controllers)
- **Frontend:** Always camelCase (TypeScript, Vue)
- **Automatic:** Middleware handles conversion between API requests/responses

### Money Handling
Always use `integer` type for monetary amounts and store in cents:
```bash
--fields="priceCents:integer,totalAmount:integer"
```

Display conversion: `cents / 100` = euros
Input conversion: `euros * 100` = cents

### Foreign Keys
Name foreign key fields with `Id` suffix (camelCase):
- `userId` → references `users` table
- `categoryId` → references `categories` table
- `budgetTemplateId` → references `budget_templates` table

The generator automatically:
- Extracts the table name from the field name
- Creates `foreignId` column with `constrained()` and `onDelete('cascade')`
- Adds proper validation (`exists:table,id`)

### Timestamps
All entities automatically include:
- `created_at`
- `updated_at`

Don't specify these in `--fields`.

## Troubleshooting

### Permission Issues
If you encounter permission errors when creating files, ensure you're running the script from the project root and have write permissions.

### Field Type Not Recognized
Check [field-types.md](references/field-types.md) for supported types. If using a custom type, you may need to manually edit the generated migration.

### Foreign Key Constraint Fails
Ensure the referenced table exists before running the migration. Create parent entities first.

### Route Conflicts
If routes already exist, Laravel will throw an error. Check `api.php` for duplicate route names.

## Resources

### scripts/generate_entity.py
Main Python script that generates all backend and frontend files based on provided entity name and field definitions.

### references/field-types.md
Complete reference of supported field types with Laravel migration and TypeScript mappings, validation rules, and usage examples.

Quick Install

$npx ai-builder add skill totti95/create-entity

Details

Type
skill
Author
totti95
Slug
totti95/create-entity
Created
6d ago