Virtual types, Eloquent completion, Blade analysis, Livewire 3/4, Inertia, Filament v4, the Laravel 13 AI SDK, and native Enum support. Zero helper files. No PHP stubs generated. All intelligence lives in the editor.
Laravel Maestro synthesizes completions, hover docs, go-to-definition, diagnostics, and code generation directly from your project's AST and live PHP runtime — no generated stub files, no ide-helper, no configuration needed.
route('name') with live route data. Ctrl+Click controller
strings to jump directly to the method. CodeLens badges on every controller action.where* magic methods.
Accessor, scope, and relationship completions. No helper files generated.<x-component> tag
completions with typed prop attributes read directly from @props.wire: directive completions. Property names in wire:model.
Action names in wire:click. Volt helper completions. File rename updates all usages.Inertia::render(). Go-to-Definition from PHP to
Vue/React page component. Inertia page generator for all three frameworks.Ai::text(), Ai::embed(), Ai::image(),
Ai::audio() chain completions. 12 AI providers. whereVectorSimilarTo() for pgvector.
Agent & Tool generators.app/Enums/. Case completions,
from()/tryFrom(), match() arm generation, $casts
completion, hover with value table.env() outside config files.QuickPick and InputBox dialogs. Injected via WorkspaceEdit (single
undo).$fillable, add casts, define
relationships — all from a graphical panel. Changes written back as real PHP.ide.json to teach the extension about custom package functions.
Dynamically registers completion providers for route, view, config, translation, model, and column types.
A comprehensive list of every provider, generator, and intelligence feature included in Laravel Maestro v5.
| Feature | Description | Badge |
|---|---|---|
| Named route completion | Autocomplete route('name'), to_route('name'),
redirect()->route('name') with live route data, method badges, URI preview, and middleware
list |
Core |
| Route hover documentation | Hover any route string to see HTTP methods, URI, controller action, middleware stack, and required parameters in a rich panel | Core |
| Go-to-Definition | Ctrl+Click on 'UserController@index', a route name, or a view string to jump directly to
the file and line |
Core |
| CodeLens route badges | [GET /users/{id}] ghost-text badges appear above every public controller method, clicking
opens the Route List panel |
Core |
| Route List webview | Full filterable table of all routes with method, URI, name, action, middleware, and parameters. Opened via Show Route List command | Core |
| Route inlay hints | Ghost-text parameter names shown inline: route('posts.show', id: $id) |
Core |
| Workspace-wide rename | Rename a route name once; all route('old') calls across every PHP and Blade file are
updated in a single undoable operation |
Core |
| Middleware completions | Autocomplete middleware names in ->middleware('|') with built-in and project-specific
middleware from the route index |
Core |
| Wayfinder (JS/TS) | route('|') completions inside TypeScript, JavaScript, and Vue files for Laravel Wayfinder
users |
New |
| Feature | Description | Badge |
|---|---|---|
where* magic methods |
Virtual whereEmail(), whereNotStatus(), orWhereCreatedAt() etc.
generated from live DB column names |
Core |
| Column property completions | $model->column_name with type annotation and nullable indicator, sourced directly from
Schema::getColumnListing() |
Core |
| Relationship completions | All hasOne, hasMany, belongsTo, morphMany etc.
relationships on $model->| |
Core |
_count / _exists accessors |
$model->comments_count and $model->comments_exists completions for
withCount/withExists eager loads |
Core |
| Scope completions | Custom query scopes ::active(), ::withPendingOrders() — including PHP 8
#[Scope] attribute-based scopes |
Core |
| Accessor completions | getFirstNameAttribute() → virtual $model->first_name. New-style
Attribute::make() accessors also detected |
Core |
| Mass-assignment keys | User::create(['|']) and $model->fill(['|']) suggest all $fillable
fields with their PHP types |
Core |
| Factory state completions | User::factory()-> shows all standard methods (create, state,
sequence, has, for, recycle) plus custom state methods
from the factory class |
Core |
| Variable type inference | Backward-scans up to 60 lines to infer $user = User::find($id) and provides
$user->| completions for that model |
Core |
| New Eloquent builder methods | 22 newer methods: findSole(), withWhereRelation(),
createOrFirst(), toRawSql(), upsert(), lazy(),
insertOrIgnore() etc. |
New |
resolveRelationUsing() |
Dynamic relations registered in service providers are detected and appear in $model->|
completions |
New |
| Facade method completions | Full method completions for Cache::, DB::, Mail::,
Storage::, Auth::, Event::, Log::,
Queue::, Session::, Hash::, Http::,
Gate:: |
New |
| Model UI Webview | Visual panel (📊 CodeLens button on every Model class) to edit $fillable, add casts, and
define relationships without touching PHP directly |
New |
| Inlay hints for factories | User::factory()->create(['name' => /* string */ ...]) — ghost-type annotations
on every fillable key |
Core |
| N+1 query detection | Diagnostic warning when a relationship is accessed inside a foreach loop without prior
eager loading via with() |
New |
Unchecked find() warning |
Flags $x = Model::find($id) followed by $x->property without a null check |
New |
| Feature | Description | Badge |
|---|---|---|
| 47 directive completions | All Blade directives with snippet expansion: @if, @foreach, @can,
@vite, @class, @selected, @teleport,
@volt, and more |
Core |
<x-component> tags |
Autocomplete all anonymous and class-based Blade components with required props auto-inserted as a snippet | Core |
| Component attribute completions | Type-check HTML attributes against the @props([...]) declaration:
<x-alert | shows all typed props |
Core |
| View name completions | @include('|'), @extends('|'), view('|') autocomplete from all
discovered Blade views |
Core |
| Component hover | Hover <x-alert> to see the component class, file path, and prop table |
Core |
| Blade component rename | Rename a .blade.php or component PHP class file — all <x-component>
usages are updated across the workspace |
New |
| Extract Blade component | Select any HTML in a Blade file → Quick Fix: "Extract to Blade component". Detects
$variables and creates the @props declaration automatically |
New |
| View Usages CodeLens | "👁 Find view usages" lens on every Blade file — triggers workspace-wide search for all places the view is referenced | New |
| Twig view completions | view('file.twig') completions for projects using the TwigBridge package |
New |
| Feature | Description | Badge |
|---|---|---|
38 wire: directives |
wire:model, wire:model.live, wire:click.prevent,
wire:loading.delay, wire:navigate.hover, wire:current,
wire:poll, wire:confirm, and 30 more |
Core |
wire:model property names |
After wire:model=" — lists all public Livewire properties from the backing component class
|
Core |
wire:click action names |
After wire:click=" — lists all public action methods with parameter snippets |
Core |
@livewire('|') completions |
Component name completions for the @livewire() directive and <livewire:>
tags |
Core |
$this->| completions |
Inside a Livewire component class, $this->| shows properties, actions, computed properties,
and lifecycle hooks |
Core |
| Volt helper completions | state(), computed(), mount(), action(),
on(), url(), lazy(), locked(), layout()
in Volt .blade.php files |
Core |
| Event dispatch completions | $this->dispatch('|') suggests known event names from all indexed components |
New |
| Livewire rename handler | File rename triggers workspace-wide update of all @livewire('component-name') references
|
New |
| Go-to-Definition | Ctrl+Click a Livewire component tag to jump to the PHP class or Volt file | Core |
| Hover documentation | Hover a Livewire component name to see its properties, actions, and computed properties | Core |
| Feature | Description | Badge |
|---|---|---|
Ai:: facade completions |
Ai::text(), Ai::embed(), Ai::image(), Ai::audio(),
Ai::agent(), Ai::vectorStore() |
Laravel 13 AI |
| Text generation chain | Ai::text()-> chain: using(), withSystemPrompt(),
withTools(), withProviderOptions(), stream(),
temperature(), maxTokens() |
Laravel 13 AI |
| Provider completions | ->using('|') completes all 12 supported providers: openai,
anthropic, deepseek, mistral, cohere,
google, groq, openrouter, azure, ollama,
huggingface, replicate |
Laravel 13 AI |
| Audio API chain | Audio::of('text')->: voice(), speed(), format(),
asBase64(), asStream(), transcribe() |
Laravel 13 AI |
| Image API chain | Ai::image('prompt')->: size(), style(), quality(),
n(), url(), base64() |
Laravel 13 AI |
| Agent completions | ->prompt(), ->withTool(), ->maxSteps(),
->withMemory(), ->stream(), ->onStep() |
Laravel 13 AI |
| Vector search completions | whereVectorSimilarTo(), orderByVectorSimilarityTo(),
withEmbedding(), nearestNeighbors() on the query builder |
Laravel 13 AI |
Cache::touch() |
New Laravel 13 method — extend a cached item's TTL without fetching it. Completions, signature, and documentation | Laravel 13 |
Queue::route() |
New class-based queue routing. Completions inside boot() with job class and queue name |
Laravel 13 |
| JSON:API resource chain | ->withLinks(), ->withMeta(), ->withIncluded(),
->sparseFieldset(), ->paginationLinks() |
Laravel 13 |
| Generate AI Agent | Interactive generator for app/Ai/Agents/MyAgent.php — 4 types (Text, Search, Vision,
Audio), provider selection, system prompt |
Laravel 13 AI |
| Generate AI Tool | Interactive generator for app/Ai/Tools/MyTool.php with JSON Schema parameters and
handle() stub |
Laravel 13 AI |
| Generate JSON:API Resource | Full JsonApiResource subclass with attributes(), relationships(),
links(), meta() — auto-inferred from model columns |
Laravel 13 |
| Hover documentation | All AI SDK methods show Laravel 13 docs inline, including parameter types and return values | Laravel 13 AI |
| Feature | Description | Badge |
|---|---|---|
| Auto-indexing | Scans app/Enums/, app/Enum/, and app/Models/Enums/ on startup.
Parses backing type, cases, values, labels from label() method match arms |
New |
| Case completions | Status::| lists all cases with values (= 'active') and labels. Backing type
determines available methods |
New |
| Static method completions | Status:: → from(), tryFrom(), cases(),
values(), labels(), options(), collect(),
random(). Pure enums hide from/tryFrom |
New |
| Instance method completions | Status::Active->| → value, name, label,
color, is(), isNot(), in(), notIn() |
New |
$casts completions |
'status' => | inside $casts array suggests all indexed enum classes with
::class appended |
New |
| Validation rule completions | Rule::enum('|') and 'enum:MyEnum' syntax both autocomplete to all indexed enum
FQNs |
New |
match() arm generation |
Inside match($status) { |, infers the enum type from the variable and generates all case
arms as snippets |
New |
| Hover documentation | Hover any enum class name to see a formatted table of all cases, backing values, labels, and implemented interfaces | New |
| Go-to-Definition | Ctrl+Click any enum class name to jump directly to the enum declaration |
New |
| Cast diagnostic | Warns when a $casts entry maps to a class ending in
Status/Type/State/Role that isn't found in the enum
index |
New |
Laravel Maestro works automatically — just open a Laravel project containing an
artisan file. Here's how to get the most from each capability.
route(' anywhere in PHP or Blade — the extension detects the context
and offers all named routes from your live application. Routes are extracted by running
extract.php in the background.// Type route(' and see all named routes return redirect()->route('posts.show', [ 'post' => $post ]);
'Controller@method'
string to jump directly to the file and method line. F2 on a route name renames all usages
across the workspace.Model:: or $model-> to get virtual completions. Column
names come from your live DB schema. Scopes, accessors, and relationships are parsed from the AST.// Virtual where* from DB columns User::whereEmailVerifiedAt(null) ->whereActive(true) ->with('posts') ->withCount('comments') ->paginate(); // $model-> shows columns + relations $user->posts_count; // withCount accessor
<x- to see all components. The extension reads
@props([...]) declarations to offer typed attribute completions. Hover any component tag for full
prop documentation.<!-- Props from @props are typed --> <x-alert type="error" <-- autocompleted :message="$msg" <-- required prop /> <!-- @include completes view names --> @include('partials.header')
wire: anywhere in a Blade file to get all 38 directives. For
wire:model=", the extension reads the backing PHP class to offer property names. For
wire:click=", it offers action method names.<!-- All wire: directives autocomplete --> <input wire:model.live="search" wire:loading.class="opacity-50" /> <button wire:click="save" wire:confirm="Are you sure?" >Save</button>
Ai:: to see all AI facade methods. Chain completions work
automatically. Select a provider by typing ->using(' — all 12 providers are offered.use Laravel\Ai\Facades\Ai; // Text generation $text = Ai::text() ->using('anthropic') ->withSystemPrompt('...') ->generate($prompt); // Vector similarity search DB::table('docs') ->whereVectorSimilarTo('embedding', $query) ->limit(10) ->get();
app/Ai/Agents/.app/Enums/ are indexed automatically. Type MyEnum::
to see all cases. The extension parses backing types, values, and label() method returns.enum PostStatus: string { case Active = 'active'; case Draft = 'draft'; case Archived = 'archived'; } // All three cases appear in completions Post::where('status', PostStatus::Active) // $casts completion includes enum classes protected $casts = [ 'status' => PostStatus::class, ];
route('name') → yellow underline + hover for closest matchview('name') → warning with file path suggestion<x-component> → warning in Blade filesenv() outside config/ → warning: use config() insteadforeach without eager loading__('key'))$fillable from DB schema'unique:table' → Rule::unique('table')Open with Ctrl+Shift+P (Windows/Linux) or ⌘+Shift+P (macOS) and type Laravel Maestro to filter.
authorize() and rules() stubsJsonApiResource with attributes, relationships, links, meta
ShouldQueueInteractsWithSocketsenvelope() and content() methods (Laravel 9+
style)WithoutModelEventsapp/Enums/app/Traits/, app/Concerns/, or
app/Models/Concerns/handle() method and correct return typejoin() authorization methodregister() and boot()config/ with env() integration stubValidationRule
rules() fieldsapp/Ai/Agents/
handle() stublang/en/*.php and replace with
__('key')Configure via File → Preferences → Settings and search for
laravelMaestro, or edit settings.json directly.
| Setting Key | Default | Description |
|---|---|---|
| phpExecutable | "php" |
Path to the PHP binary used for runtime extraction. Set to "php8.3" or an absolute path if
needed. |
| runtimeExtractionTimeout | 10000 |
Maximum milliseconds for the PHP runtime extractor. Increase for slow environments. |
| enableEloquentCompletion | true |
Enable virtual Eloquent method, column, and relationship completions. |
| enableRouteCompletion | true |
Enable route name completions for route(), to_route(), and related functions.
|
| enableBladeCompletion | true |
Enable Blade directive, component tag, and attribute completions. |
| enableLivewireCompletion | true |
Enable Livewire wire: directive, property, and action completions. |
| enableInertiaCompletion | true |
Enable Inertia.js page name completions. |
| enableFilamentCompletion | true |
Enable Filament field and column type completions. |
| enableEnumCompletion | true |
Enable PHP Enum case completions, hover documentation, and cast diagnostics. |
| enableInlayHints | true |
Enable ghost-text type annotations on factory keys, route parameters, and config values. |
| enableCodeLens | true |
Enable route badges on controller methods and the 📊 Model UI button on Eloquent models. |
| enableDiagnostics | true |
Enable live error detection for unknown routes, views, components, and N+1 queries. |
| enablePackageProviders | true |
Enable completions for spatie/laravel-query-builder, Pennant, Nova, nWidart modules, etc. |
| excludePatterns | ["vendor/**", ...] |
Glob patterns excluded from AST indexing. Add your own build directories here. |
| lruCacheSize | 500 |
Maximum number of parsed AST entries in the LRU cache. Increase for very large codebases. |
| aiDefaultProvider | "openai" |
Default AI provider shown in completions for ->using('|') when using the Laravel 13 AI SDK.
|
| enumDirectories | ["app/Enums", ...] |
Directories to scan for PHP Enum definitions. Add custom paths for non-standard structures. |
| modulesPath | "Modules" |
Root directory for nWidart/laravel-modules. Change if your modules live elsewhere. |
Laravel Maestro activates automatically when VS Code finds an artisan file in
your workspace root. No configuration required for most projects.
ext install laravel-maestro.laravel-maestro
.vsix file and install manually:code --install-extension laravel-maestro-5.0.0.vsix
npm:git clone https://github.com/laravel-maestro/laravel-maestro cd laravel-maestro npm install node esbuild.js --production npx vsce package
VSCODE_LARAVEL_INDEXING=true before
bootstrapping your app. Guard against accidental side-effects:// AppServiceProvider::boot() if (env('VSCODE_LARAVEL_INDEXING')) { return; // skip migrations, queues, etc. }