Laravel Tackle, écrit par Jordan Dalton, est un agent de codage IA qui s'exécute sous forme de commandes Artisan au sein d'une application Laravel. Comme il démarre avec le framework, il peut lister les routes, lire les exceptions Telescope, exécuter des requêtes SELECT sur la base de données et appeler Pint après ses modifications. La couche de sécurité réside dans le code PHP : restrictions de chemins, allowlist Artisan et limite de dépense par session sont des valeurs de configuration, pas des consignes de prompt qu'un modèle pourrait ignorer. Le package s'appuie sur laravel/ai et utilise Claude par défaut, mais AI_CODE_PROVIDER permet de passer à OpenAI, Gemini, Groq ou un modèle local via Ollama.

Le package livre plusieurs agents. ai:code est un REPL interactif avec mode plan, commandes slash, pièces jointes image et historique persistant. ai:run exécute une tâche unique avec un code de sortie, et --output=json pour les pipelines. ai:fix lance une session ciblée depuis une exception collée, un ticket Sentry (--sentry=ID) ou un ticket GitHub (--issue=N). ai:review lit un diff ou une pull request et poste des commentaires inline avec niveaux de sévérité. ai:upgrade fait passer un package Composer à une version majeure en suivant son propre guide d'upgrade dans vendor/. Un self-healer surveille les jobs de queue et tâches planifiées en échec, corrige le code dans un worktree isolé et ouvre une pull request. Tackle Remote est un package compagnon qui expose le même environnement via une interface web mobile avec demandes d'approbation.

Tackle exige PHP 8.3 et Laravel 12 ou 13. Installation via composer require jordandalton/laravel-tackle, puis publication des configurations de laravel/ai et de Tackle. La config/ai.php publiée contient déjà le bloc du provider Anthropic, donc une clé ANTHROPIC_API_KEY dans le .env suffit. Pour Ollama, il faut AI_CODE_PROVIDER et AI_CODE_MODEL, plus AI_CODE_PRICE_INPUT et AI_CODE_PRICE_OUTPUT à 0, car le catalogue de prix intégré ne connaît pas de tarif pour les modèles locaux. L'agent modifie les fichiers sur place tant que le mode worktree est désactivé, il est donc conseillé de commiter ou stasher son travail avant la première session.

Le REPL ai:code propose un mode plan via --plan : un agent de planification en lecture seule examine le code et diffuse un plan numéroté couvrant fichiers, modifications et risques avant toute écriture ; on choisit ensuite Execute, Revise ou Cancel. /plan fait de même par tâche dans une session. L'accès shell a quatre modes : --off refuse tout en gardant les outils de lecture disponibles, --approve confirme chaque commande (défaut), --allowlist n'autorise que les entrées de shell_allowlist, --yolo ne demande rien. Les transcriptions sont enregistrées dans storage/ai-code/ et reprises au lancement suivant ; --session=nom sépare les historiques. Au-delà de 60 000 caractères, Tackle résume automatiquement les échanges anciens et conserve les quatre derniers messages tels quels ; /compact force l'opération, /clear efface l'historique.

Toutes les règles de config/tackle.php sont vérifiées en PHP avant l'exécution d'un outil. Valeurs par défaut : budget_usd à 1,00 (arrêt strict, avertissement à 80 pour cent), mode shell par environnement (off en production), une artisan_allowlist par environnement, le mode worktree activé par défaut en production, et des protected_paths couvrant .env, storage/*, vendor/* et .git/*, qui bloquent lecture comme écriture afin que l'agent ne puisse pas citer vos secrets. Les commandes destructrices comme migrate:fresh et db:wipe exigent une confirmation au terminal. En mode worktree, les modifications aboutissent dans un worktree git temporaire, la statistique de diff par tour est libellée en conséquence, et tackle:prune nettoie les restes des exécutions interrompues.

Chaque agent charge un TACKLE.md à la racine du projet au démarrage de la session. php artisan tackle:init analyse composer.json, le framework de tests et la structure de app/ pour générer un canevas avec les rubriques Conventions, Boundaries et Gotchas. Sans TACKLE.md, Tackle se rabat sur AGENTS.md puis CLAUDE.md. Le contenu est plafonné à 20 000 caractères, et la couche de sécurité s'applique quel que soit le contenu du fichier.

ai:review fait tourner un agent en lecture seule doté de ReadFile, Glob et SearchCode sur un diff, en lisant le fichier complet autour de chaque fonction modifiée. Usage : php artisan ai:review pour les changements stagés et non stagés, --against=main pour une relecture façon PR, --pr=118 --comment pour poster des commentaires inline sur GitHub. Les résultats sont groupés par fichier en trois niveaux de sévérité avec un verdict LGTM, LGTM with minor notes ou Needs changes ; --fail-on=critical transforme ce verdict en code de sortie pour la CI. Chaque revue postée embarque un marqueur invisible enregistrant le commit de tête couvert, donc les passages suivants ne relisent que les nouveaux pushes et s'arrêtent avec « Nothing new to review » si rien n'a bougé ; un force-push retombe sur une revue complète, et --full en impose une. php artisan tackle:install review génère un workflow GitHub Actions basé sur JordanDalton/tackle-review@v1. Répondre à un constat avec un commentaire /tackle déclenche ai:respond : l'agent de codage exécute l'instruction, pousse le commit sur la branche de la PR et répond avec le SHA et la statistique de diff. Les PR de forks sont refusées, un checkout non conforme interrompt le processus, et les simples questions sont traitées sans modification.

L'auto-réparation est désactivée par défaut. Avec AI_CODE_HEALING_ENABLED=true, la migration publiée et un worker sur la queue healer, Tackle écoute les événements JobFailed et ScheduledTaskFailed. Un agent de réparation travaille alors sur un worktree neuf dans une branche tackle/heal-{id} avec la classe d'exception, le message, la stack trace et, si Telescope est installé, l'entrée complète. Il applique un correctif minimal, lance la suite de tests, puis ouvre une pull request avec son raisonnement ou, en mode patch, fusionne dans la branche de travail et redispatche le job d'origine. L'attribut #[Healable(false)] exclut des jobs, et AI_CODE_HEALING_THRESHOLD=3 attend trois échecs avant d'agir. Chaque tentative est consignée dans la table tackle_healing_log, consultable via php artisan tackle:healing-log avec les filtres --type et --outcome. Si les tests échouent en mode patch, un PR est ouvert à la place, et les jobs du healer tournent avec $tries = 1.

tackle:mcp sert les outils Laravel via MCP sur stdio, ce qui permet à Claude Code, Cursor ou Zed d'appeler ListRoutes, QueryDatabase, ReadTelescopeEntry et RunLarastan contre l'application. L'ensemble exposé provient de config('tackle.mcp.tools') et se limite par défaut aux outils de lecture et d'analyse. Les gardes de chemins, l'allowlist Artisan et la restriction SELECT-only restent en vigueur ; AskUser et ConfirmAction sont refusés car les clients MCP n'ont pas de terminal.

Deux limites à connaître : l'agent n'a pas d'accès Internet et ne travaille que sur les fichiers du workspace, et la limite de dépense est estimée à partir des tokens confrontés à un catalogue de prix intégré, donc la facturation réelle diffère légèrement. Tackle est sous licence MIT, actuellement en v1.27.3 sur GitHub, avec la documentation sur tackle.jordandalton.com.