# Magic CLI
- [Introduction](#introduction)
- [Installation](#installation)
- [Project Setup](#project-setup)
- [install](#install)
- [key:generate](#keygenerate)
- [Make Commands](#make-commands)
- [make:model](#makemodel)
- [make:controller](#makecontroller)
- [make:view](#makeview)
- [make:migration](#makemigration)
- [make:seeder](#makeseeder)
- [make:factory](#makefactory)
- [make:policy](#makepolicy)
- [make:provider](#makeprovider)
- [make:middleware](#makemiddleware)
- [make:enum](#makeenum)
- [make:event](#makeevent)
- [make:listener](#makelistener)
- [make:request](#makerequest)
- [make:lang](#makelang)
## Introduction
Magic CLI is the Artisan-like command-line tool for Magic. If you've used Laravel's Artisan, you'll feel right at home. Scaffold controllers, models, views, migrations, and more with a single command.
## Installation
Magic CLI ships as a Dart package dependency. Add it to your `pubspec.yaml` and run commands via `dart run`:
```bash
dart run magic:magic [arguments] [options]
```
> [!TIP]
> For a shorter command, activate Magic CLI globally:
>
> ```bash
> dart pub global activate magic_cli
> ```
>
> Ensure `~/.pub-cache/bin` is in your system PATH, then use `magic ` directly.
Verify installation:
```bash
dart run magic:magic --version
```
## Project Setup
### install
Initializes Magic in an existing Flutter project with the recommended directory structure and configuration.
```bash
dart run magic:magic install
```
This command:
1. Creates the directory structure (`lib/app/`, `lib/config/`, `lib/routes/`, etc.)
2. Generates configuration files with sensible defaults (app, routing, view are always created; others are optional)
3. Creates starter service providers (`AppServiceProvider`, `RouteServiceProvider`)
4. Writes `lib/main.dart` with Magic bootstrap
5. Creates `.env` and `.env.example` files
6. Registers `.env` as a Flutter asset in `pubspec.yaml`
7. Downloads `sqlite3.wasm` for web platform support (when database is enabled)
#### Excluding Features
You can exclude features you don't need with `--without-*` flags:
```bash
dart run magic:magic install --without-database
dart run magic:magic install --without-auth --without-events
```
| Flag | What it skips |
|------|---------------|
| `--without-auth` | Auth config, `VaultServiceProvider`, `AuthServiceProvider` |
| `--without-database` | Database directories, `config/database.dart`, `DatabaseServiceProvider`, web SQLite setup |
| `--without-network` | `config/network.dart`, `NetworkServiceProvider` |
| `--without-cache` | `config/cache.dart`, `CacheServiceProvider` |
| `--without-events` | `lib/app/events/` and `lib/app/listeners/` directories |
| `--without-localization` | `assets/lang/` directory, `LocalizationServiceProvider` |
| `--without-logging` | `config/logging.dart` |
| `--without-broadcasting` | `config/broadcasting.dart`, `BroadcastServiceProvider` |
### key:generate
Generates a random 32-byte encryption key for your application:
```bash
dart run magic:magic key:generate
```
Updates your `.env` file with:
```
APP_KEY=base64:randomGeneratedKey...
```
#### Options
| Option | Description |
|--------|-------------|
| `--show` | Display the key in the terminal instead of writing to `.env` |
## Make Commands
All `make:*` commands support the `--force` flag to overwrite existing files. Nested paths are supported via slash syntax (e.g., `Admin/Dashboard`), which creates subdirectories automatically.
Commands that auto-append a suffix (Controller, View, Factory, Seeder, Policy, ServiceProvider, Request) handle duplicates gracefully — `make:controller UserController` will not produce `UserControllerController`.
### make:model
Creates an Eloquent-style model with optional related files:
```bash
dart run magic:magic make:model User
dart run magic:magic make:model Post --migration --controller --factory
dart run magic:magic make:model Comment -mcf
dart run magic:magic make:model Product -mcfsp
dart run magic:magic make:model Order --all
```
#### Options
| Option | Shortcut | Description |
|--------|----------|-------------|
| `--migration` | `-m` | Create a database migration |
| `--controller` | `-c` | Create a controller |
| `--factory` | `-f` | Create a model factory |
| `--seeder` | `-s` | Create a database seeder |
| `--policy` | `-p` | Create an authorization policy |
| `--all` | `-a` | Create migration, seeder, factory, policy, and resource controller |
> [!NOTE]
> The `-mcfsp` shorthand combines all five flags: migration, controller, factory, seeder, and policy. The `--all` flag does the same but also makes the controller a resource controller with CRUD methods.
**Output:** `lib/app/models/.dart`
### make:controller
Creates a controller class:
```bash
dart run magic:magic make:controller User
dart run magic:magic make:controller UserController
dart run magic:magic make:controller Admin/Dashboard
dart run magic:magic make:controller Post --resource
dart run magic:magic make:controller Post --resource --model=Post
```
#### Options
| Option | Shortcut | Description |
|--------|----------|-------------|
| `--resource` | `-r` | Generate a resource controller with CRUD methods |
| `--model` | `-m` | The model the controller applies to |
**Output:** `lib/app/controllers/_controller.dart`
### make:view
Creates a view class:
```bash
dart run magic:magic make:view Login
dart run magic:magic make:view LoginView
dart run magic:magic make:view Auth/Register
dart run magic:magic make:view Dashboard --stateful
```
#### Options
| Option | Description |
|--------|-------------|
| `--stateful` | Generate a stateful view with lifecycle hooks |
**Output:** `lib/resources/views/_view.dart`
### make:migration
Creates a timestamped database migration file:
```bash
dart run magic:magic make:migration create_users_table
dart run magic:magic make:migration create_users_table --create=users
dart run magic:magic make:migration add_email_to_users --table=users
```
#### Options
| Option | Shortcut | Description |
|--------|----------|-------------|
| `--create` | `-c` | The table to be created (selects the create stub) |
| `--table` | `-t` | The table to migrate |
**Output:** `lib/database/migrations/m_YYYYMMDDHHMMSS_.dart`
### make:seeder
Creates a database seeder:
```bash
dart run magic:magic make:seeder User
dart run magic:magic make:seeder UserSeeder
```
**Output:** `lib/database/seeders/_seeder.dart`
### make:factory
Creates a model factory for generating fake data:
```bash
dart run magic:magic make:factory User
dart run magic:magic make:factory UserFactory
```
**Output:** `lib/database/factories/_factory.dart`
### make:policy
Creates an authorization policy:
```bash
dart run magic:magic make:policy Post
dart run magic:magic make:policy PostPolicy
dart run magic:magic make:policy Post --model=Post
dart run magic:magic make:policy Admin/Dashboard
```
#### Options
| Option | Shortcut | Description |
|--------|----------|-------------|
| `--model` | `-m` | The model the policy applies to |
**Output:** `lib/app/policies/_policy.dart`
### make:provider
Creates a service provider class with `register()` and `boot()` stubs:
```bash
dart run magic:magic make:provider Payment
dart run magic:magic make:provider PaymentServiceProvider
```
The `ServiceProvider` suffix is appended automatically when omitted.
**Output:** `lib/app/providers/_service_provider.dart`
### make:middleware
Creates a middleware class:
```bash
dart run magic:magic make:middleware EnsureAuthenticated
dart run magic:magic make:middleware Admin/RoleCheck
```
**Output:** `lib/app/middleware/.dart`
### make:enum
Creates a string-backed enum with `fromValue()` factory and `selectOptions` getter:
```bash
dart run magic:magic make:enum MonitorType
dart run magic:magic make:enum Status/OrderStatus
```
**Output:** `lib/app/enums/.dart`
### make:event
Creates a dispatchable event class that extends `MagicEvent`:
```bash
dart run magic:magic make:event UserLoggedIn
dart run magic:magic make:event Auth/TokenRefreshed
```
**Output:** `lib/app/events/.dart`
### make:listener
Creates an event listener class that extends `MagicListener`:
```bash
dart run magic:magic make:listener AuthRestore
dart run magic:magic make:listener AuthRestore --event=UserLoggedInEvent
dart run magic:magic make:listener Auth/RestoreSession
```
#### Options
| Option | Shortcut | Description |
|--------|----------|-------------|
| `--event` | `-e` | The event class the listener handles (defaults to `MagicEvent`) |
**Output:** `lib/app/listeners/.dart`
### make:request
Creates a form request class with a typed `rules()` method for request validation:
```bash
dart run magic:magic make:request StoreMonitor
dart run magic:magic make:request StoreMonitorRequest
```
The `Request` suffix is appended automatically when omitted.
**Output:** `lib/app/validation/requests/_request.dart`
### make:lang
Creates a language JSON file:
```bash
dart run magic:magic make:lang tr
dart run magic:magic make:lang es
dart run magic:magic make:lang de
```
**Output:** `assets/lang/.json`