> ## Documentation Index
> Fetch the complete documentation index at: https://kawax.biz/llms.txt
> Use this file to discover all available pages before exploring further.

# Laravel Chisel — libreria di script post-installazione per starter kit

> Presentazione di laravel/chisel, un pacchetto che fornisce le primitive per gli script post-installazione utilizzati per rimuovere funzionalità non necessarie dagli starter kit. Pubblicato come v0.1 nel maggio 2026.

<Info>
  Questo articolo si basa su un'analisi del codice sorgente. Si tratta di un pacchetto in una fase iniziale di sviluppo che ha appena ricevuto il tag v0.1 (dato di maggio 2026).
</Info>

## Cos'è Laravel Chisel

[Laravel Chisel](https://github.com/laravel/chisel) è un pacchetto che fornisce le primitive per costruire **script post-installazione** che rimuovono le funzionalità non necessarie dagli starter kit di Laravel.

Gli starter kit includono di default molte funzionalità, ma a seconda del progetto alcune possono essere superflue. Chisel risolve questo problema offrendo un meccanismo che, in modo interattivo dopo l'installazione, "mantiene solo le funzionalità necessarie".

```mermaid theme={null}
graph TD
    A["Creazione del progetto con laravel new"] --> B["Installazione dello starter kit"]
    B --> C["Esecuzione dello script chisel.php"]
    C --> D{"Domande all'utente<br>(multiselect)"}
    D --> E["In base alle scelte<br>cancella o modifica i file non necessari"]
    E --> F["Configurazione finale del progetto"]
```

## Perché serve

Gli starter kit di Laravel raccolgono molte funzionalità, ma non tutte servono in ogni progetto. Ad esempio:

* Progetti che non hanno bisogno della verifica via email
* Progetti che non usano l'autenticazione con passkey
* Configurazioni che non richiedono determinati componenti Livewire

Finora bisognava rimuovere manualmente le funzionalità superflue, ma con Chisel **la personalizzazione si conclude tramite prompt interattivi al momento dell'installazione**.

## Definizione dello script chisel.php

Uno starter kit che usa Chisel posiziona il file `chisel.php` nella radice del progetto. Questo file definisce "quali funzionalità sono opzionali".

```php theme={null}
<?php

require getenv('LARAVEL_INSTALLER_AUTOLOADER');

use Laravel\Chisel\Chisel;
use Laravel\Chisel\Question;

return Chisel::script(dirname(__DIR__))
    ->questions([
        Question::multiselect(
            name: 'auth_features',
            label: 'Which authentication features would you like to enable?',
            options: [
                'email-verification' => 'Email verification',
            ],
            hint: 'Use space to select, enter to confirm.',
        ),
    ])
    ->selected('auth_features', 'email-verification',
        then: function (Chisel $c) {
            // Se selezionato: rimuovi i marker di sezione e mantieni il codice
            $c->files(
                'resources/js/pages/settings/profile.tsx',
                'app/Providers/FortifyServiceProvider.php',
            )->removeSectionMarkers('email-verification');
        },
        else: function (Chisel $c) {
            // Se non selezionato: cancella file e funzionalità correlate
            $c->php('app/Models/User.php')
                ->removeImport('Illuminate\Contracts\Auth\MustVerifyEmail')
                ->removeInterface('MustVerifyEmail');

            $c->file('config/fortify.php')->removeLinesContaining('Features::emailVerification()');

            $c->files(
                'app/Providers/FortifyServiceProvider.php',
                'resources/js/pages/settings/profile.tsx',
            )->removeSection('email-verification');

            $c->files(
                'resources/js/components/email-verification-notice.tsx',
                'resources/js/pages/auth/verify-email.tsx',
                'tests/Feature/Auth/EmailVerificationTest.php',
                'tests/Feature/Auth/VerificationNotificationTest.php',
            )->delete();
        },
    );
```

## Metodi di definizione dello script

| Metodo                                     | Descrizione                                           |
| ------------------------------------------ | ----------------------------------------------------- |
| `Chisel::script($directory)`               | Crea la definizione dello script                      |
| `Question::multiselect(...)`               | Definisce una domanda a scelta multipla               |
| `questions([...])`                         | Imposta le domande dello script                       |
| `questions()`                              | Recupera le domande registrate                        |
| `collectAnswers()`                         | Avvia la raccolta delle risposte alle domande         |
| `apply($callback)`                         | Registra uno step di mutazione incondizionato         |
| `selected($key, $value, then:, else:)`     | Diramazione con un singolo valore selezionato         |
| `selectedAny($key, $values, then:, else:)` | Diramazione se è selezionato uno qualsiasi dei valori |
| `selectedAll($key, $values, then:, else:)` | Diramazione se sono selezionati tutti i valori        |
| `chisel($answers)`                         | Esegue le mutazioni registrate                        |

## Raccolta interattiva delle risposte

`collectAnswers()` restituisce un raccoglitore di risposte. Tutti i metodi sono fluent e possono essere chiamati in qualsiasi ordine. In ambienti non interattivi vengono usati automaticamente i valori predefiniti.

Un comando Artisan esterno mostra i prompt usando [Laravel Prompts](https://laravel.com/docs/prompts) e passa le risposte a Chisel.

```php theme={null}
use Illuminate\Console\Command;
use Laravel\Chisel\Chisel;
use Laravel\Chisel\Question;
use RuntimeException;

use function Laravel\Prompts\multiselect;

class InstallFeatures extends Command
{
    protected $signature = 'install:features
        {--answers= : JSON string of answers to skip interactive prompts}';

    public function handle(): void
    {
        $script = require base_path('chisel.php');

        $providedAnswers = $this->option('answers') === null
            ? []
            : json_decode((string) $this->option('answers'), true, 512, JSON_THROW_ON_ERROR);

        $answers = $script
            ->collectAnswers()
            ->onQuestion(fn (Question $question) => match ($question->type) {
                'multiselect' => multiselect(
                    label: $question->label,
                    options: $question->options,
                    default: $question->default ?? [],
                    required: $question->required,
                    hint: $question->hint,
                ),
                default => throw new RuntimeException("Unsupported question type [{$question->type}]."),
            })
            ->interactive($this->input->isInteractive())
            ->withAnswers($providedAnswers);

        $script->chisel($answers);

        $chisel = Chisel::in(base_path());

        $chisel->npm()->install();
        $chisel->npm()->run('build');
    }
}
```

| Metodo                      | Descrizione                                         |
| --------------------------- | --------------------------------------------------- |
| `onQuestion($callback)`     | Imposta l'handler per il prompt della domanda       |
| `interactive($interactive)` | Imposta la modalità interattiva                     |
| `withAnswers($answers)`     | Fornisce risposte già raccolte per saltare i prompt |

## Mutazione dei file

Con `file($path)` si opera su un singolo file, con `files(...$paths)` su più file.

| Metodo                            | Descrizione                                                |
| --------------------------------- | ---------------------------------------------------------- |
| `replace($search, $replace)`      | Sostituisce una stringa                                    |
| `removeLinesContaining($content)` | Rimuove le righe contenenti la stringa indicata            |
| `removeSectionMarkers($tag)`      | Rimuove i marker di sezione mantenendo il contenuto        |
| `removeSection($tag)`             | Rimuove i marker di sezione e il contenuto al loro interno |
| `delete()`                        | Cancella il file di destinazione                           |

## Editing basato su AST PHP

`php($path)` fornisce editing tramite l'AST di PHP. Le modifiche vengono salvate automaticamente quando l'oggetto viene distrutto.

Per le basi dell'AST di PHP (Abstract Syntax Tree) e l'uso di `nikic/php-parser`, consulta [questa pagina](/it/advanced/php-ast).

| Metodo                        | Descrizione                            |
| ----------------------------- | -------------------------------------- |
| `removeImport($class)`        | Elimina un'istruzione `use`            |
| `removeTrait($trait)`         | Rimuove l'uso di un trait dalla classe |
| `removeInterface($interface)` | Rimuove un'interfaccia implementata    |

## Section Markers

Racchiude codice opzionale tra coppie di commenti.

```php theme={null}
/* @chisel-passkeys */
Fortify::authenticateUsingPasskeys();
/* @end-chisel-passkeys */
```

Nei file JSX si usano i commenti a blocco tra parentesi graffe (`{}`).

```tsx theme={null}
{
    /* @chisel-passkeys */
}
<PasskeyButton />;
{
    /* @end-chisel-passkeys */
}
```

* `removeSectionMarkers('passkeys')` — rimuove i marker e lascia il codice
* `removeSection('passkeys')` — cancella sia i marker sia il codice

Il prefisso `chisel-` viene aggiunto automaticamente.

```mermaid theme={null}
graph LR
    A["/* @chisel-feature */<br>codice<br>/* @end-chisel-feature */"] --> B{"L'utente<br>ha scelto feature?"}
    B -->|removeSectionMarkers| C["mantiene solo il codice<br>(rimuove i marker)"]
    B -->|removeSection| D["cancella tutto,<br>marker e codice"]
```

## Supporto npm

| Metodo                               | Descrizione                                            |
| ------------------------------------ | ------------------------------------------------------ |
| `npm()->install()`                   | Installa le dipendenze con il package manager rilevato |
| `npm()->run($script, ...$arguments)` | Esegue uno script del package manager                  |
| `npm()->remove(...$packages)`        | Rimuove pacchetti con il package manager rilevato      |

Il metodo `npm()` rileva automaticamente npm, yarn, pnpm e bun.

## Stato attuale dello sviluppo

* **Repository GitHub**: [laravel/chisel](https://github.com/laravel/chisel)
* **Rilascio**: v0.1 (pubblicato a maggio 2026)
* **Sviluppo**: pubblicato dopo 3 mesi di sviluppo non pubblico

Chisel non è un pacchetto che gli utenti finali installano direttamente nelle app Laravel, ma **una libreria usata internamente dagli starter kit**. In futuro ci si aspetta che gli starter kit ufficiali di Laravel forniscano script post-installazione che sfruttano Chisel.

<Card title="Repository laravel/chisel" icon="github" href="https://github.com/laravel/chisel">
  Codice sorgente e riferimento API più recente.
</Card>

<Card title="Documentazione ufficiale degli starter kit Laravel" icon="book-open" href="https://laravel.com/docs/starter-kits">
  Per l'uso degli starter kit consulta la documentazione ufficiale.
</Card>


## Related topics

- [Installazione](/it/installation.md)
- [PHP AST](/it/advanced/php-ast.md)
- [Come creare uno starter kit per Laravel](/it/advanced/starter-kit-creation.md)
- [Introduzione a Svelte — le basi per usarlo con Inertia × Laravel](/it/blog/svelte-introduction.md)
- [Introduzione a React — le basi per usarlo con Inertia × Laravel](/it/blog/react-introduction.md)
