thumanics / laravel-boost
A Laravel package to boost development with common tools and services
Installs: 18
Dependents: 1
Suggesters: 0
Security: 0
Stars: 0
Watchers: 0
Forks: 0
Open Issues: 0
pkg:composer/thumanics/laravel-boost
Requires
- php: ^8.2
- guzzlehttp/guzzle: ^7.9
- illuminate/console: ^11.45.3|^12.41.1
- illuminate/contracts: ^11.45.3|^12.41.1
- illuminate/routing: ^11.45.3|^12.41.1
- illuminate/support: ^11.45.3|^12.41.1
- laravel/mcp: ^0.5.1
- laravel/prompts: ^0.3.10
- laravel/roster: ^0.2.9
- spatie/laravel-medialibrary: ^11.18
- spatie/laravel-sluggable: ^3.7
- tailflow/laravel-orion: ^2.23
Requires (Dev)
- laravel/pint: ^1.27.0
- mockery/mockery: ^1.6.12
- orchestra/testbench: ^9.15.0|^10.6
- pestphp/pest: ^2.36.0|^3.8.4|^4.1.5
- phpstan/phpstan: ^2.1.27
- rector/rector: ^2.1
README
Introduction
resurex-boost
Laravel Boost accelerates AI-assisted development by providing the essential context and structure that AI needs to generate high-quality, Laravel-specific code.
Official Documentation
Documentation for Laravel Boost can be found on the Laravel website.
Contributing
Thank you for considering contributing to Boost! The contribution guide can be found in the Laravel documentation.
Code of Conduct
In order to ensure that the Laravel community is welcoming to all, please review and abide by the Code of Conduct.
Security Vulnerabilities
Please review our security policy on how to report security vulnerabilities.
Guide d'implementation de nouvelles fonctionnalites - Laravel Boost
Ce guide documente pas a pas les patterns a suivre pour ajouter de nouvelles fonctionnalites au package Laravel Boost, en s'appuyant sur les conventions existantes du code source.
Table des matieres
- Ajouter un outil MCP
- Ajouter un agent IA
- Ajouter des guidelines pour un package
- Ajouter un prompt MCP
- Ajouter une ressource MCP
- Ajouter un skill
- Ajouter une commande Artisan
- Ajouter un middleware ou service
Fonctionnalites existantes par defaut
Outils MCP (src/Mcp/Tools/)
15 outils enregistres dans Boost::discoverTools() :
| Outil | Description | ReadOnly | Parametres |
|---|---|---|---|
ApplicationInfo |
Infos completes de l'app (PHP, Laravel, packages, models Eloquent) | Oui | aucun |
BrowserLogs |
Lire les N derniers logs du navigateur (debug frontend/JS) | Oui | entries (int, requis) |
DatabaseConnections |
Lister les connexions BDD configurees | Oui | aucun |
DatabaseQuery |
Executer une requete SQL en lecture seule | Oui | query (string, requis), database (string) |
DatabaseSchema |
Schema BDD : tables, colonnes, index, cles etrangeres | Oui | database, filter, include_views, include_routines, include_column_details |
GetAbsoluteUrl |
URL absolue pour un chemin relatif ou une route nommee | Oui | path (string), route (string) |
GetConfig |
Valeur d'une config en notation pointee (ex: app.name) |
Oui | key (string, requis) |
LastError |
Details de la derniere erreur/exception backend | Oui | aucun |
ListArtisanCommands |
Lister toutes les commandes Artisan disponibles | Oui | aucun |
ListAvailableConfigKeys |
Lister toutes les cles de config en notation pointee | Oui | aucun |
ListAvailableEnvVars |
Lister les variables d'environnement du .env |
Oui | filename (string) |
ListRoutes |
Lister toutes les routes (y compris Folio) | Oui | method, action, name, domain, path, except_path, except_vendor, only_vendor |
ReadLogEntries |
Lire les N derniers logs applicatifs (PSR-3) | Oui | entries (int, requis) |
SearchDocs |
Recherche semantique dans la doc Laravel et packages | Non | queries (array, requis), packages (array), token_limit (int) |
Tinker |
Executer du code PHP dans le contexte Laravel | Non | code (string, requis), timeout (int, requis) |
Prompts MCP (src/Mcp/Prompts/)
Enregistres dans Boost::discoverPrompts() :
| Prompt | Nom MCP | Description |
|---|---|---|
LaravelCodeSimplifier |
laravel-code-simplifier |
Simplifie et affine le code PHP/Laravel pour la clarte et la maintenabilite |
UpgradeLivewireV4 |
upgrade-livewire-v4 |
Guide pas a pas pour migrer de Livewire v3 a v4 |
PackageGuidelinePrompt |
(dynamique par package) | Guidelines auto-generees pour chaque package tiers ayant un .ai/core.blade.php |
Ressources MCP (src/Mcp/Resources/)
Enregistrees dans Boost::discoverResources() :
| Ressource | URI | Description |
|---|---|---|
ApplicationInfo |
file://instructions/application-info.md |
Infos completes de l'app (delegue a l'outil ApplicationInfo via ToolExecutor) |
PackageGuidelineResource |
(dynamique) | Guidelines auto-generees pour chaque package tiers |
Agents IA (src/Install/Agents/)
7 agents enregistres dans BoostManager::$agents. Tous implementent SupportsGuidelines, SupportsMcp et SupportsSkills.
| Agent | Identifiant | Config MCP | Guidelines | Particularites |
|---|---|---|---|---|
ClaudeCode |
claude_code |
.mcp.json |
CLAUDE.md |
- |
Cursor |
cursor |
.cursor/mcp.json |
AGENTS.md |
frontmatter() retourne true |
Copilot |
copilot |
.vscode/mcp.json |
AGENTS.md |
frontmatter() retourne true |
Codex |
codex |
.codex/config.toml |
AGENTS.md |
Config TOML, mcpConfigKey() = mcp |
Gemini |
gemini |
.gemini/settings.json |
GEMINI.md |
transformGuidelines() echappe les @ |
Junie |
junie |
.junie/mcp/mcp.json |
.junie/guidelines.md |
useAbsolutePathForMcp() retourne true |
OpenCode |
opencode |
opencode.json |
AGENTS.md |
- |
Commandes Artisan (src/Console/)
5 commandes enregistrees dans BoostServiceProvider::registerCommands() :
| Commande | Classe | Description |
|---|---|---|
boost:install |
InstallCommand |
Installation interactive (guidelines, skills, MCP) |
boost:update |
UpdateCommand |
Mettre a jour guidelines et skills vers la derniere version |
boost:mcp |
StartCommand |
Demarrer le serveur MCP (appele depuis mcp.json) |
boost:execute-tool |
ExecuteToolCommand |
Executer un outil MCP en isolation (commande interne) |
boost:add-skill |
AddSkillCommand |
Ajouter des skills depuis un depot GitHub distant |
Skills (.ai/)
10 skills uniques repartis sur plusieurs versions de packages :
| Skill | Package | Versions | Activation |
|---|---|---|---|
livewire-development |
Livewire | v2, v3, v4 | Composants reactifs, directives wire:*, tests Livewire |
inertia-react-development |
Inertia React | v1, v2 | Pages React, formulaires, navigation avec Link/router |
inertia-vue-development |
Inertia Vue | v1, v2 | Pages Vue, formulaires, navigation |
inertia-svelte-development |
Inertia Svelte | v1, v2 | Pages Svelte, formulaires, navigation |
volt-development |
Volt | - | Composants Livewire single-file, API fonctionnelle |
folio-routing |
Folio | - | Routes file-based, parametres, model binding |
pest-testing |
Pest | v3, v4 | Tests unitaires/feature, assertions, architecture tests |
mcp-development |
MCP | - | Creation d'outils/ressources/prompts MCP |
wayfinder-development |
Wayfinder | - | Routes Laravel depuis le frontend TypeScript |
Guidelines packages (.ai/)
20+ packages avec guidelines Blade dans .ai/{package}/core.blade.php :
| Categorie | Packages |
|---|---|
| Core | foundation, boost, php (8.2, 8.3, 8.4, 8.5), laravel (v11, v12) |
| Frontend | livewire, inertia-laravel (v1, v2), inertia-react, inertia-vue, inertia-svelte, tailwindcss, volt, wayfinder |
| UI | fluxui-free, fluxui-pro |
| Testing | pest, phpunit, pint |
| Outils | folio, pennant, mcp, sail, herd |
| Conditionnel | enforce-tests (active si choisi a l'installation) |
Middleware & Services
| Type | Classe | Role |
|---|---|---|
| Middleware | InjectBoost |
Injecte le script JS de capture des logs navigateur dans les reponses HTML |
| Service | BrowserLogger |
Genere le JavaScript qui intercepte console.*, erreurs globales et rejections, envoie a POST /_boost/browser-logs |
Configuration (config/boost.php)
| Cle | Defaut | Description |
|---|---|---|
enabled |
true |
Interrupteur principal de Boost |
browser_logs_watcher |
true |
Active/desactive la capture des logs navigateur |
executable_paths.php |
null |
Chemin personnalise vers l'executable PHP |
executable_paths.composer |
null |
Chemin personnalise vers Composer |
executable_paths.npm |
null |
Chemin personnalise vers npm |
executable_paths.vendor_bin |
null |
Chemin personnalise vers vendor/bin |
Le filtrage MCP (exclude/include par outil, prompt, ressource) est gere dynamiquement par Boost::filterPrimitives() et n'apparait pas dans la config par defaut.
Guide d'implementation
1. Ajouter un outil MCP
Les outils MCP permettent aux agents IA d'interagir avec l'application Laravel (requetes BDD, routes, config, etc.).
Etape 1 : Creer la classe
Creer un fichier dans src/Mcp/Tools/MonOutil.php :
<?php declare(strict_types=1); namespace Laravel\Boost\Mcp\Tools; use Illuminate\Contracts\JsonSchema\JsonSchema; use Illuminate\JsonSchema\Types\Type; use Laravel\Mcp\Request; use Laravel\Mcp\Response; use Laravel\Mcp\Server\Tool; use Laravel\Mcp\Server\Tools\Annotations\IsReadOnly; #[IsReadOnly] // Ajouter si l'outil ne modifie aucun etat class MonOutil extends Tool { protected string $description = 'Description claire de ce que fait l\'outil'; /** * @return array<string, Type> */ public function schema(JsonSchema $schema): array { return [ 'param_requis' => $schema ->string() ->description('Description du parametre') ->required(), 'param_optionnel' => $schema ->boolean() ->description('Description du parametre optionnel'), ]; } public function handle(Request $request): Response { $param = $request->get('param_requis'); $optionnel = $request->get('param_optionnel', false); // Logique metier... return Response::json(['resultat' => $data]); // OU Response::text('Texte markdown'); // OU Response::error('Message d\'erreur'); } }
Elements cles :
- Etendre
Laravel\Mcp\Server\Tool $description(obligatoire) : decrit l'outil pour l'agent IAschema(): definit les parametres d'entree avec leur type et descriptionhandle(): recoit unRequest, retourne unResponse#[IsReadOnly]: annotation pour les outils en lecture seule
Injection de dependances : Le constructeur supporte l'injection via le container Laravel :
public function __construct(protected Roster $roster) { // }
Etape 2 : Enregistrer l'outil
Ajouter la classe dans la methode discoverTools() de src/Mcp/Boost.php :
protected function discoverTools(): array { return $this->filterPrimitives([ // ... outils existants ... MonOutil::class, // <-- Ajouter ici ], 'tools'); }
Etape 3 : Ecrire les tests
Creer tests/Feature/Mcp/Tools/MonOutilTest.php :
<?php declare(strict_types=1); use Laravel\Boost\Mcp\Tools\MonOutil; use Laravel\Mcp\Request; test('it returns expected data', function (): void { $tool = new MonOutil; $response = $tool->handle(new Request(['param_requis' => 'valeur'])); expect($response) ->isToolResult() ->toolHasNoError() ->toolJsonContentToMatchArray(['resultat' => 'valeur_attendue']); }); test('it returns error when param is invalid', function (): void { $tool = new MonOutil; $response = $tool->handle(new Request(['param_requis' => 'invalide'])); expect($response) ->isToolResult() ->toolHasError(); });
Expectations personnalisees disponibles :
isToolResult(): verifie que c'est uneResponsetoolHasNoError()/toolHasError(): verifie le statuttoolTextContains('texte'): verifie le contenu textetoolTextDoesNotContain('texte'): verifie l'absencetoolJsonContent(fn ($data) => ...): assertion sur le JSON parsetoolJsonContentToMatchArray([...]): correspondance partielle
Etape 4 : Verifier
composer test -- --filter=MonOutilTest
composer lint
Configuration optionnelle
L'outil peut etre exclu ou inclus via config/boost.php (publiable dans l'app hote) :
'mcp' => [ 'tools' => [ 'exclude' => [MonOutil::class], // Exclure 'include' => [AutreOutil::class], // Inclure un outil externe ], ],
Execution en sous-processus
Les outils sont executes dans des sous-processus PHP isoles via ToolExecutor. Cela signifie :
- Chaque execution demarre un processus PHP frais
- Aucun etat partage entre les executions
- Timeout configurable (defaut : 180s, max : 600s)
- Les modifications de code sont prises en compte entre les appels
2. Ajouter un agent IA
Un agent represente un assistant IA (IDE ou CLI) que Boost peut configurer.
Etape 1 : Creer la classe
Creer src/Install/Agents/MonAgent.php :
<?php declare(strict_types=1); namespace Laravel\Boost\Install\Agents; use Laravel\Boost\Contracts\SupportsGuidelines; use Laravel\Boost\Contracts\SupportsMcp; use Laravel\Boost\Contracts\SupportsSkills; use Laravel\Boost\Install\Enums\McpInstallationStrategy; use Laravel\Boost\Install\Enums\Platform; class MonAgent extends Agent implements SupportsGuidelines, SupportsMcp, SupportsSkills { public function name(): string { return 'mon_agent'; // Identifiant snake_case unique } public function displayName(): string { return 'Mon Agent'; // Nom affiche a l'utilisateur } public function systemDetectionConfig(Platform $platform): array { return match ($platform) { Platform::Darwin, Platform::Linux => [ 'command' => 'command -v monagent', ], Platform::Windows => [ 'command' => 'where monagent 2>nul', ], }; } public function projectDetectionConfig(): array { return [ 'paths' => ['.monagent'], 'files' => ['MONAGENT.md'], ]; } public function mcpInstallationStrategy(): McpInstallationStrategy { return McpInstallationStrategy::FILE; // Alternatives : McpInstallationStrategy::SHELL, McpInstallationStrategy::NONE } public function mcpConfigPath(): string { return '.monagent/mcp.json'; } public function guidelinesPath(): string { return config('boost.agents.mon_agent.guidelines_path', 'MONAGENT.md'); } public function skillsPath(): string { return config('boost.agents.mon_agent.skills_path', '.monagent/skills'); } }
Methodes abstraites obligatoires :
name(): identifiant unique en snake_casedisplayName(): nom lisiblesystemDetectionConfig(Platform): comment detecter l'agent sur le systemeprojectDetectionConfig(): comment detecter l'agent dans le projet
Contrats optionnels :
| Contrat | Methodes a implementer | Usage |
|---|---|---|
SupportsGuidelines |
guidelinesPath(), frontmatter(), transformGuidelines() |
L'agent recoit des guidelines |
SupportsMcp |
useAbsolutePathForMcp(), getPhpPath(), getArtisanPath(), installMcp() |
L'agent supporte le protocole MCP |
SupportsSkills |
skillsPath() |
L'agent supporte les skills |
Note :
frontmatter(),transformGuidelines(),useAbsolutePathForMcp(),getPhpPath(),getArtisanPath()etinstallMcp()ont des implementations par defaut dans la classeAgent. Il suffit de les surcharger si necessaire.
Methodes surchargeables :
frontmatter(): bool- Retournertruesi le fichier de guidelines necessite du frontmatter YAML (ex: Cursor)transformGuidelines(string $markdown): string- Transformer le markdown genere (ex: Gemini echappe les@)useAbsolutePathForMcp(): bool- Utiliser des chemins absolus pour le MCP (ex: Junie)mcpConfigKey(): string- Cle de configuration MCP (defaut :mcpServers)defaultMcpConfig(): array- Configuration MCP par defautshellMcpCommand(): ?string- Commande shell pour l'installation MCP (strategie SHELL)
Etape 2 : Enregistrer l'agent
Ajouter dans le tableau $agents de src/BoostManager.php :
private array $agents = [ // ... agents existants ... 'mon_agent' => MonAgent::class, // <-- Ajouter ici ];
Etape 3 : Ecrire les tests
<?php declare(strict_types=1); use Laravel\Boost\Install\Agents\MonAgent; use Laravel\Boost\Install\Detection\DetectionStrategyFactory; test('MonAgent returns correct name', function (): void { $factory = Mockery::mock(DetectionStrategyFactory::class); $agent = new MonAgent($factory); expect($agent->name())->toBe('mon_agent') ->and($agent->displayName())->toBe('Mon Agent'); }); test('MonAgent returns relative php path by default', function (): void { config(['boost.executable_paths.php' => null]); $factory = Mockery::mock(DetectionStrategyFactory::class); $agent = new MonAgent($factory); expect($agent->getPhpPath())->toBe('php'); });
Etape 4 : Verifier
composer test -- --filter=MonAgent
composer lint
3. Ajouter des guidelines pour un package
Les guidelines fournissent du contexte specifique a un package aux agents IA.
Etape 1 : Creer la structure de repertoires
.ai/
mon-package/
core.blade.php # Guidelines de base (toutes versions)
1/
core.blade.php # Guidelines specifiques a la v1
2/
core.blade.php # Guidelines specifiques a la v2
skill/
mon-skill/
SKILL.blade.php # Skill associe a la v2
SKILL.md # Documentation du skill
Le nom du repertoire est le nom du package composer normalise (vendor/package -> package).
Etape 2 : Ecrire le template Blade
.ai/mon-package/core.blade.php :
@php /** @var \Laravel\Boost\Install\GuidelineAssist $assist */ @endphp # Mon Package - Description du package et son role dans l'application. - Conventions importantes a suivre. @if($assist->hasPackage(\Laravel\Roster\Enums\Packages::SOME_PACKAGE)) ## Integration avec Some Package - Instructions specifiques quand les deux packages sont utilises ensemble. @endif
Variables disponibles dans les templates :
$assist(GuidelineAssist) : acces aux packages installes, versions, chemins, configuration
Methodes utiles de $assist :
$assist->hasPackage(Packages::NAME): verifie si un package est installe$assist->hasSkillsEnabled(): verifie si les skills sont actives$assist->skills(): collection des skills disponibles$assist->inertia()->pagesDirectory(): repertoire des pages Inertia
Directives speciales :
@boostsnippet('Nom de l\'exemple', 'php') // Code qui sera preserve tel quel, sans interpretation Blade $variable = "valeur"; @endboostsnippet
@boostsnippet protege les blocs de code de l'interpretation Blade. Les backticks et balises <?php sont aussi automatiquement proteges.
Etape 3 : Decouverte automatique
Les guidelines sont decouvertes automatiquement par GuidelineComposer :
- Les guidelines dans
.ai/du package Boost sont integrees directement - Les packages tiers peuvent fournir leurs propres guidelines dans
.ai/de leur repertoire - Les guidelines conditionnelles sont filtrees selon les packages detectes par
Roster
Etape 4 : Verifier
php artisan boost:install --guidelines
4. Ajouter un prompt MCP
Les prompts MCP sont des instructions pre-construites que les agents IA peuvent invoquer.
Etape 1 : Creer la structure
src/Mcp/Prompts/
MonPrompt/
MonPrompt.php # Classe du prompt
mon-prompt.blade.php # Contenu du prompt (template Blade)
Etape 2 : Creer la classe
src/Mcp/Prompts/MonPrompt/MonPrompt.php :
<?php declare(strict_types=1); namespace Laravel\Boost\Mcp\Prompts\MonPrompt; use Laravel\Boost\Concerns\RendersBladeGuidelines; use Laravel\Mcp\Response; use Laravel\Mcp\Server\Prompt; class MonPrompt extends Prompt { use RendersBladeGuidelines; protected string $name = 'mon-prompt'; protected string $title = 'mon_prompt'; protected string $description = 'Description de ce que fait ce prompt et quand l\'utiliser.'; public function handle(): Response { $content = $this->renderBladeFile(__DIR__.'/mon-prompt.blade.php'); return Response::text($content); } }
Etape 3 : Creer le template Blade
src/Mcp/Prompts/MonPrompt/mon-prompt.blade.php :
# Instructions pour Mon Prompt ## Objectif Decrire l'objectif du prompt ici. ## Regles - Regle 1 - Regle 2 @boostsnippet('Exemple', 'php') // Code d'exemple @endboostsnippet
Etape 4 : Enregistrer le prompt
Ajouter dans discoverPrompts() de src/Mcp/Boost.php :
protected function discoverPrompts(): array { $availablePrompts = [ LaravelCodeSimplifier::class, UpgradeLivewireV4::class, MonPrompt::class, // <-- Ajouter ici ...$this->discoverThirdPartyPrimitives(Prompt::class), ]; return $this->filterPrimitives($availablePrompts, 'prompts'); }
Etape 5 : Ecrire les tests
tests/Feature/Mcp/Prompts/MonPromptTest.php :
<?php declare(strict_types=1); use Laravel\Boost\Mcp\Prompts\MonPrompt\MonPrompt; beforeEach(function (): void { $this->prompt = new MonPrompt; }); test('it has correct name', function (): void { expect($this->prompt->name())->toBe('mon-prompt'); }); test('it has a description', function (): void { expect($this->prompt->description())->not->toBeEmpty(); }); test('it returns valid response', function (): void { $response = $this->prompt->handle(); expect($response) ->isToolResult() ->toolHasNoError() ->toolTextContains('Instructions pour Mon Prompt'); });
Etape 6 : Verifier
composer test -- --filter=MonPromptTest
composer lint
5. Ajouter une ressource MCP
Les ressources MCP exposent des donnees persistantes que les agents IA peuvent consulter.
Etape 1 : Creer la classe
src/Mcp/Resources/MonResource.php :
<?php declare(strict_types=1); namespace Laravel\Boost\Mcp\Resources; use Laravel\Mcp\Response; use Laravel\Mcp\Server\Resource; class MonResource extends Resource { protected string $description = 'Description de la ressource et de son contenu.'; protected string $uri = 'file://instructions/mon-resource.md'; protected string $mimeType = 'text/markdown'; public function handle(): Response { // Option A : Contenu direct return Response::json(['data' => 'valeur']); // Option B : Via ToolExecutor (deleguer a un outil existant) // $response = $this->toolExecutor->execute(MonOutil::class); // return $response; // Option C : Via template Blade (utiliser le trait RendersBladeGuidelines) // $content = $this->renderBladeFile(__DIR__.'/mon-resource.blade.php'); // return Response::text($content); } }
Proprietes obligatoires :
$description: description de la ressource$uri: URI canonique (formatfile://instructions/nom.md)$mimeType: type MIME (text/markdown,text/plain,application/json)
Etape 2 : Enregistrer la ressource
Ajouter dans discoverResources() de src/Mcp/Boost.php :
protected function discoverResources(): array { $availableResources = [ Resources\ApplicationInfo::class, Resources\MonResource::class, // <-- Ajouter ici ...$this->discoverThirdPartyPrimitives(Resource::class), ]; return $this->filterPrimitives($availableResources, 'resources'); }
Etape 3 : Ecrire les tests et verifier
Meme pattern que les outils et prompts. Utiliser les expectations isToolResult(), etc.
composer test -- --filter=MonResourceTest
composer lint
6. Ajouter un skill
Les skills sont des capacites specialisees que les agents peuvent activer selon le contexte.
Etape 1 : Creer le fichier skill
.ai/mon-package/2/skill/mon-skill/SKILL.blade.php :
--- name: mon-skill description: "Activer ce skill quand l'utilisateur travaille avec [contexte specifique]. Fournit des patterns et conventions pour [usage]." license: MIT metadata: author: laravel --- # Mon Skill ## Quand activer Activer ce skill quand : - L'utilisateur travaille avec [contexte] - L'utilisateur mentionne [mots-cles] ## Conventions - Convention 1 - Convention 2 ## Exemples @boostsnippet('Exemple basique', 'php') // Code d'exemple @endboostsnippet
Frontmatter obligatoire :
name: identifiant en kebab-casedescription: description de quand activer le skill et ce qu'il fait
Placement :
- Skills lies a un package :
.ai/{package}/{version}/skill/{skill-name}/SKILL.blade.php - Skills generiques :
.ai/skills/{skill-name}/SKILL.blade.php
Etape 2 : Decouverte automatique
Les skills sont automatiquement decouverts par SkillComposer qui scanne les repertoires .ai/ :
- Decouverte dans le repertoire
.ai/de Boost - Decouverte dans les packages tiers avec des guidelines Boost
- Decouverte dans les skills personnalises de l'utilisateur
Le SkillWriter ecrit les skills dans le repertoire defini par $agent->skillsPath() pour chaque agent configure.
Etape 3 : Verifier
php artisan boost:install --skills
7. Ajouter une commande Artisan
Etape 1 : Creer la classe
src/Console/MaCommand.php :
<?php declare(strict_types=1); namespace Laravel\Boost\Console; use Illuminate\Console\Command; use Symfony\Component\Console\Attribute\AsCommand; #[AsCommand('boost:ma-commande', 'Description courte de la commande')] class MaCommand extends Command { public function handle(): int { // Logique de la commande... $this->info('Commande executee avec succes.'); return self::SUCCESS; // OU self::FAILURE en cas d'erreur } }
Regles architecturales (appliquees par tests/ArchTest.php) :
- La classe DOIT etendre
Illuminate\Console\Command - Le nom de classe DOIT avoir le suffixe
Command - Namespace :
Laravel\Boost\Console
Avec options et injection de dependances :
#[AsCommand('boost:ma-commande', 'Description')] class MaCommand extends Command { protected $signature = 'boost:ma-commande {--option-a : Description de l\'option A} {argument : Description de l\'argument}'; public function handle(MonService $service): int { $optionA = $this->option('option-a'); $arg = $this->argument('argument'); // ... return self::SUCCESS; } }
Etape 2 : Enregistrer la commande
Ajouter dans registerCommands() de src/BoostServiceProvider.php :
protected function registerCommands(): void { if ($this->app->runningInConsole()) { $this->commands([ Console\StartCommand::class, Console\InstallCommand::class, Console\UpdateCommand::class, Console\ExecuteToolCommand::class, Console\AddSkillCommand::class, Console\MaCommand::class, // <-- Ajouter ici ]); } }
Etape 3 : Ecrire les tests
<?php declare(strict_types=1); test('boost:ma-commande executes successfully', function (): void { $this->artisan('boost:ma-commande') ->assertSuccessful(); }); test('boost:ma-commande with options', function (): void { $this->artisan('boost:ma-commande', ['--option-a' => true]) ->assertSuccessful() ->expectsOutput('Resultat attendu'); });
Etape 4 : Verifier
composer test -- --filter=MaCommandTest
composer lint
8. Ajouter un middleware ou service
Middleware
Etape 1 : Creer src/Middleware/MonMiddleware.php :
<?php declare(strict_types=1); namespace Laravel\Boost\Middleware; use Closure; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Response; class MonMiddleware { public function handle(Request $request, Closure $next): Response { /** @var Response $response */ $response = $next($request); // Modifier la reponse apres traitement... return $response; } }
Etape 2 : Enregistrer dans BoostServiceProvider::boot() :
// Dans une methode dediee ou directement dans boot() $this->app->booted(function () use ($router): void { $router->pushMiddlewareToGroup('web', MonMiddleware::class); });
Service
Etape 1 : Creer src/Services/MonService.php :
<?php declare(strict_types=1); namespace Laravel\Boost\Services; class MonService { public function maMethode(): string { // Logique... } }
Etape 2 : Enregistrer dans BoostServiceProvider::register() :
$this->app->singleton(MonService::class, fn (): MonService => new MonService);
Le service est ensuite injectable dans les constructeurs des outils MCP, commandes, etc.
Rappels importants
Conventions de code obligatoires
declare(strict_types=1)dans tous les fichiers PHP (test d'architecture)- Pas de
dd(),dump(),var_dump(),die(),ray()(test d'architecture) - Pas d'appels directs a
env()sauf dansBoostServiceProvider(test d'architecture) - Style Laravel Pint avec comparaisons strictes (
===) - PHPStan niveau 5
Commandes de verification
composer check # Lint complet + tests composer test # Tests uniquement composer lint # Pint + PHPStan + Rector (avec corrections) composer test:lint # Verification sans modification composer test:types # PHPStan seul
Structure de test standard
composer test -- --filter=NomDuTest # Test specifique composer test -- tests/Unit # Suite de tests composer test -- tests/Feature/Mcp # Sous-repertoire
Pattern de filtrage MCP
Tous les primitives MCP (outils, prompts, ressources) supportent le filtrage via la configuration boost.mcp.{type}.exclude et boost.mcp.{type}.include. Ce filtrage est applique automatiquement par Boost::filterPrimitives().
Compiler et distribuer le package
Laravel Boost est un package Composer PHP standard. Il n'y a pas d'etape de "build" ou de compilation : le code source PHP est distribue tel quel.
Prerequis
php >= 8.2
composer
Installation des dependances de developpement
composer install
Cycle de validation avant distribution
# 1. Corriger le style de code + analyse statique + refactoring composer lint # 2. Lancer tous les tests (Unit, Feature, Arch) composer test # 3. OU tout en une commande composer check
Publier sur Packagist (depot public)
Etape 1 : Creer un depot Git et pousser le code :
git init git remote add origin https://github.com/votre-vendor/votre-package.git git add . git commit -m "Initial release" git push -u origin main
Etape 2 : Creer un tag de version :
git tag v1.0.0 git push origin v1.0.0
Etape 3 : Enregistrer le package sur packagist.org :
- Se connecter avec son compte GitHub.
- Se rendre sur la page de soumission : https://packagist.org/packages/submit.
- Saisir l'URL du dépôt (ex:
https://github.com/thumanics/laravel-boost.git). - Cliquer sur le bouton "Check" pour valider la structure.
- Si tout est correct, cliquer sur "Submit". Packagist détectera automatiquement les informations du
composer.json.
Etape 4 : Le package est installable par les utilisateurs :
composer require thumanics/laravel-boost --dev
Publier sur un depot Composer prive (Satis, Private Packagist, etc.)
Option A - Satis :
Ajouter le depot dans le satis.json :
{
"repositories": [
{ "type": "vcs", "url": "https://github.com/votre-vendor/votre-package.git" }
]
}
Option B - Depot VCS direct :
Les utilisateurs ajoutent dans leur composer.json :
{
"repositories": [
{ "type": "vcs", "url": "https://github.com/votre-vendor/votre-package.git" }
],
"require-dev": {
"votre-vendor/votre-package": "^1.0"
}
}
Option C - Depot local (path) pour le developpement :
{
"repositories": [
{ "type": "path", "url": "../chemin-vers-le-package" }
],
"require-dev": {
"votre-vendor/votre-package": "*"
}
}
Structure minimale requise pour la distribution
Les fichiers essentiels a inclure dans le package :
composer.json # Identite, dependances, autoload, scripts
config/boost.php # Configuration publiable
src/ # Code source PHP
.ai/ # Templates de guidelines Blade
LICENSE.md # Licence
Les fichiers a exclure de la distribution (via .gitattributes) :
/tests export-ignore /.github export-ignore /art export-ignore phpunit.xml.dist export-ignore phpstan.neon.dist export-ignore pint.json export-ignore rector.php export-ignore CHANGELOG.md export-ignore UPGRADE.md export-ignore
Auto-decouverte Laravel
Le package est auto-decouvert grace a la section extra.laravel dans composer.json :
"extra": { "laravel": { "providers": [ "Laravel\\Boost\\BoostServiceProvider" ] } }
Aucune action manuelle n'est necessaire pour l'utilisateur apres composer require.
Renommer le package
Pour forker ou renommer laravel/boost en un autre nom (ex: acme/ai-tools), voici la liste exhaustive de tous les points d'ancrage a modifier.
Etape 1 : Identite Composer (composer.json)
- "name": "laravel/boost", + "name": "acme/ai-tools", - "homepage": "https://github.com/laravel/boost", + "homepage": "https://github.com/acme/ai-tools", - "Laravel\\Boost\\": "src/" + "Acme\\AiTools\\": "src/" - "Laravel\\Boost\\BoostServiceProvider" + "Acme\\AiTools\\AiToolsServiceProvider"
Etape 2 : Namespace PHP (tous les fichiers dans src/ et tests/)
Renommer le namespace racine dans tous les fichiers PHP :
| Ancien | Nouveau |
|---|---|
namespace Laravel\Boost; |
namespace Acme\AiTools; |
namespace Laravel\Boost\Mcp; |
namespace Acme\AiTools\Mcp; |
namespace Laravel\Boost\Mcp\Tools; |
namespace Acme\AiTools\Mcp\Tools; |
namespace Laravel\Boost\Install\Agents; |
namespace Acme\AiTools\Install\Agents; |
namespace Laravel\Boost\Console; |
namespace Acme\AiTools\Console; |
use Laravel\Boost\...; |
use Acme\AiTools\...; |
namespace Tests; |
(inchange, ou adapter si voulu) |
Commande pour renommer en masse :
# Rechercher toutes les occurrences grep -r "Laravel\\\\Boost" src/ tests/ composer.json --include="*.php" --include="*.json" -l # Remplacement (adapter selon l'OS) find src tests -name "*.php" -exec sed -i 's/Laravel\\Boost/Acme\\AiTools/g' {} +
Etape 3 : Noms de classes racine
| Fichier | Ancien | Nouveau |
|---|---|---|
src/BoostServiceProvider.php |
class BoostServiceProvider |
class AiToolsServiceProvider |
src/Boost.php |
class Boost extends Facade |
class AiTools extends Facade |
src/BoostManager.php |
class BoostManager |
class AiToolsManager |
src/Mcp/Boost.php |
class Boost extends Server |
class AiToolsServer extends Server |
Renommer egalement les fichiers PHP pour correspondre aux nouveaux noms de classes.
Etape 4 : Configuration (config/boost.php)
Renommer le fichier et la cle de configuration :
mv config/boost.php config/ai-tools.php
Puis mettre a jour le ServiceProvider :
- $this->mergeConfigFrom(__DIR__.'/../config/boost.php', 'boost'); + $this->mergeConfigFrom(__DIR__.'/../config/ai-tools.php', 'ai-tools'); - ], 'boost-config'); + ], 'ai-tools-config');
Etape 5 : References config('boost.*') dans le code source
Rechercher et remplacer toutes les references de configuration. Fichiers concernes :
| Pattern | Fichiers concernes |
|---|---|
config('boost.enabled') |
BoostServiceProvider.php |
config('boost.browser_logs_watcher') |
BoostServiceProvider.php |
config('boost.executable_paths.*') |
Agent.php, GuidelineAssist.php |
config('boost.agents.*') |
Toutes les classes Agent (7 fichiers) |
config('boost.mcp.*') |
Mcp/Boost.php, Mcp/ToolRegistry.php |
config('boost.hosted.*') |
Concerns/MakesHttpRequests.php, Tools/SearchDocs.php |
config('boost.github.*') |
Skills/Remote/GitHubSkillProvider.php |
config('boost.purpose') |
.ai/foundation.blade.php |
# Trouver toutes les occurrences grep -rn "config('boost\." src/ .ai/ --include="*.php" --include="*.blade.php"
Etape 6 : Variables d'environnement
| Ancien | Nouveau |
|---|---|
BOOST_ENABLED |
AI_TOOLS_ENABLED |
BOOST_BROWSER_LOGS_WATCHER |
AI_TOOLS_BROWSER_LOGS_WATCHER |
BOOST_PHP_EXECUTABLE_PATH |
AI_TOOLS_PHP_EXECUTABLE_PATH |
BOOST_COMPOSER_EXECUTABLE_PATH |
AI_TOOLS_COMPOSER_EXECUTABLE_PATH |
BOOST_NPM_EXECUTABLE_PATH |
AI_TOOLS_NPM_EXECUTABLE_PATH |
BOOST_VENDOR_BIN_EXECUTABLE_PATH |
AI_TOOLS_VENDOR_BIN_EXECUTABLE_PATH |
Etape 7 : Commandes Artisan (src/Console/)
| Fichier | Ancien | Nouveau |
|---|---|---|
StartCommand.php |
boost:mcp |
ai-tools:mcp |
InstallCommand.php |
boost:install |
ai-tools:install |
UpdateCommand.php |
boost:update |
ai-tools:update |
ExecuteToolCommand.php |
boost:execute-tool |
ai-tools:execute-tool |
AddSkillCommand.php |
boost:add-skill |
ai-tools:add-skill |
Etape 8 : Nom du serveur MCP
# src/BoostServiceProvider.php (ou nouveau nom) - Mcp::local('laravel-boost', Boost::class); + Mcp::local('acme-ai-tools', AiToolsServer::class); # src/Console/StartCommand.php - Artisan::call('mcp:start laravel-boost'); + Artisan::call('mcp:start acme-ai-tools'); # src/Mcp/Boost.php (ou nouveau nom) - protected string $name = 'Laravel Boost'; + protected string $name = 'Acme AI Tools';
Etape 9 : Route et nom de route
# src/BoostServiceProvider.php - Route::post('/_boost/browser-logs', ...)->name('boost.browser-logs'); + Route::post('/_ai-tools/browser-logs', ...)->name('ai-tools.browser-logs'); # src/Services/BrowserLogger.php - route('boost.browser-logs') + route('ai-tools.browser-logs') - '/_boost/browser-logs' + '/_ai-tools/browser-logs'
Etape 10 : Directive Blade
# src/BoostServiceProvider.php - $bladeCompiler->directive('boostJs', ...); + $bladeCompiler->directive('aiToolsJs', ...);
Les utilisateurs devront remplacer
@boostJspar@aiToolsJsdans leurs vues.
Etape 11 : Cle de cache
# src/BoostServiceProvider.php - $cacheKey = 'boost.roster.scan'; + $cacheKey = 'ai-tools.roster.scan';
Etape 12 : Canal de log
# src/BoostServiceProvider.php - 'logging.channels.browser' => [...] + 'logging.channels.browser' => [...] // Peut rester 'browser' car non lie au nom du package
Etape 13 : Tests d'architecture (tests/ArchTest.php)
- ->expect('Laravel\Boost') + ->expect('Acme\AiTools') - ->toBeUsedIn('Laravel\Boost') + ->toBeUsedIn('Acme\AiTools')
Etape 14 : Documentation
Mettre a jour les references dans :
README.md: logos, badges, texteCHANGELOG.md: URLs GitHubUPGRADE.md: noms de commandesCLAUDE.md: noms de classes et cheminsCONTRIBUTING_GUIDE.md: ce fichier
Checklist de verification apres renommage
# 1. Verifier qu'aucune reference a l'ancien nom ne subsiste grep -rn "laravel/boost" . --include="*.php" --include="*.json" --include="*.md" grep -rn "Laravel\\\\Boost" . --include="*.php" --include="*.json" grep -rn "'boost\." src/ --include="*.php" grep -rn "boost:" src/Console/ --include="*.php" # 2. Regenerer l'autoload composer dump-autoload # 3. Lancer les tests composer check
License
Laravel Boost is open-sourced software licensed under the MIT license.