Laravel Tackle: Ein KI-Coding-Agent direkt in der Artisan-Konsole
Laravel Tackle ist ein Open-Source-Paket, das einen KI-Coding-Agenten als Artisan-Befehle direkt in eine Laravel-Anwendung einbettet.
Es liest Routen, führt Datenbankabfragen aus, reviewt Pull Requests und kann fehlgeschlagene Queue-Jobs selbstständig reparieren, wobei alle Schutzmechanismen in PHP-Code statt in Prompts erzwungen werden.
Laravel Tackle von Jordan Dalton ist ein KI-Coding-Agent, der als Artisan-Befehle innerhalb einer Laravel-Anwendung läuft. Da er mit dem Framework bootet, kann er Routen auflisten, Telescope-Exceptions lesen, SELECT-Abfragen gegen die Datenbank ausführen und nach Änderungen Pint aufrufen. Die Sicherheitsschicht steckt im PHP-Code: Pfad-Beschränkungen, eine Artisan-Allowlist und ein Ausgabenlimit pro Session sind Konfigurationswerte, kein Prompt-Text, den ein Modell ignorieren könnte. Das Paket baut auf laravel/ai auf und nutzt standardmäßig Claude; über AI_CODE_PROVIDER lassen sich OpenAI, Gemini, Groq oder ein lokales Modell via Ollama anbinden.
Das Paket bringt mehrere Agenten mit. ai:code ist ein interaktives REPL mit Plan-Modus, Slash-Commands, Bild-Anhängen und persistenter History. ai:run führt eine einzelne Aufgabe mit Exit-Code aus, optional mit --output=json für Pipelines. ai:fix startet eine fokussierte Session aus einer eingefügten Exception, einem Sentry-Issue (--sentry=ID) oder einem GitHub-Issue (--issue=N). ai:review liest einen Diff oder Pull Request und postet Inline-Kommentare mit Schweregraden. ai:upgrade hebt ein Composer-Paket anhand dessen eigener Upgrade-Anleitung aus vendor/ auf eine neue Major-Version. Ein Self-Healer überwacht fehlgeschlagene Queue-Jobs und geplante Tasks, patcht den Code in einem isolierten Worktree und öffnet einen Pull Request. Tackle Remote ist ein Begleitpaket, das dieselbe Umgebung als mobile Browser-Oberfläche inklusive Freigabe-Dialogen bereitstellt.
Tackle benötigt PHP 8.3 und Laravel 12 oder 13. Installation per composer require jordandalton/laravel-tackle, danach die Configs von laravel/ai und Tackle publizieren. Die publizierte config/ai.php enthält bereits den Anthropic-Provider-Block, sodass ein ANTHROPIC_API_KEY in der .env genügt. Für Ollama sind AI_CODE_PROVIDER und AI_CODE_MODEL nötig, außerdem AI_CODE_PRICE_INPUT und AI_CODE_PRICE_OUTPUT auf 0, weil der eingebaute Preiskatalog keine Rate für lokale Modelle kennt. Da der Agent Dateien direkt im Arbeitsbaum ändert, solange der Worktree-Modus aus ist, sollte man vorher committen oder stashen.
Das ai:code-REPL unterstützt einen Plan-Modus per --plan: Ein read-only Planungs-Agent untersucht die Codebasis und streamt einen nummerierten Plan zu Dateien, Änderungen und Risiken, bevor etwas geschrieben wird; danach wählt man Execute, Revise oder Cancel. /plan leistet dasselbe pro Aufgabe innerhalb einer Session. Shell-Zugriff hat vier Modi: --off verweigert alles und lässt nur Lesewerkzeuge aktiv, --approve bestätigt jeden Befehl einzeln (Standard), --allowlist erlaubt nur Einträge aus shell_allowlist, --yolo fragt nie. Transkripte landen in storage/ai-code/ und werden beim nächsten Lauf fortgesetzt; --session=name trennt Histories. Ab 60.000 Zeichen fasst Tackle ältere Abschnitte automatisch zusammen und behält die letzten vier Nachrichten wörtlich; /compact erzwingt das, /clear verwirft die History.
Alle Schutzregeln in config/tackle.php werden in PHP geprüft, bevor ein Werkzeug läuft. Standardwerte: budget_usd 1,00 (harter Stopp, Warnung bei 80 Prozent), Shell-Modus je Umgebung (Production standardmäßig off), eine artisan_allowlist je Umgebung, Worktree-Modus in Production standardmäßig an, sowie protected_paths für .env, storage/*, vendor/* und .git/*, die Lese- und Schreibzugriff blockieren, damit der Agent keine Secrets zitieren kann. Destruktive Befehle wie migrate:fresh und db:wipe erfordern eine Terminal-Bestätigung. Im Worktree-Modus landen Änderungen in einem temporären Git-Worktree, die Diff-Statistik pro Runde ist entsprechend gekennzeichnet, und tackle:prune räumt Reste abgebrochener Läufe auf.
Jeder Agent lädt beim Session-Start eine TACKLE.md aus dem Projektroot. php artisan tackle:init scannt composer.json, das Test-Framework und die app/-Struktur und schreibt ein Gerüst mit den Abschnitten Conventions, Boundaries und Gotchas. Ohne TACKLE.md greift Tackle auf AGENTS.md und dann CLAUDE.md zurück. Der Inhalt ist auf 20.000 Zeichen begrenzt, und die Sicherheitsschicht gilt unabhängig vom Dateiinhalt.
ai:review nutzt einen read-only Agenten mit ReadFile, Glob und SearchCode über einen Diff und liest die vollständige Datei um jede geänderte Funktion. Aufruf: php artisan ai:review für staged und unstaged Änderungen, --against=main für PR-artige Reviews, --pr=118 --comment für Inline-Kommentare auf GitHub. Die Ergebnisse kommen nach Datei gruppiert in drei Schweregraden mit dem Urteil LGTM, LGTM with minor notes oder Needs changes; --fail-on=critical macht daraus einen Exit-Code für CI. Jedes gepostete Review enthält eine unsichtbare Markierung mit dem abgedeckten Head-Commit, sodass Folgeläufe nur neue Pushes prüfen und bei unverändertem Stand mit "Nothing new to review" enden; ein Force-Push fällt auf ein Voll-Review zurück, --full erzwingt eines. php artisan tackle:install review generiert einen GitHub-Actions-Workflow mit JordanDalton/tackle-review@v1. Ein /tackle-Kommentar auf einen Befund löst ai:respond aus: Der Coding-Agent führt die Anweisung aus, pusht den Commit auf den PR-Branch und antwortet mit SHA und Diff-Statistik. Fork-PRs werden abgelehnt, nicht passende Checkouts brechen ab, und reine Fragen werden ohne Änderungen beantwortet.
Self-Healing ist standardmäßig aus. Mit AI_CODE_HEALING_ENABLED=true, der publizierten Migration und einem Worker auf der healer-Queue lauscht Tackle auf JobFailed- und ScheduledTaskFailed-Events. Ein Healing-Agent läuft dann gegen einen frischen Worktree auf einem tackle/heal-{id}-Branch mit Exception-Klasse, Meldung, Stack-Trace und, falls installiert, dem vollständigen Telescope-Eintrag. Er wendet einen minimalen Fix an, führt die Test-Suite aus und öffnet entweder einen Pull Request mit seiner Begründung oder mergt im Patch-Modus in den Arbeitsbranch und dispatchet den ursprünglichen Job erneut. Das Attribut #[Healable(false)] nimmt Jobs aus, und AI_CODE_HEALING_THRESHOLD=3 wartet drei Fehlschläge ab. Jeder Versuch landet in der Tabelle tackle_healing_log, abrufbar per php artisan tackle:healing-log mit --type- und --outcome-Filtern. Scheitern die Tests im Patch-Modus, wird stattdessen ein PR geöffnet, und Healer-Jobs laufen mit $tries = 1.
tackle:mcp stellt die Laravel-Werkzeuge über MCP auf stdio bereit, sodass Claude Code, Cursor oder Zed ListRoutes, QueryDatabase, ReadTelescopeEntry und RunLarastan gegen die App aufrufen können. Der freigegebene Satz kommt aus config('tackle.mcp.tools') und umfasst standardmäßig nur Lese- und Analysewerkzeuge. Pfad-Guards, Artisan-Allowlist und die SELECT-only-Beschränkung gelten weiter; AskUser und ConfirmAction werden abgelehnt, weil MCP-Clients kein Terminal haben.
Zwei Einschränkungen: Der Agent hat keinen Internetzugang und arbeitet nur mit Dateien im Workspace. Das Ausgabenlimit wird aus Token-Zahlen gegen einen eingebauten Preiskatalog geschätzt, sodass die tatsächliche Abrechnung leicht abweicht. Tackle ist MIT-lizenziert, aktuell bei v1.27.3 auf GitHub, mit Dokumentation unter tackle.jordandalton.com.
Leserforum
Noch keine Beiträge — eröffne die Debatte.
Starte die Diskussion
Kein Konto, kein Passwort nötig — gib einfach deine E-Mail-Adresse ein, wir senden dir einen einmaligen Anmelde-Link. Beim ersten Mal bist du damit automatisch angemeldet.
Deine Bewertung wird nach der Anmeldung automatisch übernommen.
Schau in dein Postfach
Wir haben einen Anmelde-Link an … gesendet. Öffne ihn auf diesem Gerät — dieser Tab meldet dich automatisch an.
Nichts angekommen? Wirf einen Blick in den Spam-Ordner — und markiere die Mail dort als „Kein Spam“, dann landet sie künftig direkt im Postfach.