Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 39 additions & 0 deletions squads/analista-processual/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# Squad Analista-Processual

Conjunto de agentes especializados em análise de processos organizacionais.

## Agentes

| Agente | Responsabilidade |
|---|---|
| **Coordenador** | Orquestra o squad e consolida os resultados |
| **Mapeador** | Mapeia etapas, atores, entradas e saídas |
| **Avaliador** | Avalia riscos, gargalos e conformidade |
| **Documentador** | Gera o relatório final em Markdown |

## Instalação

```bash
pip install -r requirements.txt
```

## Uso

```bash
# Passando o processo como argumento
python squad.py "Processo de onboarding de novos funcionários: RH abre vaga, seleciona candidatos..."

# Passando via stdin
cat processo.txt | python squad.py

# Modo interativo
python squad.py
```

## Saída

O squad entrega um relatório Markdown com:

- **Mapeamento** do processo (fluxo, atores, decisões)
- **Avaliação** (gargalos, riscos, score de maturidade)
- **Relatório executivo** com roadmap de melhorias
3 changes: 3 additions & 0 deletions squads/analista-processual/requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
anthropic>=0.50.0
claude-agent-sdk>=0.1.0
anyio>=4.0.0
148 changes: 148 additions & 0 deletions squads/analista-processual/squad.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
"""
Squad Analista-Processual
=========================
Conjunto de agentes especializados em análise de processos.

Agentes:
- Coordenador : orquestra o squad e consolida os resultados
- Mapeador : mapeia etapas, entradas e saídas do processo
- Avaliador : avalia conformidade, riscos e gargalos
- Documentador : gera o relatório final estruturado

Uso:
python squad.py "Descreva o processo que deseja analisar"
python squad.py # lê o processo de stdin
"""

from __future__ import annotations

import sys
import anyio
from claude_agent_sdk import query, ClaudeAgentOptions, AgentDefinition, ResultMessage


# ---------------------------------------------------------------------------
# Definições dos subagentes
# ---------------------------------------------------------------------------

MAPEADOR = AgentDefinition(
description=(
"Especialista em mapeamento de processos. "
"Identifica todas as etapas, atores, entradas, saídas e decisões "
"de um processo e os organiza em um fluxo claro e sequencial."
),
prompt=(
"Você é um analista de processos sênior especializado em mapeamento. "
"Dado um processo descrito pelo usuário:\n"
"1. Liste todas as etapas na ordem correta.\n"
"2. Para cada etapa, indique: ator responsável, entradas necessárias, "
"saídas produzidas e critérios de conclusão.\n"
"3. Identifique pontos de decisão (gateways) e ramificações.\n"
"4. Represente o fluxo em formato textual estruturado (pseudo-BPMN)."
),
tools=["Read", "Glob"],
)

AVALIADOR = AgentDefinition(
description=(
"Especialista em avaliação de processos. "
"Analisa conformidade, riscos, gargalos e oportunidades de melhoria "
"em processos mapeados."
),
prompt=(
"Você é um analista de processos sênior especializado em avaliação. "
"Dado o mapeamento de um processo:\n"
"1. Identifique gargalos e pontos de ineficiência.\n"
"2. Avalie riscos operacionais e de conformidade (compliance).\n"
"3. Verifique se há etapas redundantes ou sem valor agregado.\n"
"4. Liste oportunidades de melhoria priorizadas por impacto.\n"
"5. Atribua uma pontuação de maturidade processual (0–5) com justificativa."
),
tools=["Read", "Glob"],
)

DOCUMENTADOR = AgentDefinition(
description=(
"Especialista em documentação de processos. "
"Consolida análises em relatórios claros, estruturados e acionáveis."
),
prompt=(
"Você é um analista de processos sênior especializado em documentação. "
"Dadas as análises de mapeamento e avaliação:\n"
"1. Produza um relatório executivo com sumário, achados-chave e "
"recomendações.\n"
"2. Inclua uma tabela de etapas do processo (etapa | ator | SLA sugerido).\n"
"3. Liste os Top-5 riscos com probabilidade, impacto e plano de mitigação.\n"
"4. Descreva um roadmap de melhorias em 3 horizontes (imediato / 90 dias / "
"longo prazo).\n"
"Formate o relatório em Markdown bem estruturado."
),
tools=["Read", "Write", "Glob"],
)


