Every larecipe:* command, grouped by job. Each usage block and option table is read from the running app by an <Artisan> live reference, 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.
larecipe:installInstall LaRecipe: your docs, and the agent setup that keeps them current
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]| 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.
larecipe:onboardGenerate starter docs from your app with your local coding agent
php artisan larecipe:onboard [--audience [AUDIENCE]] [--set [SET]] [--agent [AGENT]] [--print] [--yes]| 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.
larecipe:upgradeUpgrade LaRecipe 2 docs, config and navigation to LaRecipe 3
php artisan larecipe:upgrade [--apply] [--move-to [MOVE-TO]] [--relative-links]| 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.
larecipe:make:pageCreate a docs page with title, description and sources
php artisan larecipe:make:page [--title [TITLE]] [--description [DESCRIPTION]] [--source [SOURCE]] [--set [SET]] [--docs-version [DOCS-VERSION]] [--locale [LOCALE]] [--dry-run] [--] <path>| Argument | Description | Default |
|---|---|---|
path | The page path, for example billing/refunds (required) |
| 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.
larecipe:make:versionAdd a docs version by copying an existing one
php artisan larecipe:make:version [--from [FROM]] [--default] [--current-as [CURRENT-AS]] [--set [SET]] [--dry-run] [--] <version>| Argument | Description | Default |
|---|---|---|
version | The new version id, for example 3.x (required) |
| 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.
larecipe:navigation:freezeWrite the derived navigation to navigation.json
php artisan larecipe:navigation:freeze [--set [SET]] [--docs-version [DOCS-VERSION]] [--locale [LOCALE]] [--dry-run]| 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 for ranges and formats.
larecipe:affectedList the docs pages a change affects and the ones it left stale
php artisan larecipe:affected [--base [BASE]] [--head [HEAD]] [--uncommitted] [--set [SET]] [--docs-version [DOCS-VERSION]] [--locale [LOCALE]] [--format [FORMAT]] [--fail-on-stale] [--no-drift]| 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.
larecipe:sources:suggestSuggest sources: for docs pages from the code they mention
php artisan larecipe:sources:suggest [--set [SET]] [--page [PAGE]] [--all] [--apply] [--dry-run] [--json]| 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.
larecipe:validateCheck the docs: links, navigation, schemas, components, snippets, budgets and skills
php artisan larecipe:validate [--set [SET]] [--docs-version [DOCS-VERSION]] [--json]| 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.
larecipe:hookRun LaRecipe's docs check for an agent hook or the git pre-push hook
php artisan larecipe:hook [--client [CLIENT]] [--strict] [--payload [PAYLOAD]] [--] <event>| Argument | Description | Default |
|---|---|---|
event | pre-push, session-start or git-pre-push (required) |
| 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.
larecipe:hooks:gitInstall or remove the git pre-push docs check
php artisan larecipe:hooks:git [--install] [--uninstall] [--strict] [--dry-run]| 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.
larecipe:syncUpdate the docs with an AI agent on your own provider key (on demand, never in CI)
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]| 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.
larecipe:agentsRegenerate the AGENTS.md block, the LaRecipe skills and the hook patterns
php artisan larecipe:agents [--dry-run] [--no-index] [--package]| 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.
larecipe:agents-mdWrite the docs index into the LaRecipe block of AGENTS.md
php artisan larecipe:agents-md [--set [SET]] [--claude-md] [--print] [--dry-run]| 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.
larecipe:mcpStart the LaRecipe docs MCP server over stdio, for your coding agent
php artisan larecipe:mcplarecipe: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.
larecipe:doctorGrade how ready your docs are for agents, with fixes
php artisan larecipe:doctor [--set [SET]] [--json]| 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.
larecipe:source:exportExport a doc set as a bundle of canonical files (Markdown, larecipe.json, navigation.json, assets)
php artisan larecipe:source:export [--set [SET]] [--to [TO]]| 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.
larecipe:source:importImport a bundle of canonical files into a doc set
php artisan larecipe:source:import [--set [SET]] [--verify] [--] <bundle>| Argument | Description | Default |
|---|---|---|
bundle | A bundle directory, or a .tar.gz made by larecipe:source:export (required) |
| 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.
larecipe:source:moveMove a doc set between the repository and the database source
php artisan larecipe:source:move [--set [SET]] [--path [PATH]] [--connection [CONNECTION]] [--dry-run] [--verify] [--] <from> <to>| 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) |
| 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.
larecipe:make:docs-migrationCreate a docs migration for a database doc set
php artisan larecipe:make:docs-migration [--set [SET]] [--page [PAGE]] [--] <name>| Argument | Description | Default |
|---|---|---|
name | What the migration does, for example document_billing_exports (required) |
| 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.
larecipe:pullRefresh a local database doc set from a production export
php artisan larecipe:pull [--set [SET]] [--from [FROM]]| 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.
larecipe:cache:warmWarm the cache of database doc sets (pages, navigation, manifest)
php artisan larecipe:cache:warm [--set [SET]]| 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.
larecipe:optimizeCompile LaRecipe pages, navigation and search records into the cache
php artisan larecipe:optimize [--set [SET]]| 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.
larecipe:clearForget the LaRecipe pages and search records compiled by larecipe:optimize
php artisan larecipe:clearlarecipe: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.
larecipe:provenanceCompile page provenance (last change, author, agent, pull request) for repository doc sets
php artisan larecipe:provenance [--set [SET]] [--clear]| 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.
larecipe:references:snapshotSnapshot what live references can read, for CI without a database
php artisan larecipe:references:snapshotlarecipe:export
Writes public doc sets as a static site, search included. What needs the running app is left out and listed. See static export.
larecipe:exportExport public doc sets as a static site
php artisan larecipe:export [--out [OUT]] [--set [SET]] [--base-url [BASE-URL]]| 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.
larecipe:shareIssue a temporary signed link that lets anyone read one private page
php artisan larecipe:share [--expires [EXPIRES]] [--] <page>| Argument | Description | Default |
|---|---|---|
page | The page, as set/version/path (for example docs/3.x/billing/roadmap) (required) |
| 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):
php artisan vendor:publish --tag=larecipe-assets --force