Skip to content
Back to skills

Routes

ASecurity

Gerencia rotas de mensagens do Ravi. Use quando o usuário quiser: - Criar, listar ou remover rotas - Direcionar contatos/grupos/threads para agents específicos - Configurar prioridade, policy e dmScope de rotas - Ver qual agent atende qual padrão

  • 9 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added October 20, 2026
ai-agentsgobash

Works with

  • cli

Security analysis

A100/100

Scanned October 20, 2026

npx -y skills add filipexyz/ravi --skill routes --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Routes?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Routes
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/filipexyz-routes/badge)](https://www.skillsdirectory.com/skills/filipexyz-routes)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: routes-manager
description: |
  Gerencia rotas de mensagens do Ravi. Use quando o usuário quiser:
  - Criar, listar ou remover rotas
  - Direcionar contatos/grupos/threads para agents específicos
  - Configurar prioridade, policy e dmScope de rotas
  - Ver qual agent atende qual padrão
---

# Routes Manager

> Verbos: CAPTAR. Compõe com: whatsapp, agents.
> Solução com mais de uma peça? `ravi skills show solucoes` primeiro.

Rotas direcionam mensagens para agents baseado em padrões. São sempre gerenciadas via `ravi instances routes <name>` — rotas pertencem a uma instância.

## Contrato Do CLI

Rode com `--json` sempre que for decidir programaticamente. Com `--json`, falha sai em envelope `{success:false, op, error:{code, message, retryable, suggestedAction, suggestions?|acceptedFlags?}}`.

Taxonomia de saída:

- `0` sucesso.
- `1` erro de execução (ex.: `ROUTE_NOT_FOUND`, `INSTANCE_NOT_FOUND`). O envelope traz `suggestions` com patterns/instâncias reais parecidos — consulte antes de concluir "não existe".
- `2` erro de uso (flag/argumento inválido). O envelope traz `acceptedFlags`: corrija a chamada, não insista na mesma sintaxe.
- `3` freio de escrita — não é erro. Nada foi gravado; o envelope traz `dryRun:true` e `plan` (pattern + instância + agent) com exatamente o que seria feito. Revise o plano e repita com `--execute`.

Todas as escritas de rota gravam na hora, sem dry-run: `instances routes add`, `instances routes set`, `instances routes remove` e `instances routes restore`. Nessas o freio é você: confira instância, pattern e agent antes de rodar.

Compact mode: `routes list` aceita `--fields a,b,c` (ex.: `--fields pattern,agent,priority`) — use em varredura para não arrastar o objeto inteiro de cada rota.

Help por operação: `ravi routes <op> --help` e `ravi instances routes <op> --help` são enxutos; prefira-os ao help do domínio inteiro.

Checklist antes de responder sobre rotas:

- Tratei exit 3 como freio (revisei o `plan`) e não como falha?
- Consultei `suggestions` do envelope antes de declarar not-found?

## Comandos

### Listar rotas
```bash
ravi instances routes list <name>
```

### Ver detalhes
```bash
ravi instances routes show <name> <pattern>
```

### Adicionar rota
```bash
ravi instances routes add <name> <pattern> <agent>
ravi instances routes add vendas "5511*" vendas-agent --priority 10
ravi instances routes add vendas "group:123456" suporte --policy closed
ravi instances routes add vendas "*" main --channel whatsapp   # só pra um canal
```

Exemplos de padrões:
- `5511*` - Todos com DDD 11
- `*999*` - Números contendo 999
- `group:123456` - Grupo específico do WhatsApp
- `thread:abc123` - Thread específica dentro de um grupo
- `*` - Catch-all (fallback)

### Remover rota (soft-delete, recuperável)
```bash
ravi instances routes remove <name> <pattern>            # soft-delete imediato
ravi instances routes restore <name> <pattern>   # recuperar
ravi instances routes deleted [name]             # ver deletadas
```

### Configurar propriedades
```bash
ravi instances routes set <name> <pattern> <key> <value>
```

Keys disponíveis:
- `agent` - Agent ID alvo
- `priority` - Prioridade (maior = mais prioritário)
- `dmScope` - Escopo de DM (main, per-peer, per-channel-peer, per-account-channel-peer)
- `session` - Nome fixo de sessão (bypassa auto-geração)
- `policy` - Policy override (open, pairing, closed, allowlist)
- `channel` - Limitar a canal específico (whatsapp, telegram, etc). `-` pra limpar.

## Prioridade de Resolução

1. Rota `thread:ID` (mais específica — thread dentro de grupo)
2. Rota `group:ID` ou padrão de grupo
3. Rota por telefone/padrão
4. Mapeamento agent da instância (`ravi instances set <name> agent <agent>`)
5. Agent default

Dentro do mesmo nível: rotas com `channel` específico ganham de rotas sem channel, depois desempata por `priority` DESC.

## Herança de Policy

```
route.policy → instance.dmPolicy/groupPolicy → "open"
```

## Exemplos

Rotear grupo para agent especializado:
```bash
ravi instances routes add main "group:120363123456789" projeto-x
```

Rotear thread específica dentro de um grupo:
```bash
ravi instances routes add main "thread:msg-abc123" suporte-vip
```

Rotear todos de SP para agent:
```bash
ravi instances routes add main "5511*" vendas
```

Definir política restrita em rota específica:
```bash
ravi instances routes set main "group:123456" policy closed
```

Definir fallback:
```bash
ravi instances routes add main "*" main
```

## Route vs Attach

Route e attach (`sessions/attach`) operam em camadas diferentes — confundi-las leva a comportamento inesperado.

| Camada | Define | Resultado |
|--------|--------|-----------|
| **Route** | Qual *agent* atende o chat | matchRoute escolhe agent, session_key é derivado de (agent, channel, instance, dmScope, peer). Cada combinação vira sessão própria. |
| **Attach** (`sessions attach`) | Qual chat fica ligado a uma sessão já escolhida | Seleciona output target da sessão e cria subscription para o chat, mas não cria nem corrige route. |

**Regra crítica:** `sessions attach` pressupõe que o chat já está chegando no agent correto. Se a rota ainda aponta para outro agent, para o default da instância, ou não existe, configure `ravi instances routes add` primeiro. Para usar uma sessão canônica específica desde a route, use `--session <name>`.

```bash
# Chat novo que deve ir para agent dev e sessão dev
ravi instances routes add main "group:<id>" dev --session dev --priority 10

# Depois, se necessário, ajustar fala/output da sessão no chat
ravi sessions attach dev --chat <chat-id> --reason "unificar chat na sessão dev"
```

**Cuidado com a interação:**

- Se um chat tem subscription ativa (atachado a sessão X), o consumer **ignora** o agent escolhido pela route e dispatcha pra sessão X. A route não troca o destino sozinha.
- Inbound-route bookkeeping pode criar subscription, mas não deve mudar o output target escolhido por `sessions attach`.
- `routes add` faz cleanup automático de sessões conflitantes (apaga sessão paralela do agent antigo e libera o chat). Quando isso roda, a próxima inbound segue a nova route normalmente.
- `routes add ... --session <name>` (redirect estático) força a sessão alvo e cria subscription automaticamente — é o caminho certo quando o requisito já é "este chat deve cair nesta sessão".

**Quando usar cada um:**

- "Quero outro agent atendendo esse chat, com histórico próprio" → `routes add`
- "Quero a MESMA sessão em um chat cuja route já está correta" → `sessions attach`
- "Quero a MESMA sessão em um chat novo ou com route errada" → `routes add ... --session <name>` e depois `sessions attach` apenas se precisar ajustar fala/output

Focus foi removido: `attach` é o primitive que escolhe o chat de output da sessão; não é substituto de route. Ver skill `ravi-system:sessions` (seção Attach) pras receitas práticas e diagrama de fluxo.

Para gerenciar contacts: use a skill `ravi-system:contacts`

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.