1. Go to this page and download the library: Download jordandalton/laravel-tackle library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
jordandalton / laravel-tackle example snippets
return [
// laravel/ai provider name — must match a key in config/ai.php
'provider' => env('AI_CODE_PROVIDER', 'anthropic'),
// Model to use
'model' => env('AI_CODE_MODEL', 'claude-sonnet-4-6'),
// Maximum agent steps per turn (tool calls + reasoning cycles)
'max_steps' => env('AI_CODE_MAX_STEPS', 40),
// Hard spend limit for the session in USD — aborts when exceeded
'budget_usd' => env('AI_CODE_BUDGET', 1.00),
// Shell execution policy — string or per-environment array.
// String form (backward-compatible): applies to all environments.
// Array form: keyed by environment name; production defaults to 'off'.
'shell' => [
'local' => env('AI_CODE_SHELL', 'approve'),
'staging' => env('AI_CODE_SHELL', 'approve'),
'production' => env('AI_CODE_SHELL', 'off'),
],
'shell_allowlist' => ['composer', 'npm', 'php artisan'],
// Artisan commands the agent may run without confirmation — per environment.
// Flat array form is still accepted for backward compatibility.
'artisan_allowlist' => [
'local' => ['make:*', 'migrate:*', 'db:seed', 'route:list', 'test'],
'staging' => ['migrate', 'route:list'],
'production' => ['route:list'],
],
// Artisan commands that
use Tackle\Attributes\Healable;
#[Healable(false)]
class ChargeSubscription implements ShouldQueue
{
public function handle(): void
{
// Tackle will skip this job entirely — even when AI_CODE_HEALING_ENABLED=true.
}
}
// app/Ai/Tools/ReadDatabase.php
namespace App\Ai\Tools;
use Illuminate\Contracts\JsonSchema\JsonSchema;
use Illuminate\Support\Facades\DB;
use Laravel\Ai\Tools\Request;
use Tackle\Tools\AbstractTool;
class ReadDatabase extends AbstractTool
{
public function description(): string
{
return 'Run a read-only SQL query and return results as JSON. SELECT only.';
}
public function schema(JsonSchema $schema): array
{
return [
'query' => $schema->string()
->description('The SELECT query to run.')
->
// app/Ai/MyCodingAgent.php
namespace App\Ai;
use App\Ai\Tools\ReadDatabase;
use Tackle\Agents\DefaultCodingAgent;
class MyCodingAgent extends DefaultCodingAgent
{
public function __construct(
private ReadDatabase $readDatabase,
...$args,
) {
parent::__construct(...$args);
}
public function tools(): iterable
{
return [...parent::tools(), $this->readDatabase];
}
}
// app/Providers/AppServiceProvider.php
use App\Ai\MyCodingAgent;
use Tackle\Contracts\CodingAgent;
public function register(): void
{
$this->app->bind(CodingAgent::class, MyCodingAgent::class);
}
$request->string('key', 'default'); // string value
$request->boolean('key', false); // boolean value
$request->integer('key', 0); // integer value
$request->get('key', 'default'); // raw value
$request->all(); // all arguments as array
// app/Ai/MyAgent.php
namespace App\Ai;
use Laravel\Ai\Promptable;
use Tackle\Contracts\CodingAgent;
class MyAgent implements CodingAgent
{
use Promptable;
public function instructions(): string
{
return 'You are a specialist in this project. Only touch the billing module.';
}
public function messages(): iterable
{
return [];
}
public function tools(): iterable
{
return [
// your tools here
];
}
}
bash
php artisan ai:code --worktree # force on for this session
php artisan ai:code --no-worktree # force off for this session
┌──────────────────────────────────────────────────────────────┐
│ Laravel Tackle · claude-sonnet-4-6 · $1.00 · approve │
└──────────────────────────────────────────────────────────────┘
┌ What should I work on? ─────────────────────────────────────┐
│ Add a slug field to the Post model │
└─────────────────────────────────────────────────────────────┘
🔍 searching for Post model
📖 reading app/Models/Post.php
📝 creating database/migrations/2024_01_01_add_slug_to_posts.php
✓ File saved
✏️ editing app/Models/Post.php
✓ File saved
🧪 running tests
✓ Done
Migration created, `$fillable` updated, and all tests pass.
╭─────────────────────────────────────────────────────────────╮
│ app/Models/Post.php | 2 +- │
│ 1 migration file | 15 +++++++++++++++ │
╰─────────────────────────────────────────────────────────────╯
┌ What should I work on? ─────────────────────────────────────┐
│ Make the slug auto-generate from the title on creation ▲ │
│ Add a slug field to the Post model ▼ │
└─────────────────────────────────────────────────────────────┘