Laravel Process Map
Pacote de analise estatica que mapeia os processos de negocio dentro de qualquer aplicacao Laravel -- sem nunca a executar. Le o codigo-fonte e os metadados runtime (rotas, schedule, broadcast channels) e produz um mapa do que chama o que, que models sao mutados onde, e que zonas estao automatizadas.
Overview
O Laravel Process Map e uma ferramenta de analise estatica que mapeia os processos de negocio dentro de qualquer aplicacao Laravel. Le o codigo-fonte e os metadados de runtime registados (rotas, schedule, broadcast channels) e produz um mapa, legivel por humanos e por maquinas, dos processos que consegue identificar -- quem chama o que, que models sao mutados onde, que jobs/eventos/listeners participam em cada fluxo, e que zonas do codigo parecem totalmente automatizadas em comparacao com manuais.
Para quem e
- Developers a fazer onboarding num projecto novo -- ganham uma visao da arquitetura em minutos em vez de dias.
- Tech leads e consultores a auditar um codebase -- veem gaps de automatizacao, bottlenecks e riscos sem instrumentar nada.
- Documentacao -- gerar um snapshot versionado do mapa de processos e fazer commit ao repositorio.
- Agentes de IA (v1.1+) -- expor o mapa como recurso MCP para que os agentes consigam raciocinar sobre o dominio.
Como funciona
O pipeline e composto por um scanner principal, um conjunto de scanners especializados, deteccao heuristica de processos, e exporters para os tres formatos suportados.
ApplicationScanner
AST scan (php-parser) ->\
Router (read-only) -->--> ProcessMapResult (DTOs versionados)
Schedule (read-only) ->/
ProcessMapResult --+--> Naming cluster
+--> Automation scoring
+--> Bottleneck/Risk detectors
Resultado anotado --> Json / Markdown / Mermaid exporters
Os ficheiros de codigo-fonte sao parseados via nikic/php-parser em AST. Os metadados de classe (extends, implements, traits, metodos publicos, chamadas a dispatch(), event(), Notification::send, etc.) sao recolhidos por um unico visitor e decorados por scanner.
Rotas, scheduled tasks e broadcast channels vem das APIs de runtime do Laravel (Router::getRoutes(), Schedule::events(), routes/channels.php) -- acesso so de leitura.
Um passo de clustering heuristico agrupa as classes em processos de negocio removendo verbos e sufixos tecnicos do nome da classe, e um conjunto de detectors anota cada processo com nivel de automatizacao, bottlenecks potenciais e riscos.
Instalacao
Instale como dependencia de desenvolvimento -- e uma ferramenta de developer/consulting, nao uma preocupacao de runtime.
composer require digitaldev-lx/laravel-process-map --dev
Corra o comando de install para publicar a configuracao e criar a directoria de output:
php artisan process-map:install
# ou para instalar e fazer scan no mesmo passo
php artisan process-map:install --scan
O service provider e auto-descoberto via extra.laravel.providers -- nao e necessario registo manual.
Requisitos
| Dependencia | Versao |
|---|---|
| PHP | ^8.4 |
| Laravel | ^12.0 || ^13.0 |
| nikic/php-parser | ^5.0 |
| symfony/finder | ^7.4 || ^8.0 |
Quick Start
php artisan process-map:scan --all
Em storage/app/process-map/ sao gerados:
process-map.json-- dados estruturados completos, com schema versionadoprocess-map.md-- relatorio Markdown legivel por humanosprocess-map.mmd-- flowchart Mermaid dos processos detectados
Resumo tipico no terminal
Scanning application...
Scanned:
- Models: 14
- Controllers: 22
- Actions: 31
- Jobs: 9
- Events: 12
- Listeners: 15
- Notifications: 8
- Policies: 6
- Commands: 5
- Routes: 84
Detected processes:
- Booking Management (automation: high)
- Lead Management (automation: high)
- Payment Handling (automation: medium)
- User Onboarding (automation: low)
Outputs:
- storage/app/process-map/process-map.json
- storage/app/process-map/process-map.md
- storage/app/process-map/process-map.mmd
Comandos Artisan
| Comando | Descricao |
|---|---|
| process-map:install [--scan] | Publica config e cria a output directory. Com --scan faz tambem um scan completo. |
| process-map:scan [flags] | Corre todos os scanners e exporters activos. Ver flags abaixo. |
| process-map:report [--output=...] | Gera so o relatorio Markdown. |
| process-map:json [--output=...] | Gera so o artefacto JSON. |
| process-map:mermaid [--output=...] | Gera so o diagrama Mermaid. |
| process-map:mcp-install | Imprime instrucoes para activar o layer MCP. Nunca edita .env ou routes/ai.php automaticamente. |
| process-map:mcp-status | Diagnostico tabular: toggles do MCP e flags do envelope de seguranca. |
Flags do process-map:scan
--json # gera JSON
--markdown # gera Markdown
--mermaid # gera Mermaid
--all # JSON + Markdown + Mermaid
--output=path # override da directoria de output
--no-routes # ignora o route scanner
--no-process-detection # ignora o clustering heuristico
Sem nenhuma flag de formato, o comando usa config('process-map.exports.*').
Formatos de output
JSON
Artefacto canonico, com schema versionado (schema_version: "0.1"). Contem metadata da app, summary com totais, lista de classes descobertas, rotas, e processos detectados com componentes, bottlenecks, riscos e recomendacoes.
{
"schema_version": "0.1",
"generated_at": "2026-05-04T18:00:00+00:00",
"package": "digitaldev-lx/laravel-process-map",
"version": "1.1.2",
"app": {
"name": "Example App",
"environment": "local",
"laravel_version": "13.0",
"php_version": "8.4.1"
},
"summary": {
"models": 14, "controllers": 22, "actions": 31,
"jobs": 9, "events": 12, "listeners": 15,
"notifications": 8, "policies": 6, "commands": 5,
"routes": 84, "processes": 5
},
"processes": [
{
"name": "Lead Management",
"entity": "Lead",
"automation_level": "high",
"components": {
"models": ["App\\Models\\Lead"],
"actions": ["App\\Actions\\CreateLeadAction"],
"jobs": ["App\\Jobs\\SendLeadFollowUpJob"],
"events": ["App\\Events\\LeadCreated"]
},
"risks": [
"Process 'Lead Management' has no associated policy: authorisation may be missing."
],
"recommendations": [
"Add a policy for the Lead model."
]
}
]
}
Markdown
Documento denso, single-pass, construido para que um humano (ou um LLM) consiga apreender a arquitectura numa unica leitura. Seccoes produzidas:
# Process Map:
> header -- generated_at . PHP . Laravel . Schema . Package version
## Summary -- counts table
## Processes -- um bloco por processo detectado
### N.
- Entity / Automation level
#### Members -- table: Role . Class (FQCN) . File . Notes
#### Flow -- trace explicito: route -> controller -> action -> job/event -> listener
#### Findings -- linhas com Bottleneck / Risk / Recommendation
## Unattached Components -- classes sem processo
## Routes Index -- Method . URI . Name . Controller@method . Middleware
## Scheduled Tasks -- Cron . Command . Description . Flags
## Broadcast Channels -- channel name + auth callback presence
Uma fixture de 12 classes da origem a ~85 linhas / 2.6 KB. Uma aplicacao Laravel tipica de ~150 classes produz ~600-800 linhas / ~20 KB -- folgadamente dentro de qualquer context window moderno.
Mermaid
Gera um flowchart de overview e um diagrama por processo detectado:
flowchart TD
route_0["POST leads"]
App_Http_Controllers_LeadController["LeadController"]
route_0 --> |HTTP::store| App_Http_Controllers_LeadController
App_Actions_CreateLeadAction --> |dispatches| App_Jobs_SendLeadFollowUpJob
App_Actions_CreateLeadAction --> |fires| App_Events_LeadCreated
App_Events_LeadCreated --> |handled by| App_Listeners_SendLeadCreatedNotification
App_Listeners_SendLeadCreatedNotification --> |sends| App_Notifications_LeadAssignedNotification
Renderizavel via Mermaid Live Editor, GitHub-flavoured Markdown ou a extensao Mermaid Preview do VS Code.
Nota: desde v1.1.1 os edge labels HTTP usam HTTP::method (e.g. |HTTP::store|). As versoes recentes do Mermaid passaram a reservar @ como marker LINK_ID, o que provocava parse errors no overview flowchart.
Desenhado para LLMs
O relatorio Markdown e o artefacto canonico para desenvolvimento assistido por IA. Faz-se drop do process-map.md em Claude Code, ChatGPT, Cursor, Aider ou qualquer outra ferramenta LLM, e fica imediatamente um mapa navegavel da aplicacao -- sem o LLM ter de fazer grep, abrir dezenas de ficheiros ou adivinhar como tudo se encaixa.
Vantagens concretas para um LLM
- File path em cada linha. As tabelas Members e Unattached incluem o caminho relativo de cada classe -- o LLM abre o ficheiro certo directamente em vez de fazer search.
- Um lugar canonico por classe. Cada classe aparece em exactamente um sitio -- ou dentro do bloco Process a que pertence ou em Unattached Components. Sem listagens duplicadas, sem tokens desperdicados.
- Coluna Notes densa. Factos operacionais inline:
queue=reports . tries=5 . timeout=120s,channels: mail, database . queued,sync (no ShouldQueue). - Trace de Flow explicito. A sequencia
route -> controller -> action -> job/event -> listener -> notificatione detalhada em bullet points. - Clustering reference-aware. Classes que nao seguem convencao de nomenclatura sao na mesma anexadas ao processo via referencias estaticas (e.g.
CreateLeadAction -> dispatches SendLeadFollowUpJobpuxa o job para o bloco Lead Management). - Hedge wording em findings. Bottlenecks/riscos/recomendacoes sao prefixados com
Bottleneck:,Risk:,Recommendation:-- o LLM trata-os como pontos de partida para investigacao, nao como factos. - Header com schema versionado.
Schema 0.1permite construir prompts reproduzeis: pinne a versao no tooling e os prompts continuam a funcionar quando o pacote for actualizado. - Eficiente em tokens. ~85 linhas / 2.6 KB para 12 classes; ~600-800 linhas / 20 KB para 150. Folga para o raciocinio do LLM e tool calls.
Receita rapida -- Claude Code
php artisan process-map:scan --markdown
# depois, dentro do Claude Code:
# /add-dir storage/app/process-map
# ou colar o ficheiro:
cat storage/app/process-map/process-map.md | pbcopy
Prompt de arranque sugerido
process-map.md como mapa arquitectural desta app. Nao faz grep a menos que eu peca -- vai buscar caminhos de ficheiros e referencias ao relatorio. Quando vires marcadores de bottleneck, risk ou recommendation, trata-os como pontos de partida para revisao mais profunda, nao como bugs confirmados."
Layer MCP (opcional)
O Laravel Process Map traz um layer MCP read-only opcional por cima do laravel/mcp. Expoe o mesmo mapa como resources, tools e prompts de MCP, para que o Claude Code (e qualquer outro cliente compativel) possa interrogar a arquitectura interactivamente, sem ter de carregar um relatorio estatico grande no prompt.
O layer esta desligado por defeito. Activa-lo nao relaxa nenhuma das garantias de seguranca: continua estrictamente read-only -- sem shell, sem SQL, sem HTTP externo, sem exposicao do .env.
Quando usar qual?
| Quando precisas... | Usa |
|---|---|
| Documentacao estatica versionada no repo, anexo de auditoria, ou paste rapido em prompt | Markdown / JSON / Mermaid |
| Sessao interactiva onde o LLM escolhe o slice certo do mapa por pergunta; apps muito grandes; prompts reutilizaveis; inspeccao por processo | Layer MCP |
Instalacao
# 1. Instrucoes de install
php artisan process-map:mcp-install
# 2. Switch da flag no .env
PROCESS_MAP_MCP_ENABLED=true
# 3. Garantir que routes/ai.php existe
php artisan vendor:publish --tag=ai-routes
# 4. Registar o servidor em routes/ai.php (ver abaixo)
# 5. Produzir um mapa (o layer MCP le-o)
php artisan process-map:scan --all
# 6. Verificar
php artisan process-map:mcp-status
use Laravel\Mcp\Facades\Mcp;
use DigitaldevLx\LaravelProcessMap\Mcp\Servers\ProcessMapServer;
// STDIO (transport default do Claude Code)
Mcp::local('process-map', ProcessMapServer::class);
// ou HTTP (com middleware de throttle a escolha)
// Mcp::web('/mcp/process-map', ProcessMapServer::class)->middleware('throttle:mcp');
Resources (8)
| URI | Devolve |
|---|---|
| process-map://summary | Metadata da app, totais, schema e versao do package |
| process-map://processes | Lista compacta dos processos detectados |
| process-map://process/{slug} | Detalhe completo de um processo (template URI) |
| process-map://routes | Todas as rotas registadas |
| process-map://classes | Classes descobertas agrupadas por tipo |
| process-map://risks | Riscos consolidados em todos os processos |
| process-map://recommendations | Recomendacoes + hints de bottleneck |
| process-map://mermaid | Diagrama Mermaid raw |
Tools (11, todas read-only)
Prompts (6 templates de workflow)
Envelope de seguranca (sempre activo)
- Read-only por design -- todas as tools tem
#[IsReadOnly] - Sem execucao de shell, SQL ou HTTP externo
.envnunca e lido; chaves sensiveis (password / secret / token / api_key / authorization / bearer / credential / connection / *_password / private_key) sao redigidas para[REDACTED]- Output capped por response (
max_response_bytes); processos e classes com tectos explicitos; graph walks com depth limit (max_related_depth ≤ 5)
Configuracao
php artisan vendor:publish --tag=process-map-config
O ficheiro publicado vive em config/process-map.php e expoe os seguintes grupos:
return [
'paths' => [
'app' => app_path(),
'routes' => base_path('routes'),
],
'output_path' => storage_path('app/process-map'),
'scan' => [
'models' => true, 'controllers' => true, 'actions' => true,
'jobs' => true, 'events' => true, 'listeners' => true,
'notifications' => true, 'policies' => true, 'commands' => true,
'routes' => true, 'schedule' => true, 'broadcasting' => true,
],
'directories' => [
'models' => ['app/Models'],
'controllers' => ['app/Http/Controllers'],
'actions' => ['app/Actions'],
'jobs' => ['app/Jobs'],
'events' => ['app/Events'],
'listeners' => ['app/Listeners'],
'notifications' => ['app/Notifications'],
'policies' => ['app/Policies'],
'commands' => ['app/Console/Commands'],
],
'process_detection' => [
'enabled' => true,
'keywords' => ['create', 'update', 'delete', /* ... */],
'business_suffixes' => ['Action', 'Job', 'Command', 'Service', 'Workflow', 'Process'],
],
'exports' => [
'json' => true, 'markdown' => true, 'mermaid' => true, 'html' => false,
],
'privacy' => [
'include_method_names' => true,
'include_properties' => false,
'include_docblocks' => false,
'include_file_paths' => true,
'redact_env_values' => true,
],
];
Layouts modulares (DDD, nwidart/laravel-modules)
Adicione roots adicionais em directories:
'directories' => [
'actions' => ['app/Actions', 'modules/*/Actions'],
'models' => ['app/Models', 'modules/*/Domain/Models'],
],
Scanners disponiveis
Cada scanner pode ser desligado em config('process-map.scan.*').
| Scanner | Produz |
|---|---|
| ModelScanner | Eloquent models com table, fillable, casts, traits, soft-delete e factory flags |
| ControllerScanner | Controllers com accoes publicas, form requests, eventos despachados |
| ActionScanner | Action classes com main entry method (handle/execute/__invoke/run), jobs despachados, eventos disparados |
| JobScanner | Jobs com ShouldQueue, $queue, $tries, $timeout, $backoff |
| EventScanner | Events com flags de broadcasting e traits Dispatchable / SerializesModels |
| ListenerScanner | Listeners com o evento que tratam e queue flag |
| NotificationScanner | Notifications com canais (via()) e metodos to* de delivery |
| PolicyScanner | Policies divididas em abilities standard e custom, mapeadas a model |
| CommandScanner | Comandos Artisan com signature e description |
| RouteScanner | Rotas registadas com controller, methods, name, middleware, domain |
| ScheduleScanner | Tasks scheduled com cron expression, command, mutex, timezone, withoutOverlapping, onOneServer |
| BroadcastScanner | Channels declarados via Broadcast::channel() em routes/channels.php |
Deteccao de processos
O NamingConventionProcessDetector e propositadamente simples:
- Percorre cada
DiscoveredClassde um tipo participante. - Remove o sufixo de negocio (e.g.
Action,Job). - Remove o verbo inicial (e.g.
Create,Send). - Remove participios comuns (e.g.
Created,Updated). - Cluster pelo que sobra. Clusters com pelo menos 2 classes tornam-se um processo.
Detectors que anotam cada processo
AutomationDetector
Atribui none / low / medium / high com base nos componentes que o processo possui (jobs e schedule pesam mais que models simples).
BottleneckDetector
Sinaliza hints com hedge wording: "Notifications in 'Lead Management' may run synchronously".
RiskDetector
Sinaliza policies em falta, jobs sem $tries/$timeout, signatures destrutivas em comandos.
O output e sempre best-effort. As palavras Potential..., May indicate... sao intencionais e propagadas ao relatorio Markdown.
API programatica
Resolva o singleton ProcessMap do container:
use DigitaldevLx\LaravelProcessMap\ProcessMap;
$processMap = app(ProcessMap::class);
$result = $processMap->scan(); // devolve ProcessMapResult
$json = $processMap->exportJson($result, storage_path('app/snapshot.json'));
$md = $processMap->exportMarkdown($result); // string LLM-ready
$mmd = $processMap->exportMermaid($result);
A string devolvida por exportMarkdown() e identica ao ficheiro escrito por process-map:report e pode ser passada directamente ao prompt de um LLM.
ProcessMapResult e um DTO tipado e readonly:
$result->summary->models; // int
$result->classes; // list
$result->routes; // list
$result->processes; // list
$result->toArray(); // array recursivamente serializado
Use cases
- Diff entre dois snapshots em CI para detectar drift arquitectural.
- Pipe do JSON para Backstage / TechDocs / wiki interno.
- Feed do JSON a um LLM como contexto para prompts de code review.
Garantias de seguranca
O pacote e estrictamente read-only. Nunca:
- Executa codigo de negocio, jobs, eventos ou notifications
- Faz queries a base de dados
- Faz HTTP calls
- Escreve fora da
output_pathconfigurada - Expoe o conteudo do
.envou outros segredos
A analise e feita via parsing AST. Reflection e opt-in via process-map.safe_reflection.enabled e e usada apenas para metadata segura (interfaces, traits, parent class).
Um teste dedicado (tests/Unit/ReadOnlyInvariantTest.php) faz scan da propria src/ a procura de helpers proibidos (DB::, dispatch(, event(, Notification::send, Mail::send, Http::*) e falha o build se algum for introduzido.
Limitacoes
Deteccao heuristica
O clustering de processos usa convencoes de nomenclatura. Apps que nao seguem a estrutura standard do Laravel podem precisar de sufixos/keywords customizados na config.
Scope do AST
So sao inspeccionadas top-level classes. Anonymous classes, interfaces e traits sao saltadas (intencional -- nao sao enderecaveis como participantes de processo).
Lazy routes
Rotas registadas condicionalmente em runtime (apos RouteServiceProvider::boot) sao detectadas; rotas registadas via middleware ou caminhos runtime raros podem nao ser.
Schedule introspection
Depende da API Schedule::events() do Laravel. Schedules baseados em closure expoem so a cron expression e timezone.
HTML exporter
Stub em v1.0, agendado para v1.2.
Roadmap
| Versao | Highlights |
|---|---|
| v1.0 | Static scan, exporters JSON/Markdown/Mermaid, deteccao heuristica de processos com clustering reference-aware, Markdown denso LLM-ready. |
| v1.1 | Layer MCP read-only (laravel/mcp) -- 8 resources, 11 tools, 6 prompts. Slugs de processo no core. |
| v1.1.1 | Bug fix do MermaidExporter: edge labels HTTP usam HTTP::method em vez de HTTP@method (versoes recentes do Mermaid reservam @ como LINK_ID). |
| v1.1.2 (actual) | Constraint do symfony/finder alargado de ^7.0 para ^7.4 || ^8.0, permitindo instalacao limpa em Laravel 13 (que vem com componentes Symfony 8). |
| v1.2 | Dashboard HTML, historico de snapshots, tool compare_process_maps. |
| v1.3 | GitHub Action, scan diff entre commits, deteccao de regressao arquitectural. |
| v2.0 | Plugin SPI para scanners e detectors customizados; potencial schema upgrade. |
$ composer require digitaldev-lx/laravel-process-map --dev
Mapeie a sua aplicacao em segundos.
Consulte o repositorio para a documentacao completa, CHANGELOG, issues e contribuicoes.