---
title: 'Artisan commands'
description: 'Every larecipe:* artisan command, grouped by job, with its usage and options read from the running app.'
url: 'https://larecipe.saleem.dev/3.x/reference/commands'
version: 3.x
locale: en
last_updated: '2026-10-18'
---

> Docs index: https://larecipe.saleem.dev/3.x/llms.txt · MCP: https://larecipe.saleem.dev/mcp · Skill: https://larecipe.saleem.dev/skill.md

# Artisan commands

Every `larecipe:*` command, grouped by job. Each usage block and option table is read from the running app by an [`<Artisan>` live reference](https://larecipe.saleem.dev/3.x/writing/live-references.md), so it matches `php artisan help`.

Commands that take a docs version use `--docs-version`: Symfony reserves `--version` for the application.

## Set up and write

### larecipe:install

Sets up a doc set with a first page, and the `AGENTS.md` instructions, skills, MCP config and hooks for the agents it finds. `--dry-run` previews every step, and every prompt has a flag. See [installation](https://larecipe.saleem.dev/3.x/get-started/installation.md).

**Command** `larecipe:install`: Install LaRecipe: your docs, and the agent setup that keeps them current

```bash
php artisan larecipe:install [--driver [DRIVER]] [--path [PATH]] [--agents [AGENTS]] [--no-hooks] [--git-hook [GIT-HOOK]] [--ci [CI]] [--review [REVIEW]] [--claude-md] [--no-index] [--composer-script] [--onboard [ONBOARD]] [--onboard-agent [ONBOARD-AGENT]] [--dry-run]
```

Options:

| Option | Description | Default |
| --- | --- | --- |
| `--driver=DRIVER` | repository (recommended) or database |  |
| `--path=PATH` | The docs folder of a repository set | docs |
| `--agents=AGENTS` | Agents to set up, comma-separated (claude,codex,cursor,gemini,copilot), or "none" (default: the ones detected) |  |
| `--no-hooks` | Skip the pre-push and SessionStart agent hooks |  |
| `--git-hook=GIT-HOOK` | Also install the git pre-push hook: warn or strict |  |
| `--ci=CI` | Add the optional no-AI CI check: fail or comment |  |
| `--review=REVIEW` | required (default) or auto |  |
| `--claude-md` | Add @AGENTS.md to CLAUDE.md without asking |  |
| `--no-index` | Leave the docs index out of AGENTS.md |  |
| `--composer-script` | Add larecipe:agents to composer post-update-cmd without asking |  |
| `--onboard=ONBOARD` | Then write starter docs for these audiences: product,api,package,internal |  |
| `--onboard-agent=ONBOARD-AGENT` | The agent to run onboarding with |  |
| `--dry-run` | Show what would change without writing anything |  |

### larecipe:onboard

Writes starter docs with your own coding agent and the `larecipe-write-docs` skill. It shows the agent command and asks before it runs. Nothing is committed. See [your first docs](https://larecipe.saleem.dev/3.x/get-started/your-first-docs.md).

**Command** `larecipe:onboard`: Generate starter docs from your app with your local coding agent

```bash
php artisan larecipe:onboard [--audience [AUDIENCE]] [--set [SET]] [--agent [AGENT]] [--print] [--yes]
```

Options:

| Option | Description | Default |
| --- | --- | --- |
| `--audience=AUDIENCE` | Who the docs are for: product, api, package, internal (comma-separated) |  |
| `--set=SET` | The doc set to write into (default: the default set) |  |
| `--agent=AGENT` | claude, codex, cursor, gemini or copilot (default: the one detected) |  |
| `--print` | Only print the command, do not run it |  |
| `--yes` | Run without asking |  |

### larecipe:upgrade

Moves a LaRecipe 2 app to LaRecipe 3: config, navigation and content. Without `--apply` it only writes the report. See [upgrade from v2](https://larecipe.saleem.dev/3.x/upgrade.md).

**Command** `larecipe:upgrade`: Upgrade LaRecipe 2 docs, config and navigation to LaRecipe 3

```bash
php artisan larecipe:upgrade [--apply] [--move-to [MOVE-TO]] [--relative-links]
```

Options:

| Option | Description | Default |
| --- | --- | --- |
| `--apply` | Write the changes (without it, only the report is written) |  |
| `--move-to=MOVE-TO` | Move the docs into this folder, for example docs |  |
| `--relative-links` | Also turn /docs/VERSION/page links into relative .md links |  |

### larecipe:make:page

Creates a page with `title`, `description` and `sources` in its frontmatter. Repository sets only. It does not edit `navigation.json`; it tells you when the version has one.

**Command** `larecipe:make:page`: Create a docs page with title, description and sources

```bash
php artisan larecipe:make:page [--title [TITLE]] [--description [DESCRIPTION]] [--source [SOURCE]] [--set [SET]] [--docs-version [DOCS-VERSION]] [--locale [LOCALE]] [--dry-run] [--] <path>
```

Arguments:

| Argument | Description | Default |
| --- | --- | --- |
| `path` | The page path, for example billing/refunds (required) |  |

Options:

| Option | Description | Default |
| --- | --- | --- |
| `--title=TITLE` | The page title (default: from the path) |  |
| `--description=DESCRIPTION` | One sentence about the page |  |
| `--source=SOURCE` | Code the page documents, for example app/Billing/** (repeatable) |  |
| `--set=SET` | The doc set (default: the default set) |  |
| `--docs-version=DOCS-VERSION` | The version (default: the default version) |  |
| `--locale=LOCALE` | The locale (default: the default locale) |  |
| `--dry-run` | Show what would change without writing anything |  |

### larecipe:make:version

Adds a version to a repository set by copying an existing one. On a set without versions, `--current-as` names the version its current pages belong to. See [versions](https://larecipe.saleem.dev/3.x/writing/versions.md).

**Command** `larecipe:make:version`: Add a docs version by copying an existing one

```bash
php artisan larecipe:make:version [--from [FROM]] [--default] [--current-as [CURRENT-AS]] [--set [SET]] [--dry-run] [--] <version>
```

Arguments:

| Argument | Description | Default |
| --- | --- | --- |
| `version` | The new version id, for example 3.x (required) |  |

Options:

| Option | Description | Default |
| --- | --- | --- |
| `--from=FROM` | Copy the pages of this version (default: the default version) |  |
| `--default` | Make the new version the default |  |
| `--current-as=CURRENT-AS` | For a set without versions yet, the version its current pages belong to |  |
| `--set=SET` | The doc set (default: the default set) |  |
| `--dry-run` | Show what would change without writing anything |  |

### larecipe:navigation:freeze

Writes the navigation LaRecipe derives from folders and frontmatter to `navigation.json`, so you can edit it by hand. Repository sets only.

**Command** `larecipe:navigation:freeze`: Write the derived navigation to navigation.json

```bash
php artisan larecipe:navigation:freeze [--set [SET]] [--docs-version [DOCS-VERSION]] [--locale [LOCALE]] [--dry-run]
```

Options:

| Option | Description | Default |
| --- | --- | --- |
| `--set=SET` | The doc set (default: the default set) |  |
| `--docs-version=DOCS-VERSION` | The version (default: the default version) |  |
| `--locale=LOCALE` | The locale (default: the default locale) |  |
| `--dry-run` | Show what would change without writing anything |  |

## Keep current

### larecipe:affected

Lists the pages whose `sources:` match the files a change touched, and which of them it left stale. The pre-push hook and the CI check run it. See [how it works](https://larecipe.saleem.dev/3.x/keeping-current/how-it-works.md) for ranges and formats.

**Command** `larecipe:affected`: List the docs pages a change affects and the ones it left stale

```bash
php artisan larecipe:affected [--base [BASE]] [--head [HEAD]] [--uncommitted] [--set [SET]] [--docs-version [DOCS-VERSION]] [--locale [LOCALE]] [--format [FORMAT]] [--fail-on-stale] [--no-drift]
```

Options:

| Option | Description | Default |
| --- | --- | --- |
| `--base=BASE` | Compare with this branch or commit (from where the branch left it) |  |
| `--head=HEAD` | The end of the range | HEAD |
| `--uncommitted` | Include staged, unstaged and untracked changes |  |
| `--set=SET` | Only this doc set |  |
| `--docs-version=DOCS-VERSION` | A version id, or "all" (default: each set's default version) |  |
| `--locale=LOCALE` | Check this locale's translations against their source pages |  |
| `--format=FORMAT` | text, json, github or markdown | text |
| `--fail-on-stale` | Exit with 1 when the change leaves pages stale |  |
| `--no-drift` | Skip pages that drifted before this change |  |

### larecipe:sources:suggest

Proposes `sources:` for pages that declare none, from the classes, commands and routes they mention. `--apply` writes them into those pages.

**Command** `larecipe:sources:suggest`: Suggest sources: for docs pages from the code they mention

```bash
php artisan larecipe:sources:suggest [--set [SET]] [--page [PAGE]] [--all] [--apply] [--dry-run] [--json]
```

Options:

| Option | Description | Default |
| --- | --- | --- |
| `--set=SET` | Only this doc set |  |
| `--page=PAGE` | Only this page path |  |
| `--all` | Also suggest for pages that already declare sources |  |
| `--apply` | Add the suggestions to pages that declare no sources yet |  |
| `--dry-run` | With --apply, show what would change without writing |  |
| `--json` | Print the suggestions as JSON |  |

### larecipe:validate

Checks links, navigation, schemas, components, snippets, live references, budgets and skills. Exits non-zero on an error; `--json` prints the report agents read. See [validation](https://larecipe.saleem.dev/3.x/operate/validation.md).

**Command** `larecipe:validate`: Check the docs: links, navigation, schemas, components, snippets, budgets and skills

```bash
php artisan larecipe:validate [--set [SET]] [--docs-version [DOCS-VERSION]] [--json]
```

Options:

| Option | Description | Default |
| --- | --- | --- |
| `--set=SET` | Only this doc set |  |
| `--docs-version=DOCS-VERSION` | Only this version of the set (Symfony reserves --version) |  |
| `--json` | Print the report as JSON |  |

### larecipe:hook

Called by the agent hooks (`pre-push`, `session-start`) and the git hook (`git-pre-push`). You do not run it by hand.

**Command** `larecipe:hook`: Run LaRecipe's docs check for an agent hook or the git pre-push hook

```bash
php artisan larecipe:hook [--client [CLIENT]] [--strict] [--payload [PAYLOAD]] [--] <event>
```

Arguments:

| Argument | Description | Default |
| --- | --- | --- |
| `event` | pre-push, session-start or git-pre-push (required) |  |

Options:

| Option | Description | Default |
| --- | --- | --- |
| `--client=CLIENT` | The agent calling: claude or codex | claude |
| `--strict` | For git-pre-push, block the push when pages are stale |  |
| `--payload=PAYLOAD` | The hook payload as JSON (default: read from stdin) |  |

### larecipe:hooks:git

Installs or removes the git pre-push check, for people who push without an agent. It warns by default; `--strict` holds the push. It never replaces an existing hook.

**Command** `larecipe:hooks:git`: Install or remove the git pre-push docs check

```bash
php artisan larecipe:hooks:git [--install] [--uninstall] [--strict] [--dry-run]
```

Options:

| Option | Description | Default |
| --- | --- | --- |
| `--install` | Add the LaRecipe check to the pre-push hook |  |
| `--uninstall` | Remove the LaRecipe check from the pre-push hook |  |
| `--strict` | Block pushes that leave docs pages stale (default: warn only) |  |
| `--dry-run` | Show what would change without writing anything |  |

### larecipe:sync

Runs a docs agent inside your app on your own `laravel/ai` provider key: for the pages a change left stale, the pages you name, or the whole set with `--audit`. It shows its plan and asks first. See [larecipe:sync](https://larecipe.saleem.dev/3.x/keeping-current/sync.md).

**Command** `larecipe:sync`: Update the docs with an AI agent on your own provider key (on demand, never in CI)

```bash
php artisan larecipe:sync [--base [BASE]] [--head [HEAD]] [--page [PAGE]] [--audit] [--set [SET]] [--docs-version [DOCS-VERSION]] [--locale [LOCALE]] [--dry-run] [--max-pages [MAX-PAGES]] [--max-steps [MAX-STEPS]] [--provider [PROVIDER]] [--model [MODEL]] [--remote [REMOTE]] [--commit] [--queue] [--yes]
```

Options:

| Option | Description | Default |
| --- | --- | --- |
| `--base=BASE` | Compare with this branch or commit (default: the default branch) |  |
| `--head=HEAD` | The end of the range | HEAD |
| `--page=PAGE` | Update this page instead (a path such as guides/webhooks, or its file); repeatable |  |
| `--audit` | Review the whole set and fix what matters most |  |
| `--set=SET` | The doc set (default: the default set) |  |
| `--docs-version=DOCS-VERSION` | The version to work on (default: the set's default version) |  |
| `--locale=LOCALE` | The locale to work on (default: the set's default locale) |  |
| `--dry-run` | Report what the agent would change, and write nothing |  |
| `--max-pages=MAX-PAGES` | The most pages this run may change (default: larecipe.ai.sync.max_pages) |  |
| `--max-steps=MAX-STEPS` | The most agent steps this run may take (default: larecipe.ai.sync.max_steps) |  |
| `--provider=PROVIDER` | The laravel/ai provider (default: larecipe.ai.sync.provider, then ai.default) |  |
| `--model=MODEL` | The model (default: larecipe.ai.sync.model, then the provider's default) |  |
| `--remote=REMOTE` | The MCP endpoint of a production database set, to change it outside a pull request |  |
| `--commit` | Commit the docs change on the current branch |  |
| `--queue` | Run as a queued job (visible in Horizon or Nightwatch) |  |
| `--yes` | Run without asking |  |

## Agents

### larecipe:agents

Regenerates the `AGENTS.md` block, the skills and the compiled hook patterns. Run it after updating LaRecipe or changing its config.

**Command** `larecipe:agents`: Regenerate the AGENTS.md block, the LaRecipe skills and the hook patterns

```bash
php artisan larecipe:agents [--dry-run] [--no-index] [--package]
```

Options:

| Option | Description | Default |
| --- | --- | --- |
| `--dry-run` | Show what would change without writing anything |  |
| `--no-index` | Leave the docs index out of the AGENTS.md block |  |
| `--package` | Refresh the canonical skills inside the LaRecipe package (for contributors) |  |

### larecipe:agents-md

Writes the docs index into the LaRecipe block of `AGENTS.md`. Run it after adding, removing or renaming pages.

**Command** `larecipe:agents-md`: Write the docs index into the LaRecipe block of AGENTS.md

```bash
php artisan larecipe:agents-md [--set [SET]] [--claude-md] [--print] [--dry-run]
```

Options:

| Option | Description | Default |
| --- | --- | --- |
| `--set=SET` | Index this doc set (default: the default set) |  |
| `--claude-md` | Also add @AGENTS.md to CLAUDE.md without asking |  |
| `--print` | Print the block instead of writing it |  |
| `--dry-run` | Show what would change without writing anything |  |

### larecipe:mcp

Starts the local MCP server over stdio. Your agent's MCP config runs it. See [MCP tools](https://larecipe.saleem.dev/3.x/reference/mcp-tools.md).

**Command** `larecipe:mcp`: Start the LaRecipe docs MCP server over stdio, for your coding agent

```bash
php artisan larecipe:mcp
```

### larecipe:doctor

Grades what agents get from each doc set, with a fix for each finding. Exits non-zero when a check fails. See [validation and doctor](https://larecipe.saleem.dev/3.x/operate/validation.md).

**Command** `larecipe:doctor`: Grade how ready your docs are for agents, with fixes

```bash
php artisan larecipe:doctor [--set [SET]] [--json]
```

Options:

| Option | Description | Default |
| --- | --- | --- |
| `--set=SET` | Only this doc set |  |
| `--json` | Print the report as JSON |  |

## Sources

### larecipe:source:export

Writes a doc set as a bundle of canonical files, to a folder or a `.tar.gz`, for `source:import` and `pull`.

**Command** `larecipe:source:export`: Export a doc set as a bundle of canonical files (Markdown, larecipe.json, navigation.json, assets)

```bash
php artisan larecipe:source:export [--set [SET]] [--to [TO]]
```

Options:

| Option | Description | Default |
| --- | --- | --- |
| `--set=SET` | The doc set (default: larecipe.default) |  |
| `--to=TO` | A new directory, or a file ending in .tar.gz |  |

### larecipe:source:import

Loads a bundle into a set's configured source, validated first. `--verify` compares every content hash afterwards.

**Command** `larecipe:source:import`: Import a bundle of canonical files into a doc set

```bash
php artisan larecipe:source:import [--set [SET]] [--verify] [--] <bundle>
```

Arguments:

| Argument | Description | Default |
| --- | --- | --- |
| `bundle` | A bundle directory, or a .tar.gz made by larecipe:source:export (required) |  |

Options:

| Option | Description | Default |
| --- | --- | --- |
| `--set=SET` | The doc set (default: larecipe.default) |  |
| `--verify` | Re-read the set afterwards and compare every content hash |  |

### larecipe:source:move

Copies a set between the repository and the database, and prints the config change that switches serving. It never edits `config/larecipe.php`. See [switching sources](https://larecipe.saleem.dev/3.x/sources/switching.md).

**Command** `larecipe:source:move`: Move a doc set between the repository and the database source

```bash
php artisan larecipe:source:move [--set [SET]] [--path [PATH]] [--connection [CONNECTION]] [--dry-run] [--verify] [--] <from> <to>
```

Arguments:

| Argument | Description | Default |
| --- | --- | --- |
| `from` | The source the set uses now: repository or database (required) |  |
| `to` | The source to move it to: repository or database (required) |  |

Options:

| Option | Description | Default |
| --- | --- | --- |
| `--set=SET` | The doc set (default: larecipe.default) |  |
| `--path=PATH` | The docs folder on the repository side, when it is not the configured one (default: docs/) |  |
| `--connection=CONNECTION` | The database connection on the database side |  |
| `--dry-run` | Show the plan and the validation, write nothing |  |
| `--verify` | After writing, re-read the target and compare every content hash |  |

### larecipe:make:docs-migration

Scaffolds a docs migration by hand. Each `--page` is filled with its current content and content hash. See [docs migrations](https://larecipe.saleem.dev/3.x/sources/docs-migrations.md).

**Command** `larecipe:make:docs-migration`: Create a docs migration for a database doc set

```bash
php artisan larecipe:make:docs-migration [--set [SET]] [--page [PAGE]] [--] <name>
```

Arguments:

| Argument | Description | Default |
| --- | --- | --- |
| `name` | What the migration does, for example document_billing_exports (required) |  |

Options:

| Option | Description | Default |
| --- | --- | --- |
| `--set=SET` | The doc set (default: larecipe.default) |  |
| `--page=PAGE` | Pages to include with their current content and hash, for example 3.x/billing/exports |  |

### larecipe:pull

Refreshes a local or CI database set from a bundle made on production with `larecipe:source:export`.

**Command** `larecipe:pull`: Refresh a local database doc set from a production export

```bash
php artisan larecipe:pull [--set [SET]] [--from [FROM]]
```

Options:

| Option | Description | Default |
| --- | --- | --- |
| `--set=SET` | The database doc set to refresh (default: larecipe.default) |  |
| `--from=FROM` | A bundle made on production with larecipe:source:export (a .tar.gz or a directory) |  |

### larecipe:cache:warm

Warms the cache of database sets. Run it in your deploy after `php artisan migrate`.

**Command** `larecipe:cache:warm`: Warm the cache of database doc sets (pages, navigation, manifest)

```bash
php artisan larecipe:cache:warm [--set [SET]]
```

Options:

| Option | Description | Default |
| --- | --- | --- |
| `--set=SET` | The doc sets to warm (default: every database set) |  |

## Operate

### larecipe:optimize

Renders every page of repository sets into the cache, with page lists, navigation and search records. `php artisan optimize` runs it.

**Command** `larecipe:optimize`: Compile LaRecipe pages, navigation and search records into the cache

```bash
php artisan larecipe:optimize [--set [SET]]
```

Options:

| Option | Description | Default |
| --- | --- | --- |
| `--set=SET` | Only compile these doc sets |  |

### larecipe:clear

Forgets what `larecipe:optimize` compiled, and deletes `bootstrap/cache/larecipe/optimized.php`. The provenance index, the reference snapshot and the hook patterns stay. `php artisan optimize:clear` runs it.

**Command** `larecipe:clear`: Forget the LaRecipe pages and search records compiled by larecipe:optimize

```bash
php artisan larecipe:clear
```

### larecipe:provenance

Compiles each page's last change from git, for repository sets. Run it where the full history is; `larecipe:optimize` does not run it. See [the repository source](https://larecipe.saleem.dev/3.x/sources/repository.md).

**Command** `larecipe:provenance`: Compile page provenance (last change, author, agent, pull request) for repository doc sets

```bash
php artisan larecipe:provenance [--set [SET]] [--clear]
```

Options:

| Option | Description | Default |
| --- | --- | --- |
| `--set=SET` | The doc sets to compile (default: every repository set) |  |
| `--clear` | Remove the compiled indexes instead |  |

### larecipe:references:snapshot

Writes what live references can read to `bootstrap/cache/larecipe/references.json`, for CI without a database. Used only when the app cannot answer.

**Command** `larecipe:references:snapshot`: Snapshot what live references can read, for CI without a database

```bash
php artisan larecipe:references:snapshot
```

### larecipe:export

Writes public doc sets as a static site, search included. What needs the running app is left out and listed. See [static export](https://larecipe.saleem.dev/3.x/operate/static-export.md).

**Command** `larecipe:export`: Export public doc sets as a static site

```bash
php artisan larecipe:export [--out [OUT]] [--set [SET]] [--base-url [BASE-URL]]
```

Options:

| Option | Description | Default |
| --- | --- | --- |
| `--out=OUT` | The folder to write the site into | build/docs |
| `--set=SET` | The doc sets to export (all public sets by default) |  |
| `--base-url=BASE-URL` | Where the site will be served from, for example https://docs.acme.dev |  |

### larecipe:share

Prints a temporary signed link that lets anyone read one page, private or not. See [gate blocks and private docs](https://larecipe.saleem.dev/3.x/writing/gate-blocks.md).

**Command** `larecipe:share`: Issue a temporary signed link that lets anyone read one private page

```bash
php artisan larecipe:share [--expires [EXPIRES]] [--] <page>
```

Arguments:

| Argument | Description | Default |
| --- | --- | --- |
| `page` | The page, as set/version/path (for example docs/3.x/billing/roadmap) (required) |  |

Options:

| Option | Description | Default |
| --- | --- | --- |
| `--expires=EXPIRES` | How long the link works: 30m, 12h, 7d, 2w | 7d |

## The UI files

There is no `larecipe:publish`. To let your web server serve the prebuilt UI files, use Laravel's own command (see [deployment](https://larecipe.saleem.dev/3.x/operate/deployment.md)):

```bash
php artisan vendor:publish --tag=larecipe-assets --force
```