# ---------------------------------------------------------------------------
# Prompt do coordenador
# ---------------------------------------------------------------------------

SYSTEM_PROMPT = """
Você é o coordenador do Squad Analista-Processual.
Seu papel é orquestrar os subagentes para entregar uma análise completa de processos.

Fluxo de trabalho obrigatório:
1. Acione o agente **mapeador** para mapear o processo fornecido pelo usuário.
2. Passe o mapeamento ao agente **avaliador** para identificar riscos e melhorias.
3. Passe mapeamento + avaliação ao agente **documentador** para gerar o relatório final.
4. Apresente o relatório consolidado ao usuário.

Seja objetivo, estruturado e garanta que cada subagente receba contexto suficiente.
""".strip()


# ---------------------------------------------------------------------------
# Runner principal
# ---------------------------------------------------------------------------

async def run_squad(processo: str) -> None:
print("\n=== Squad Analista-Processual ===\n")
print(f"Processo recebido:\n{processo}\n")
print("Iniciando análise...\n")

options = ClaudeAgentOptions(
model="claude-opus-4-6",
system_prompt=SYSTEM_PROMPT,
allowed_tools=["Read", "Write", "Glob", "Agent"],
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Restrict coordinator tools with tools, not allowed_tools

ClaudeAgentOptions.allowed_tools only auto-approves listed tools and does not limit the model to that set, so leaving tools unset here lets the coordinator still invoke other default tools. In practice this can cause non-deterministic behavior (unexpected tool use or permission prompts/hangs in piped non-interactive usage) instead of the intended fixed mapping/evaluation/documentation flow; use tools=["Read", "Write", "Glob", "Agent"] (and optionally disallowed_tools) to enforce the tool boundary.

Useful? React with 👍 / 👎.

agents={
"mapeador": MAPEADOR,
"avaliador": AVALIADOR,
"documentador": DOCUMENTADOR,
},
Comment on lines +115 to +119
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Os nomes dos agentes ('mapeador', 'avaliador', 'documentador') são usados como strings literais aqui e no SYSTEM_PROMPT (linhas 93-95). Isso pode levar a erros de digitação e dificultar a manutenção se os nomes precisarem ser alterados. Para tornar o código mais robusto, recomendo definir esses nomes como constantes no escopo do módulo e usá-las em ambos os locais.

Exemplo:

# Definir no topo do arquivo
MAPEADOR_NAME = 'mapeador'
AVALIADOR_NAME = 'avaliador'
DOCUMENTADOR_NAME = 'documentador'

# Usar no dicionário de agentes
agents={
    MAPEADOR_NAME: MAPEADOR,
    AVALIADOR_NAME: AVALIADOR,
    DOCUMENTADOR_NAME: DOCUMENTADOR,
}

# Usar no SYSTEM_PROMPT com f-string
SYSTEM_PROMPT = f'''
... Acione o agente **{MAPEADOR_NAME}** ...
'''

max_turns=30,
thinking={"type": "adaptive"},
)

async for message in query(prompt=processo, options=options):
if isinstance(message, ResultMessage):
print("\n=== Relatório Final ===\n")
print(message.result)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wrong attribute name on ResultMessage for text access

High Severity

message.result is accessed on ResultMessage, but official SDK examples and documentation indicate this attribute does not exist. The SDK's own streaming_mode.py example only calls print("Result ended") on ResultMessage, and text content is retrieved from AssistantMessage via message.content blocks. PR #563 adding fields to ResultMessage lists stop_reason, model_usage, permission_denials, and uuid — no result field. This will likely raise an AttributeError at runtime, preventing the final report from being displayed.

Fix in Cursor Fix in Web

print(f"\n[Stop reason: {message.stop_reason}]")


def main() -> None:
if len(sys.argv) > 1:
processo = " ".join(sys.argv[1:])
elif not sys.stdin.isatty():
processo = sys.stdin.read().strip()
else:
print("Descreva o processo que deseja analisar (Ctrl+D para finalizar):")
processo = sys.stdin.read().strip()

if not processo:
print("Erro: nenhum processo fornecido.", file=sys.stderr)
sys.exit(1)

anyio.run(run_squad, processo)


if __name__ == "__main__":
main()
Loading