<!-- #10Dobro_Brain #Ctx_NexusJuris #Ctx_Hermes #Ctx_Instalador -->
# Instalador do escritório de IA no modelo Nexus Juris (para o seu agente de código executar)

> Nexus Juris é um produto Ben-Hur Real & 10dobro Prod. Base técnica: **Hermes Agent**, da Nous Research (código aberto, licença MIT): https://github.com/NousResearch/hermes-agent
> Repositório oficial (versão mais recente, dúvidas e sugestões): https://github.com/desdobroprod-eng/nexus-juris-agente-juridico
> Versão deste instalador: 1.0.0 (07/11/2026). Testado com Hermes Agent v0.23.0 no macOS (Apple Silicon).
> Este arquivo descreve a montagem de um sistema. Ele não é consultoria jurídica e o sistema montado não substitui o advogado.

---

## Para quem é

Para o advogado ou escritório que quer montar, no próprio computador ou servidor, uma central de agentes de IA organizada como o Nexus Juris: um coordenador, uma etapa de proteção de dados (LGPD), especialistas por área do Direito, auditoria cruzada e painel de tarefas.

**Como usar, em uma frase:** abra uma pasta vazia, coloque este arquivo dentro, abra seu agente de código (Claude Code, Codex, Antigravity, OpenCode, Cursor ou outro) nessa pasta e escreva: *"Leia INSTALAR-NEXUS-JURIS-AGENTE.md e execute a instalação, etapa por etapa."*

O que você, advogado, faz: responde às perguntas da entrevista, preenche as chaves no arquivo `.env` quando o agente pedir e aprova as ações que o agente disser que precisam de aprovação. O resto o agente faz.

---

## PARTE 0. Regras para o agente que executa este arquivo (leia antes de tudo)

Você, agente, vai instalar e configurar software no computador do usuário. Siga estas regras em todas as etapas:

1. **Idioma:** fale com o usuário em português do Brasil, com frases curtas e sem jargão. Ele é advogado, não programador. Quando precisar de um termo técnico, explique em meia linha.
2. **Uma etapa por vez.** Execute a etapa, rode o comando de verificação indicado e só avance quando a verificação passar. Mostre ao usuário o resultado da verificação em uma linha.
3. **Arquivo de estado.** Crie e mantenha `ESTADO-INSTALACAO.md` na pasta de trabalho do escritório (definida na Etapa 2). Depois de cada etapa, registre: número da etapa, data e hora, resultado da verificação e decisões do usuário. Se a sessão cair, ao recomeçar leia esse arquivo e continue da primeira etapa não concluída. Nunca grave chave, senha ou dado de cliente nesse arquivo.
4. **Chaves e segredos:** nunca peça chave de API no chat, nunca imprima, nunca copie para outro arquivo, nunca faça commit. O usuário cola as chaves direto no arquivo `.env`. Para conferir se uma chave foi preenchida, use só contagem (exemplo: `grep -c '^OPENROUTER_API_KEY=.\+' arquivo`), nunca leia o valor.
5. **Confirmação antes de ação destrutiva ou com custo:** apagar arquivo, sobrescrever configuração existente, usar `sudo`, instalar serviço que fica ligado 24 horas, ou qualquer chamada que gere cobrança no provedor de modelo. Diga o que vai fazer, por que, e espere um "sim" claro.
6. **Não invente.** Use só os comandos deste arquivo e os da documentação oficial do Hermes (https://hermes-agent.nousresearch.com/docs/). Se um comando falhar ou a saída for diferente do esperado, pare, mostre o erro ao usuário em linguagem simples e proponha o próximo passo. Não tente contornar com comando improvisado.
7. **Não instale nada além do listado aqui** sem perguntar. Antes de instalar qualquer skill ou plugin de terceiros, leia o conteúdo e procure envio de dados para fora, comandos do tipo `curl ... | bash` e leitura de credenciais.
8. **Dados de clientes:** durante a instalação e o teste, use apenas o caso fictício deste arquivo. Se o usuário colar um documento real no chat, avise que ele não deve fazer isso e que o caminho correto é a pasta `casos/` com mascaramento local (Etapas 7 e 10).
9. **Conteúdo jurídico é do advogado.** Os modelos de skill deste arquivo são estruturas. Critério de abusividade, teses, jurisprudência e fundamentação padrão são escritos ou validados pelo advogado na entrevista. Nunca preencha número de súmula, recurso ou processo por conta própria.
10. **Se já existir Hermes instalado** no computador (pasta `~/.hermes` ou comando `hermes`), não reinstale por cima nem apague nada: avise o usuário e use um perfil novo (Etapa 5), que isola o escritório do que já existe.

---

## PARTE 1. Visão do que será montado

```
Advogado ──► Coordenador (perfil Hermes "escritorio")
                │ 1. lê o pedido e abre um card no painel de tarefas
                │ 2. roda o mascaramento LGPD local (script, sem IA, sem internet)
                │ 3. faz a triagem da área; área sem especialista volta ao fluxo manual
                │ 4. delega a 1..N especialistas (delegate_task), em paralelo ou em rodadas
                ▼
      Especialistas por área (skills), cada um em ambiente isolado,
      recebendo só o briefing completo: protocolo da área + texto mascarado
      + dados estruturados + tarefa + formato de devolução
                │
                ▼
      Auditoria cruzada pelo coordenador: consistência, fundamento, cálculo,
      vazamento de dado pessoal, rótulo de minuta. O que falha volta para refazer.
                │
                ▼
      Minuta única "MINUTA · REQUER REVISÃO DE ADVOGADO" ──► o advogado revisa, assina e protocola
```

Princípios que o sistema montado segue (iguais aos do Nexus Juris):

- **Um único ponto de entrada.** O advogado fala sempre com o coordenador; não escolhe especialista.
- **Modelo em estrela.** Especialistas não conversam entre si. Tudo passa pelo coordenador, o que deixa cada resultado rastreável.
- **Ambiente isolado.** No Hermes, cada subagente criado por `delegate_task` começa uma conversa nova e só sabe o que o coordenador escreve em `goal` e `context` (documentação oficial: https://hermes-agent.nousresearch.com/docs/user-guide/features/delegation).
- **Briefing completo e devolução padronizada** (seções fixas, ver Etapa 8).
- **Nada sem fonte.** Precedente que precisa de conferência sai marcado como **[CONFIRMAR]**. Todo número tem **memória de cálculo** com fonte oficial e período da contratação.
- **O advogado decide.** Toda saída leva o rótulo **MINUTA · REQUER REVISÃO DE ADVOGADO**.

### Por que o Hermes como base (harness)

O Hermes Agent é um agente de IA de código aberto (MIT) da Nous Research, que roda no seu computador ou servidor. Ele já traz o que um escritório de agentes precisa: perfis isolados (`hermes profile`), skills no padrão aberto agentskills.io (arquivos `SKILL.md`), delegação a subagentes com contexto isolado (`delegate_task`), painel de tarefas (Kanban), memória, conexão com servidores MCP e escolha livre do provedor de modelo (OpenRouter, Anthropic, OpenAI, Nous Portal e outros). O Nexus Juris usa o Hermes como harness desde agosto de 2026.

---

## PARTE 2. Etapas de instalação

### Etapa 1. Detectar o ambiente

**1.0 Versão do instalador.** Antes de tudo, confira se existe versão mais nova deste arquivo (consulta pública, sem login e sem custo):

```bash
curl -fsSL https://api.github.com/repos/desdobroprod-eng/nexus-juris-agente-juridico/releases/latest | python3 -c "import json,sys; print(json.load(sys.stdin).get('tag_name',''))"
```

Esta é a versão `v1.0.0`. Se o resultado for maior, diga ao usuário que há versão nova e mostre o link https://github.com/desdobroprod-eng/nexus-juris-agente-juridico/releases/latest; ele decide se baixa a nova antes de seguir. Não baixe nem troque o arquivo por conta própria. Se a consulta falhar (sem internet ou limite da API), registre no estado e siga com esta versão.

Depois rode e registre no estado:

```bash
uname -s; uname -m
command -v git && git --version
command -v curl && curl --version | head -1
command -v tar; command -v shasum || command -v sha256sum
command -v python3 && python3 --version
command -v hermes && hermes --version
ls -d ~/.hermes 2>/dev/null && echo "JA EXISTE ~/.hermes"
df -h ~ | tail -1
```

Decisão:

| Resultado | O que fazer |
|---|---|
| macOS (Darwin) | Siga. Se faltar `git`, o macOS oferece instalar as Ferramentas de Linha de Comando (`xcode-select --install`). Peça ao usuário para aceitar a janela. |
| Linux | Siga. Se faltar `git` ou `curl`, peça ao usuário para instalar pelo gerenciador do sistema (exemplo Ubuntu/Debian: `sudo apt install git curl`). Isso usa `sudo`: regra 5. |
| Windows | Recomende o **WSL2 com Ubuntu** e rode este arquivo dentro dele: todos os comandos aqui são de terminal Linux. O Hermes também tem instalador nativo para PowerShell (`iex (irm https://hermes-agent.nousresearch.com/install.ps1)`), mas os scripts deste arquivo foram escritos e testados para macOS/Linux. |
| Menos de 4 GB livres no disco | Pare e avise. A instalação testada ocupou cerca de 2,1 GB. |
| `hermes` já instalado | Regra 10: não reinstale. Pule para a Etapa 4 (verificação) e depois Etapa 5 (perfil novo). |

Verificação: `git`, `curl`, `tar` e utilitário SHA-256 presentes. Python do sistema não é obrigatório para o Hermes (o instalador traz o próprio), mas os scripts do escritório (Etapa 7) usam `python3`; se não houver, use o Python que o instalador do Hermes baixa (no teste ficou em `~/.hermes/tools/python-<versão>/bin/python3`; localize com `ls ~/.hermes/tools/`).

### Etapa 2. Criar a pasta de trabalho do escritório

Pergunte ao usuário onde quer a pasta (sugestão: `~/escritorio-ia`). Depois:

```bash
ESCRITORIO=~/escritorio-ia   # ou o caminho escolhido
mkdir -p "$ESCRITORIO"/{ferramentas,casos,modelos-do-escritorio,saida-teste}
chmod 700 "$ESCRITORIO" "$ESCRITORIO/casos"
touch "$ESCRITORIO/ESTADO-INSTALACAO.md" "$ESCRITORIO/casos/ATIVOS.txt"
```

- `casos/`: uma subpasta por caso (`CASO-0001`, `CASO-0002`...). Só no computador local.
- `modelos-do-escritorio/`: onde o advogado coloca, se quiser, peças-modelo próprias **já sem dados de clientes**.
- `ferramentas/`: scripts locais (mascaramento, indicador oficial, retenção).

Verificação: `ls -la "$ESCRITORIO"` mostra as quatro pastas, `casos` com permissão `drwx------`.

### Etapa 3. Instalar o Hermes pelo método oficial

Antes, leia o script (regra 7) e mostre ao usuário que ele vem do domínio oficial:

```bash
curl -fsSL https://hermes-agent.nousresearch.com/install.sh -o /tmp/hermes-install.sh
less /tmp/hermes-install.sh   # leitura rápida: instala em ~/.hermes e o comando em ~/.local/bin
bash /tmp/hermes-install.sh --help
```

Instale sem o navegador automatizado e sem o controle de computador, que o escritório não precisa (menos download e menos superfície de risco). O modo não interativo pula o assistente de chaves, porque as chaves vão no `.env` (Etapa 6):

```bash
bash /tmp/hermes-install.sh --non-interactive --skip-browser --skip-computer-use
```

O comando de uma linha da documentação oficial é `curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash`; o resultado é o mesmo, a diferença é que aqui o script é lido antes.

O que esperar: baixa o código (cerca de 550 MB), um Python próprio e dependências; leva alguns minutos. Em Linux pode pedir `sudo` para a biblioteca `libatomic` (regra 5: avise e peça ao usuário para digitar a senha ele mesmo). Se der erro, pare e mostre a última parte de `~/.hermes/logs/install.log`.

Depois: `source ~/.zshrc` (macOS) ou `source ~/.bashrc` (Linux), para o terminal achar o comando `hermes`.

### Etapa 4. Verificar a instalação

```bash
hermes --version
hermes doctor
```

Esperado: `hermes --version` mostra a versão (o teste deste arquivo usou `Hermes Agent v0.23.0`). O `hermes doctor` vai listar avisos de ferramentas opcionais (Discord, vídeo, imagem) e dizer que faltam chaves: isso é normal nesta fase. Erro em "Python", "dependencies" ou "config" não é normal: pare e mostre.

### Etapa 5. Criar o perfil do escritório

```bash
hermes profile create escritorio --no-skills --description "Coordenador do escritório: triagem, proteção de dados, delegação a especialistas e auditoria"
hermes profile list
hermes -p escritorio config path
```

`--no-skills` cria o perfil sem o pacote de skills genéricas do Hermes, para o escritório começar enxuto. Pode usar outro nome no lugar de `escritorio`; se usar, troque em todos os comandos.

### Etapa 6. Escolher o provedor, preencher a chave e definir os modelos

Pergunte ao usuário qual provedor ele prefere. Apresente assim:

| Provedor | Variável no `.env` | Onde o advogado obtém a chave | Observação |
|---|---|---|---|
| **OpenRouter** (usado no Nexus Juris) | `OPENROUTER_API_KEY` | https://openrouter.ai/keys (criar conta, adicionar crédito, "Create key") | Uma chave dá acesso a modelos de vários fornecedores; o custo é por uso. |
| Anthropic (Claude) | `ANTHROPIC_API_KEY` | https://console.anthropic.com (API Keys) | |
| OpenAI | `OPENAI_API_KEY` | https://platform.openai.com/api-keys | |
| Nous Portal | sem chave no `.env` | login pelo navegador: `hermes setup --portal` | O próprio usuário roda o comando no terminal dele. |

O `.env` usado é o **do perfil** criado na Etapa 5 (`~/.hermes/profiles/escritorio/.env`), que vale só para ele. Escreva no `.env` do perfil apenas as linhas vazias do provedor escolhido, com comentário:

```bash
cat >> ~/.hermes/profiles/escritorio/.env <<'EOF'

# Chave do provedor de modelo. Cole o valor depois do sinal de igual, sem espaços e sem aspas.
# Nunca envie esta chave por chat, e-mail ou WhatsApp.
OPENROUTER_API_KEY=
EOF
chmod 600 ~/.hermes/profiles/escritorio/.env
```

Diga ao usuário: *"Abra o arquivo `~/.hermes/profiles/escritorio/.env` no editor de texto, cole a chave depois de `OPENROUTER_API_KEY=`, salve e me avise. Não cole a chave aqui no chat."* (No macOS: `open -e ~/.hermes/profiles/escritorio/.env`.)

Verificação, sem ler o valor: `grep -c '^OPENROUTER_API_KEY=.\+' ~/.hermes/profiles/escritorio/.env` deve dar `1`.

Agora configure o modelo. O coordenador faz triagem e conferência (pode ser um modelo mais rápido); os especialistas fazem o trabalho pesado (modelo mais forte), definido em `delegation.model`. Pergunte ao usuário se ele tem preferência; se não tiver, mostre a referência do Nexus Juris: no OpenRouter, uma variante rápida da família DeepSeek para o coordenador e a variante "pro" para os especialistas. **Antes de gravar, confirme que o identificador existe** na lista pública do OpenRouter (não precisa de chave):

```bash
curl -s https://openrouter.ai/api/v1/models | python3 -c "import json,sys; [print(m['id']) for m in json.load(sys.stdin)['data'] if 'deepseek' in m['id']]"
```

Depois grave (troque pelos identificadores confirmados):

```bash
hermes -p escritorio config set model.provider openrouter
hermes -p escritorio config set model.default <ID_DO_MODELO_COORDENADOR>
hermes -p escritorio config set delegation.model <ID_DO_MODELO_ESPECIALISTAS>
hermes -p escritorio config set delegation.max_concurrent_children 3
hermes -p escritorio config get model
hermes -p escritorio config get delegation
```

Não preencha `delegation.provider`: vazio, os especialistas herdam o provedor e a chave do coordenador (lição do Nexus Juris, ver Parte 4).

Verificação (gera uma chamada pequena e paga ao provedor: regra 5, peça o "sim"):

```bash
hermes -p escritorio chat --oneshot -Q -q "Responda apenas: ok"
```

Esperado: `ok`. Se aparecer `No API key found`, a chave não foi salva no `.env` do perfil.

### Etapa 7. Instalar as ferramentas locais do escritório

Grave os três scripts abaixo em `$ESCRITORIO/ferramentas/`, exatamente como estão, e rode os testes de cada um. Eles usam só a biblioteca padrão do Python.

**7.1 `mascarar_lgpd.py`** (mascaramento local, sem internet). Troca CPF, CNPJ, e-mail, telefone, CEP, chassi, placa, RG, número de contrato, endereço, número de processo e nomes próprios por rótulos (`[CPF_1]`, `[PARTE_1]`, `[NOME_2]`...). A tabela de correspondência fica num `.mapa.json` local com permissão restrita e **nunca** vai para a IA. A segunda passada (`--auditar`) procura o que escapou e devolve erro se achar.

```python
#!/usr/bin/env python3
"""Mascaramento local de dados pessoais (LGPD) antes de qualquer analise por IA.

Roda 100% no computador do escritorio, sem internet e sem biblioteca externa.
Uso:
  python3 mascarar_lgpd.py ARQUIVO [--nomes partes.txt] [--saida ARQUIVO_MASCARADO]
  python3 mascarar_lgpd.py --auditar ARQUIVO_MASCARADO
Entrada: .txt ou .md (PDF: converta antes com pdftotext; escaneado: OCR antes).
Saida: texto mascarado + tabela de correspondencia em arquivo separado (.mapa.json),
que fica SO no computador local e nunca vai para a IA.
Limite honesto: regex pega identificadores com formato (CPF, CNPJ, placa...). Nome de
pessoa so e pego pela lista --nomes e por uma heuristica de nomes proprios; por isso
a etapa --auditar existe e o advogado confere a primeira saida de cada tipo de documento.
"""
import json, re, sys, unicodedata
from pathlib import Path

PADROES = [
    # Quando o padrão tem o grupo (?P<v>...), só esse trecho é trocado (o tipo do documento fica legível).
    ("CONTRATO", r"(?i)\b(?:contrato|c[ée]dula|proposta)[^\n\d]{0,40}?(?:n[ºo°.]*|n[uú]mero)\s*[:\s]*(?P<v>[\w./-]*\d[\w./-]*)"),
    ("ENDERECO", r"(?i)(?P<v>\b(?:rua|avenida|av\.|travessa|alameda|rodovia|estrada|pra[çc]a)\s+[^,\n]{2,60},?\s*(?:n[ºo°.]*\s*)?\d{1,5}[^\n,]{0,40})"),
    ("PROCESSO", r"\b\d{7}-?\d{2}\.?\d{4}\.?\d\.?\d{2}\.?\d{4}\b"),
    ("CPF", r"\b\d{3}\.?\d{3}\.?\d{3}-?\d{2}\b"),
    ("CNPJ", r"\b\d{2}\.?\d{3}\.?\d{3}/?\d{4}-?\d{2}\b"),
    ("EMAIL", r"\b[\w.+-]+@[\w-]+\.[\w.-]+\b"),
    ("TELEFONE", r"(?:\+?55\s?)?\(?\b\d{2}\)?\s?9?\d{4}[-\s]?\d{4}\b"),
    ("CEP", r"\b\d{5}-\d{3}\b"),
    ("CHASSI", r"\b[A-HJ-NPR-Z0-9]{17}\b"),
    ("PLACA", r"\b[A-Z]{3}-?\d[A-Z0-9]\d{2}\b"),
    ("RG", r"\b(?:RG|R\.G\.)[:\s]*[\d.\-xX]{5,14}"),
]
# Palavras que comecam com maiuscula mas nao sao nome de pessoa (ajuste na personalizacao).
NAO_NOME = set("""Banco Tribunal Justica Juizo Vara Comarca Estado Uniao Codigo Civil Processo Lei Superior
Supremo Federal Sumula Tema Contrato Clausula Credor Devedor Autor Autora Reu Re Requerente Requerido Exequente
Executado Ministerio Publico Defensoria Brasil Real Reais Excelentissimo Senhor Senhora Doutor Doutora Juiz Juiza
Cedula Credito Bancario Financiamento Veiculo Taxa Juros Media Mercado Central Recurso Especial Agravo Apelacao
Embargos Execucao Monitoria Busca Apreensao Peticao Inicial Habeas Corpus Constituicao Republica Consumidor
Primeira Segunda Terceira Quarta Quinta Sexta Camara Turma Secao Termo Data Valor Parcela Prazo Anexo Documento""".split())
CONECTORES = {"de", "da", "do", "das", "dos", "e"}


def sem_acento(s):
    return "".join(c for c in unicodedata.normalize("NFD", s) if unicodedata.category(c) != "Mn")


def mascarar(texto, nomes=()):
    mapa, cont = {}, {}

    def rotulo(tipo, valor):
        chave = (tipo, valor.strip())
        if chave not in mapa:
            cont[tipo] = cont.get(tipo, 0) + 1
            mapa[chave] = f"[{tipo}_{cont[tipo]}]"
        return mapa[chave]

    # 1) nomes informados pelo advogado (lista local), do mais longo ao mais curto
    for n in sorted({n.strip() for n in nomes if n.strip()}, key=len, reverse=True):
        texto = re.sub(re.escape(n), lambda m: rotulo("PARTE", n), texto, flags=re.I)
    # 2) identificadores com formato
    for tipo, rx in PADROES:
        def troca(m, t=tipo):
            if "v" in m.re.groupindex:
                ini, fim = m.span("v")
                return m.group(0)[:ini - m.start()] + rotulo(t, m.group("v")) + m.group(0)[fim - m.start():]
            return rotulo(t, m.group(0))
        texto = re.sub(rx, troca, texto)
    # 3) heuristica: 2+ palavras capitalizadas seguidas (com de/da/dos) = provavel nome
    palavra = r"[A-ZÀ-Ý][a-zà-ÿ]+"
    rx_nome = rf"\b{palavra}(?:\s+(?:(?:de|da|do|das|dos|e)\s+)?{palavra})+\b"

    def talvez_nome(m):
        partes = [p for p in m.group(0).split() if p not in CONECTORES]
        if any(sem_acento(p) in NAO_NOME for p in partes):
            return m.group(0)
        return rotulo("NOME", m.group(0))

    texto = re.sub(rx_nome, talvez_nome, texto)
    return texto, {v: k[1] for k, v in mapa.items()}


def auditar(texto):
    """Segunda passada: procura o que ainda tem formato de dado pessoal."""
    achados = []
    for tipo, rx in PADROES:
        if tipo in ("CONTRATO", "ENDERECO"):
            continue
        achados += [(tipo, m.group(0)) for m in re.finditer(rx, texto)]
    return achados


def main(a):
    if not a or a[0] in ("-h", "--help"):
        print(__doc__); return 0
    if a[0] == "--auditar":
        achados = auditar(Path(a[1]).read_text(encoding="utf-8"))
        if achados:
            print(f"FALHA: {len(achados)} trecho(s) com formato de dado pessoal: " + ", ".join(t for t, _ in achados))
            return 2  # tipos apenas; o valor nunca e impresso
        print("OK: nenhum identificador com formato de dado pessoal encontrado.")
        return 0
    origem = Path(a[0])
    nomes = []
    if "--nomes" in a:
        nomes = Path(a[a.index("--nomes") + 1]).read_text(encoding="utf-8").splitlines()
    saida = Path(a[a.index("--saida") + 1]) if "--saida" in a else origem.with_suffix(".mascarado.txt")
    if origem.suffix.lower() == ".pdf":
        print("Converta o PDF antes: pdftotext -layout arquivo.pdf arquivo.txt (escaneado: OCR antes)."); return 1
    texto, mapa = mascarar(origem.read_text(encoding="utf-8"), nomes)
    saida.write_text(texto, encoding="utf-8")
    mapa_arq = saida.with_suffix(".mapa.json")
    mapa_arq.write_text(json.dumps(mapa, ensure_ascii=False, indent=1), encoding="utf-8")
    mapa_arq.chmod(0o600)
    resto = auditar(texto)
    print(f"Mascarado: {saida} ({len(mapa)} itens substituidos). Mapa local: {mapa_arq}")
    if resto:
        print(f"ATENCAO: a auditoria achou {len(resto)} trecho(s) suspeito(s); nao envie para analise."); return 2
    return 0


if __name__ == "__main__":
    sys.exit(main(sys.argv[1:]))
```

**7.2 `indicador_bacen.py`** (série oficial do Banco Central no mês da contratação, para a memória de cálculo).

```python
#!/usr/bin/env python3
"""Consulta uma serie publica do Banco Central (SGS) no MES da contratacao.

Uso: python3 indicador_bacen.py SERIE MM/AAAA
Exemplo (taxa media mensal de juros, PF, aquisicao de veiculos): python3 indicador_bacen.py 25471 03/2021
Fonte oficial: https://api.bcb.gov.br/dados/serie/bcdata.sgs.{serie}/dados (dado publico, sem chave).
Imprime JSON com serie, periodo, valor e URL consultada, para entrar na memoria de calculo.
O codigo da serie certa para cada tipo de contrato deve ser conferido pelo advogado no SGS
(https://www3.bcb.gov.br/sgspub). Este script nao escolhe a serie por voce.
"""
import calendar, json, subprocess, sys, urllib.error, urllib.request


def consultar(serie, mes_ano):
    mes, ano = (int(x) for x in mes_ano.split("/"))
    ultimo = calendar.monthrange(ano, mes)[1]
    url = (f"https://api.bcb.gov.br/dados/serie/bcdata.sgs.{int(serie)}/dados?formato=json"
           f"&dataInicial=01/{mes:02d}/{ano}&dataFinal={ultimo:02d}/{mes:02d}/{ano}")
    try:
        with urllib.request.urlopen(url, timeout=30) as r:
            dados = json.load(r)
    except urllib.error.URLError:
        # Alguns Pythons (ex.: instalador do python.org no macOS) vêm sem certificados raiz.
        # Em vez de desligar a verificação TLS, usa o curl do sistema, que valida pelo cofre do sistema.
        r = subprocess.run(["curl", "-fsS", "-m", "30", url], capture_output=True, text=True)
        dados = json.loads(r.stdout) if r.returncode == 0 and r.stdout.strip() else []
    if not dados:
        raise SystemExit(f"Sem dado da serie {serie} em {mes:02d}/{ano}. Nao estime: informe ao advogado.")
    return {"serie": int(serie), "periodo": f"{mes:02d}/{ano}", "valor": dados[0]["valor"], "fonte": url}


if __name__ == "__main__":
    if len(sys.argv) != 3:
        print(__doc__); sys.exit(1)
    print(json.dumps(consultar(sys.argv[1], sys.argv[2]), ensure_ascii=False))
```

**7.3 `retencao_casos.py`** (política de retenção: simula por padrão; apagar só com `--apagar` e aprovação do advogado).

```python
#!/usr/bin/env python3
"""Politica de retencao: lista (e, com --apagar, remove) pastas de caso sem uso ha mais de N dias.

Uso: python3 retencao_casos.py PASTA_CASOS DIAS [--apagar]
Sem --apagar so mostra o que sairia (simulacao). Pastas listadas em PASTA_CASOS/ATIVOS.txt
(um codigo de caso por linha) nunca sao apagadas. Apagar e irreversivel: o advogado decide.
"""
import shutil, sys, time
from pathlib import Path


def candidatas(raiz, dias):
    raiz = Path(raiz)
    ativos_arq = raiz / "ATIVOS.txt"
    ativos = set(ativos_arq.read_text(encoding="utf-8").split()) if ativos_arq.exists() else set()
    limite = time.time() - dias * 86400
    for p in sorted(raiz.iterdir()):
        if not p.is_dir() or p.name in ativos:
            continue
        mais_recente = max([f.stat().st_mtime for f in p.rglob("*")] + [p.stat().st_mtime])
        if mais_recente < limite:
            yield p


if __name__ == "__main__":
    if len(sys.argv) < 3:
        print(__doc__); sys.exit(1)
    lista = list(candidatas(sys.argv[1], int(sys.argv[2])))
    apagar = "--apagar" in sys.argv
    for p in lista:
        print(("APAGADO " if apagar else "sairia: ") + p.name)
        if apagar:
            shutil.rmtree(p)
    print(f"{len(lista)} pasta(s) {'apagada(s)' if apagar else 'na simulacao'}.")
```

Testes (Etapa 7 só termina com os três passando):

```bash
cd "$ESCRITORIO/ferramentas"
python3 mascarar_lgpd.py --help | head -3
python3 indicador_bacen.py 25471 03/2021      # esperado: valor "1.58" e a URL da fonte
python3 retencao_casos.py "$ESCRITORIO/casos" 90   # esperado: "0 pasta(s) na simulacao."
```

A série 25471 do exemplo é a usada pelo Nexus Juris para taxa média mensal de financiamento de veículo (pessoa física). Para outros contratos, o advogado confere o código no SGS do Banco Central (https://www3.bcb.gov.br/sgspub).

PDF: para ler PDF com texto, use `pdftotext -layout arquivo.pdf arquivo.txt` (pacote poppler; no macOS `brew install poppler`, pergunte antes). PDF escaneado precisa de OCR antes (exemplo: tesseract com idioma `por`). Se o usuário não quiser instalar nada agora, registre no estado: "entrada só em .txt/.docx convertido".

**Mascaramento mais forte (opcional):** o Nexus Juris usa Microsoft Presidio com o modelo de português `pt_core_news_lg` do spaCy e reconhecedores próprios, rodando como serviço local. É mais preciso para nomes, mas o download do modelo de linguagem é grande. Só ofereça se o usuário pedir.

### Etapa 8. Montar o escritório: coordenador, proteção de dados, auditoria e painel

**8.1 Coordenador.** Substitua o `SOUL.md` do perfil (identidade do agente) pelo conteúdo abaixo. Antes, faça cópia: `cp ~/.hermes/profiles/escritorio/SOUL.md ~/.hermes/profiles/escritorio/SOUL.original.md`. Troque `{ESCRITORIO}` pelo caminho absoluto da pasta e `{AREAS}` pela lista de áreas que a entrevista (Etapa 9) definir.

```markdown
# Coordenador do escritório

Responda sempre em português do Brasil.

Você é o coordenador da central de inteligência jurídica deste escritório. É o único ponto de contato do advogado. Você faz a triagem, prepara o briefing, delega aos especialistas, audita e consolida. Você não analisa contrato, não calcula e não cria tese no seu próprio raciocínio: isso é sempre feito por especialista via `delegate_task`.

## Áreas com especialista digital
{AREAS}
Área fora desta lista: diga com clareza que ainda não há especialista digital para ela e devolva ao fluxo manual do escritório. Não improvise.

## Fluxo obrigatório, nesta ordem
1. **Painel.** Abra um card no Kanban com título "CASO-NNNN · tipo de tarefa" e, no corpo, quem pediu e a etapa atual. Nunca coloque nome, CPF, endereço ou outro dado pessoal no card. Atualize o card a cada etapa.
2. **Proteção de dados.** O documento do caso fica em `{ESCRITORIO}/casos/CASO-NNNN/`. Rode no terminal:
   `python3 {ESCRITORIO}/ferramentas/mascarar_lgpd.py {ESCRITORIO}/casos/CASO-NNNN/original.txt --nomes {ESCRITORIO}/casos/CASO-NNNN/partes.txt`
   e depois `--auditar` no arquivo `.mascarado.txt`. Se a auditoria falhar, pare e avise o advogado. Daqui em diante use somente o texto mascarado. Nunca abra o `.mapa.json`. Se o advogado colar texto com dado pessoal no chat, peça que salve o documento na pasta do caso em vez disso.
3. **Triagem.** Identifique a área e, dentro dela, quais especialistas o caso precisa (pode ser mais de um).
4. **Briefing e delegação.** Para cada especialista, chame `delegate_task` com `role: leaf`. Em `context`, inclua: o protocolo completo da skill da área (carregue com `skill_view`), a skill `protocolo-qualidade-escritorio`, o texto mascarado, os dados estruturados (datas, valores, taxas, partes só pelo papel), a tarefa específica e o formato de devolução abaixo. O subagente não vê esta conversa: tudo que ele precisa vai no `context`. Tarefas independentes rodam em paralelo (array `tasks`); tarefas que dependem de outra esperam o resultado conferido.
5. **Auditoria cruzada.** Aplique a skill `auditoria-cruzada-escritorio`. O que não passa volta ao especialista com o motivo. Divergência entre especialistas não é resolvida por você: fica registrada para o advogado decidir.
6. **Entrega.** Um único documento, com o rótulo **MINUTA · REQUER REVISÃO DE ADVOGADO** no topo, nota de confiança de cada parte (alta, média ou baixa, com motivo) e próximo passo sugerido.

## Formato de devolução exigido de todo especialista
Dados usados · Achados · Fundamentos (precedente a conferir marcado [CONFIRMAR]) · Memória de cálculo (quando houver, com fórmula, fonte oficial e período) · Nível de confiança · Próximo passo.

## Você nunca
- remove o rótulo de minuta;
- inventa número de súmula, recurso, processo ou relator;
- completa fundamento que o especialista não deu;
- afirma que algo foi feito sem evidência (sem verificação, diga "não verifiquei");
- protocola: assinatura e envio são do advogado, com o certificado digital dele.
```

**8.2 Skills transversais.** Crie em `~/.hermes/profiles/escritorio/skills/juridico/`:

`preparacao-lgpd-escritorio/SKILL.md`

```markdown
---
name: preparacao-lgpd-escritorio
description: Preparação do documento e mascaramento de dados pessoais (LGPD) antes de qualquer análise. Use sempre que um caso novo chegar.
version: 1.0.0
metadata:
  hermes:
    tags: [juridico, lgpd, preparacao]
    category: juridico
---
# Preparação e proteção de dados
## Quando usar
Todo caso novo, antes de qualquer delegação.
## Procedimento
1. Confirme que o documento está em texto (.txt). PDF com texto: `pdftotext -layout`. Escaneado: OCR antes. Confira contra o original os números críticos (valores, taxas, parcelas, datas).
2. Peça ao advogado o arquivo `partes.txt` do caso (nomes das partes, um por linha), criado por ele na pasta do caso.
3. Rode `mascarar_lgpd.py` e depois `--auditar`. Falha na auditoria = parar e avisar.
4. Entregue ao coordenador só o texto mascarado e os dados estruturados.
## Nunca
Interpretar o caso. Ler ou enviar o `.mapa.json`.
## Verificação
`--auditar` devolveu OK e o texto não contém nenhum nome de `partes.txt`.
```

`auditoria-cruzada-escritorio/SKILL.md`

```markdown
---
name: auditoria-cruzada-escritorio
description: Checklist de conferência do coordenador antes de entregar qualquer minuta. Use depois que os especialistas devolverem.
version: 1.0.0
metadata:
  hermes:
    tags: [juridico, auditoria, qualidade]
    category: juridico
---
# Auditoria cruzada
## Checklist (todos os itens, em ordem)
1. **Consistência:** os especialistas se contradizem? Se sim, registre a divergência no documento para o advogado decidir.
2. **Fundamentação:** toda conclusão tem base? Sem base, volta ao especialista com o motivo.
3. **Cálculo:** todo número tem memória de cálculo, fórmula explícita, fonte oficial e período da contratação (não a data de hoje)?
4. **Precedentes:** o que não foi conferido está marcado [CONFIRMAR]? Algum número de súmula ou recurso parece inventado? Se sim, marque e sinalize.
5. **Privacidade:** rode `mascarar_lgpd.py --auditar` sobre o texto final. Dado pessoal no resultado = parar e sinalizar.
6. **Rótulo:** "MINUTA · REQUER REVISÃO DE ADVOGADO" presente no topo.
7. **Consolidação:** um único documento, com nota de confiança por parte e próximo passo.
```

`protocolo-qualidade-escritorio/SKILL.md`: crie com o mesmo cabeçalho (`name: protocolo-qualidade-escritorio`, descrição "Regras de qualidade de peças do escritório; vai no briefing de todo especialista") e estas regras de partida, que o advogado ajusta na entrevista:

```markdown
1. Hipótese não vira fato: o que o documento não comprova é escrito como "a apurar" ou "cabe à parte contrária demonstrar".
2. Todo percentual vem com numerador e denominador, e a conta é conferida.
3. Tese principal, subsidiária e descartada ficam separadas, com o motivo do descarte.
4. Jurisprudência em três níveis: confirmada (número verificável), provável ([CONFIRMAR]) e tendência (linguagem genérica, sem número).
5. Índice ou taxa oficial sempre do período do contrato, com a URL da fonte.
6. A nota de confiança é para o advogado e não aparece no texto da peça.
7. [Regras próprias do escritório, definidas na entrevista]
```

**8.3 Painel de tarefas.**

```bash
hermes -p escritorio kanban init
hermes -p escritorio kanban create "CASO-0000 · teste do painel" --body "solicitante: instalação"
hermes -p escritorio kanban list
```

Para ver o painel no navegador: `hermes dashboard` (aba Kanban). Mantenha o painel só no computador local; não exponha na rede sem proteção (a documentação oficial alerta para não usar `0.0.0.0` em máquina compartilhada). Observação: no Hermes, tarefa com responsável (`--assignee`) é executada automaticamente pelo perfil indicado quando o gateway está ligado. Para usar o painel só como acompanhamento, crie os cards sem responsável e registre o solicitante no corpo. O painel do Hermes é um só para todos os perfis do computador: se já houver outros perfis em uso, use o prefixo `CASO-` para filtrar os cards do escritório.

Verificação da Etapa 8: `hermes -p escritorio skills list` mostra as três skills na categoria `juridico`, e `kanban list` mostra o card de teste.

### Etapa 9. Entrevista de personalização e criação dos especialistas

Faça as perguntas abaixo **de uma vez só**, numa mensagem organizada, e espere as respostas. O que for dúvida técnica você resolve e registra como premissa no estado; não volte com pergunta nova.

1. Nome do escritório e cidade/estado de atuação.
2. Áreas em que quer especialista digital agora (mostre a lista de referência da tabela abaixo; ele pode escolher, tirar ou acrescentar).
3. Para cada área escolhida: lado em que costuma atuar (autor, réu, credor, devedor, defesa), tribunais e sistemas de processo eletrônico que usa (exemplo: PJe, eproc, e-SAJ) e tipo de peça mais frequente.
4. Estilo de peça: tamanho preferido, tom, se cita doutrina, formato de pedidos, endereçamento padrão.
5. Modelos próprios: ele tem peças-modelo que quer usar como referência? Se sim, peça que coloque em `modelos-do-escritorio/` **já sem dados de clientes**; você confere com `mascarar_lgpd.py --auditar` antes de usar.
6. Regras de qualidade próprias (o que ele sempre corrige nas minutas de estagiário ou de IA).
7. Prazo de retenção dos documentos de casos encerrados (em dias) e quem pode aprovar a limpeza.
8. Quem usa o sistema (nomes dos advogados para o campo "solicitante" do painel).

**Lista de referência (as 11 áreas que o Nexus Juris cobre hoje):**

| Skill sugerida | Área | O especialista faz | Dados a extrair | Fonte oficial que costuma usar |
|---|---|---|---|---|
| `contrato-financiamento-veiculo` | Contrato de financiamento de veículo | Análise de cláusulas e sinais de alerta | partes pelo papel, valor, taxa, prazo, encargos, data de assinatura | Banco Central (SGS) |
| `taxa-juros-contrato` | Taxa de juros | Comparação com a média oficial do período, desvio percentual, projeção do excesso | taxa contratada, data, valor, prazo, sistema de amortização | Banco Central (SGS) |
| `busca-apreensao` | Busca e apreensão | Análise da mora, teses de defesa, purgação, contestação | notificação, datas, parcelas pagas, valor do débito | |
| `execucao-bancaria` | Execução bancária | Escolha da via (embargos ou exceção), excesso de execução, minuta | título, valores, encargos, datas | |
| `revisional-bancaria` | Revisional bancária | Teses, pedidos, tutela, valor da causa, petição inicial | achados já auditados das áreas de contrato e taxa | |
| `monitoria-titulo` | Monitória e execução de título | Escolha da via, cálculo e peça (credor ou devedor) | título ou prova escrita, valores, vencimentos | índice de correção definido pelo advogado |
| `peticionamento` | Peticionamento | Estrutura técnica de qualquer peça, com checklist do CPC | tipo de peça, juízo, partes pelo papel | |
| `preparacao-protocolo` | Protocolo eletrônico | Confere juízo, classe, assunto, valor da causa, anexos citados x anexados; índice e pendências | peça pronta, lista de documentos | |
| `penal` | Penal | Peça adequada à fase do processo, teses defensivas, HC com liminar | fase, imputação, datas, medidas | |
| `hc-cannabis-medicinal` | HC para cannabis medicinal | Tese de saúde e regulação sanitária, com proteção reforçada de dado médico | prescrição e laudo (mascarados), autorização sanitária | |
| `direito-digital-redes` | Direito digital (redes sociais) | Restrição ou suspensão de conta: provas, tutela, indenização | datas, avisos da plataforma, prejuízo alegado | |

**Para cada área escolhida, crie** `~/.hermes/profiles/escritorio/skills/juridico/<skill>/SKILL.md` com este modelo, preenchido com as respostas da entrevista (o que ele não respondeu fica como `[A DEFINIR PELO ADVOGADO]`, nunca inventado):

```markdown
---
name: <skill>
description: Especialista em <área>. Use quando o coordenador delegar <tipo de tarefa> desta área.
version: 1.0.0
metadata:
  hermes:
    tags: [juridico, <area-curta>]
    category: juridico
---
# Especialista: <área>
**Escritório:** <nome> · **Atuação:** <lado> · **Tribunais/sistemas:** <lista>
**Status do conteúdo jurídico:** estrutura v1, aguardando validação do advogado responsável.

## Quando usar
<gatilhos: tipos de documento e de pedido que chegam a esta área>

## Entrada esperada (vem no briefing do coordenador)
Texto já mascarado · dados estruturados: <lista da tabela> · tarefa específica.

## Procedimento
1. Extraia os dados da lista acima e confira cada número contra o texto.
2. <passos de análise da área, escritos ou aprovados pelo advogado>
3. Quando houver índice ou taxa: consulte a fonte oficial no mês da contratação (`indicador_bacen.py <serie> MM/AAAA` quando for série do Banco Central) e mostre a memória de cálculo com fórmula.
4. Aplique o `protocolo-qualidade-escritorio`.

## Critérios e fundamentação padrão do escritório
[A DEFINIR PELO ADVOGADO]: critérios, teses aceitas e descartadas, fundamentação de costume.

## Estilo da peça
<tamanho, tom, doutrina sim/não, formato dos pedidos, endereçamento>
Modelos de referência: `<caminho em modelos-do-escritorio/>` (se houver).

## Formato de devolução (fixo)
Dados usados · Achados · Fundamentos ([CONFIRMAR] no que precisa conferência) · Memória de cálculo · Nível de confiança · Próximo passo.

## Quando devolver ao coordenador sem responder
Documento ilegível, dado essencial faltando, caso fora desta área, dúvida que só o advogado resolve.
```

Depois de criar as skills, atualize `{AREAS}` no `SOUL.md` (Etapa 8.1) com a lista final. Verificação: `hermes -p escritorio skills list` mostra uma skill por área escolhida, e `grep -L "A DEFINIR PELO ADVOGADO" ~/.hermes/profiles/escritorio/skills/juridico/*/SKILL.md` lista as que já foram completadas. Mostre ao advogado quais ainda têm campo a definir: ele completa quando quiser, e o sistema já funciona com a estrutura.

### Etapa 10. Teste de ponta a ponta com caso fictício

Crie o caso de teste (100% fictício):

```bash
mkdir -p "$ESCRITORIO/casos/CASO-0000"
cat > "$ESCRITORIO/casos/CASO-0000/original.txt" <<'EOF'
CÉDULA DE CRÉDITO BANCÁRIO Nº 0099887766-5
Emitente: Joana Ficticia de Souza Teste, CPF 123.456.789-09, residente na Rua das Palmeiras Imaginárias, 1234, apto 12, CEP 65000-123, telefone (98) 99876-5432, e-mail joana.teste@exemplo.com.
Credor: Banco Exemplo S.A., CNPJ 12.345.678/0001-90.
Veículo: placa ABC1D23, chassi 9BWZZZ377VT004251.
Valor financiado: R$ 50.000,00. Taxa contratada: 2,10% a.m. Data de assinatura: 15/03/2021. Prazo: 48 parcelas.
Avalista: Carlos Inventado Pereira.
EOF
echo "Joana Ficticia de Souza Teste" > "$ESCRITORIO/casos/CASO-0000/partes.txt"
cd "$ESCRITORIO/ferramentas"
python3 mascarar_lgpd.py ../casos/CASO-0000/original.txt --nomes ../casos/CASO-0000/partes.txt
python3 mascarar_lgpd.py --auditar ../casos/CASO-0000/original.mascarado.txt
grep -c "Joana\|123.456\|ABC1D23\|Carlos\|99876" ../casos/CASO-0000/original.mascarado.txt   # esperado: 0
```

Esperado no texto mascarado: `CÉDULA DE CRÉDITO BANCÁRIO Nº [CONTRATO_1]`, `[PARTE_1]`, `[CPF_1]`, `[ENDERECO_1]`, `[PLACA_1]`, `[CHASSI_1]`, `[NOME_...]` para o avalista, e os valores, a taxa e a data intactos.

Depois, com o "sim" do usuário (há custo de modelo), rode o fluxo completo:

```bash
hermes -p escritorio chat -q "Caso CASO-0000 (fictício, teste de instalação). O documento está em $ESCRITORIO/casos/CASO-0000/original.txt. Analise o contrato e calcule a taxa frente à média oficial do período. Siga o fluxo do escritório."
```

Confira com o usuário, item por item, e registre no estado:

- [ ] Card criado no painel, sem dado pessoal.
- [ ] O coordenador rodou o mascaramento e a auditoria antes de delegar.
- [ ] Delegou a dois especialistas (contrato e taxa), em paralelo.
- [ ] Memória de cálculo cita a série 25471 de 03/2021 (1,58% a.m.) com a URL da fonte.
- [ ] Precedente sem conferência marcado [CONFIRMAR]; nenhum número de súmula ou recurso aparece sem essa marca.
- [ ] Rótulo "MINUTA · REQUER REVISÃO DE ADVOGADO" no topo.
- [ ] Nenhum nome, CPF, placa ou endereço do caso na resposta.

Se algum item falhar, ajuste o `SOUL.md` ou a skill correspondente e rode de novo. Ao final, mova o card de teste para concluído e apague a pasta `CASO-0000` só com o "sim" do usuário.

### Etapa 11. Checklist de segurança e LGPD (mostre ao advogado e registre as respostas)

- [ ] Documentos de casos só em `$ESCRITORIO/casos/`, no computador local, com permissão restrita. Disco do computador criptografado (macOS: FileVault; Windows: BitLocker; Linux: LUKS).
- [ ] Nenhum documento bruto é colado no chat: só o texto mascarado sai do computador para o provedor de modelo.
- [ ] Ciência de que o texto mascarado é processado pelo provedor escolhido (fora do escritório). O escritório confirma que isso é compatível com sua política de sigilo e com os contratos com clientes. (No Nexus Juris este item é tratado como decisão formal de governança.)
- [ ] Retenção definida: `python3 retencao_casos.py "$ESCRITORIO/casos" <DIAS>` (simulação) rodado periodicamente; apagar com `--apagar` só com aprovação. Casos ativos listados em `casos/ATIVOS.txt`.
- [ ] Chaves só no `.env` do perfil (permissão 600), fora de qualquer repositório ou nuvem de arquivos compartilhada.
- [ ] Painel e dashboard só acessíveis localmente.
- [ ] Primeiras minutas de cada área revisadas com atenção redobrada, inclusive o mascaramento (o mascaramento por padrão de texto tem limite: nome escrito de forma incomum pode escapar; por isso existem `partes.txt` e a auditoria).
- [ ] Conteúdo jurídico das skills validado pelo advogado responsável antes do uso com cliente real.

### Etapa 12. Encerramento

Registre no estado: versão do Hermes, perfil, modelos, áreas criadas, skills com campo a definir, resultado do teste e itens do checklist em aberto. Diga ao usuário, em até cinco linhas, como usar no dia a dia:

1. Crie a pasta do caso em `casos/CASO-NNNN/`, salve o documento como `original.txt` e os nomes das partes em `partes.txt`.
2. Abra o terminal e rode `hermes -p escritorio` (ou o atalho `escritorio`, criado pelo perfil).
3. Descreva o pedido e informe o código do caso.
4. Revise a minuta; a decisão, a assinatura e o protocolo são seus.

Atualizações do Hermes: `hermes update --check` mostra se há versão nova; `hermes update --backup` atualiza com cópia de segurança. As skills e o `SOUL.md` do perfil são do escritório e não são sobrescritos.

Atualizações deste instalador: as versões novas (correções, áreas novas, ajustes para versões novas do Hermes) saem em https://github.com/desdobroprod-eng/nexus-juris-agente-juridico/releases. Para conferir depois, rode de novo o comando da Etapa 1.0. O que mudou em cada versão fica no `CHANGELOG.md` do repositório.

### Etapa 13. Acompanhar o projeto (opcional, só com o "sim" do usuário)

Faça esta pergunta uma única vez, com estas palavras, e respeite a resposta:

*"Quer deixar uma estrela no repositório do instalador no GitHub para acompanhar as atualizações? É opcional e não muda nada no seu escritório."*

- **Se ele disser não, ou não responder:** agradeça e encerre. Não pergunte de novo.
- **Se ele disser sim:** confira se o GitHub CLI está instalado e com login feito por ele mesmo:

```bash
command -v gh && gh auth status
```

  Se os dois funcionarem, dê a estrela e confira:

```bash
gh api -X PUT user/starred/desdobroprod-eng/nexus-juris-agente-juridico && gh api user/starred/desdobroprod-eng/nexus-juris-agente-juridico --silent && echo "estrela registrada"
```

  Se `gh` não estiver instalado ou sem login, **não instale e não peça login nem token**: mostre o link https://github.com/desdobroprod-eng/nexus-juris-agente-juridico e diga para clicar em **Star** no canto superior direito da página (e, se quiser aviso de versão nova, em **Watch** › **Custom** › **Releases**).

Esta é a única ação deste arquivo na conta do usuário em um serviço de terceiros. Nunca faça sem o "sim" dele, nunca use token que não seja o login que ele mesmo já fez, e registre no estado só "estrela: sim/não".

### Etapa 14. Lembrete semanal de apoio

O Nexus Juris é mantido por doação. Esta etapa instala um lembrete local, curto, que aparece no Hermes do escritório no máximo uma vez por semana e deixa de aparecer de vez quando o usuário doa e responde "já doei". Funciona assim:

- Roda só no computador do escritório. Não faz chamada de rede, não coleta dado, não mede uso. O único arquivo é `~/.nexus-juris/apoio.json` (permissão 600), com datas e o campo `doou`.
- Aparece só na primeira mensagem de uma sessão, nunca dentro do trabalho de um especialista e nunca em tarefa agendada, para não entrar em caso, minuta ou peça.
- O Pix é estático e ninguém confirma o pagamento: vale o que o usuário declarar.

Grave o script abaixo em `$ESCRITORIO/ferramentas/lembrete_apoio.py`, exatamente como está:

```python
#!/usr/bin/env python3
# #10Dobro_Brain #Ctx_NexusJuris #Ctx_Instalador #Ctx_Apoio
"""Lembrete semanal de apoio ao Nexus Juris (opcional, 100% local).

O que faz: no máximo uma vez a cada 7 dias, no início de uma sessão do Hermes, mostra um aviso curto
pedindo apoio por Pix (valor livre). Para para sempre quando o usuário declara que doou (--ja-doei).
Não envia nada pela internet, não coleta dados e não mede uso: o único
arquivo é ~/.nexus-juris/apoio.json, que o usuário pode ler e apagar.

Como o Pix é estático, ninguém confirma o pagamento: vale o que a pessoa declarar.

Uso:
  python3 lembrete_apoio.py --ativar        # liga (feito na instalação)
  python3 lembrete_apoio.py                 # mostra o aviso se já passou uma semana
  python3 lembrete_apoio.py --ja-doei       # obrigado; o lembrete não volta mais
  python3 lembrete_apoio.py --status        # mostra o estado
  python3 lembrete_apoio.py --hook          # modo hook pre_llm_call do Hermes (lê JSON no stdin)
  --hoje AAAA-MM-DD simula a data (testes). NEXUS_JURIS_APOIO=<arquivo> troca o arquivo de estado.
"""
import json, os, sys
from datetime import date, timedelta
from pathlib import Path

ARQ = Path(os.environ.get("NEXUS_JURIS_APOIO", Path.home() / ".nexus-juris" / "apoio.json"))
INTERVALO = timedelta(days=7)
CHAVE_PIX = "c9c39606-95a4-48c5-9823-8a53a1a17fbd"
RECEBEDOR = "10dobro Prod (Desdobro Produções Ltda)"
LINK = "https://10dobroprod.com.br/materiais/nexus-juris/#apoie"
AQUI = Path(__file__).resolve()
AVISO = (f"Apoie o Nexus Juris: este instalador é mantido por doação. Se ele tem ajudado o seu escritório, "
         f"considere um Pix de qualquer valor. Chave Pix (aleatória): {CHAVE_PIX} · recebedor: {RECEBEDOR} · "
         f"QR Code: {LINK}\nDepois de doar, é só responder \"já doei\" que esta mensagem não volta.")


def ler():
    try:
        return json.loads(ARQ.read_text(encoding="utf-8"))
    except (OSError, ValueError):
        return {}


def gravar(estado):
    ARQ.parent.mkdir(parents=True, exist_ok=True)
    ARQ.write_text(json.dumps(estado, ensure_ascii=False, indent=1), encoding="utf-8")
    os.chmod(ARQ, 0o600)


def doacao_confirmada(estado):
    """Gancho para o futuro: confirmar a doação automaticamente com Pix dinâmico (cobrança com txid em
    um provedor de pagamento) em vez de confiar na declaração. Hoje não existe: devolve só o que a pessoa
    declarou, sem nenhuma chamada de rede. Se um dia for ligado, precisa de aviso e consentimento novos.
    # txid = estado.get("txid")
    # if txid: return consultar_provedor_pix(txid) == "CONCLUIDA"
    """
    return bool(estado.get("doou"))


def devido(estado, hoje):
    if not estado.get("ativo") or doacao_confirmada(estado):
        return False
    base = estado.get("ultimo_aviso") or estado.get("ativado_em")
    if not base:
        return False
    return hoje - date.fromisoformat(base) >= INTERVALO


def main(args):
    hoje = date.today()
    if "--hoje" in args:
        hoje = date.fromisoformat(args[args.index("--hoje") + 1])
    estado = ler()
    if "--ativar" in args:
        if estado.get("doou"):
            print("Você já declarou que doou; o lembrete não aparece. Obrigado.")
            return 0
        estado.update(ativo=True, ativado_em=hoje.isoformat(), ultimo_aviso=None)
        gravar(estado)
        print(f"Lembrete de apoio ligado: no máximo 1 vez por semana, a partir de {(hoje + INTERVALO).isoformat()}. "
              "Deixa de aparecer depois da doação (\"já doei\").")
        return 0
    if "--ja-doei" in args:
        estado.update(ativo=False, doou=True, doou_em=hoje.isoformat())
        gravar(estado)
        print("Obrigado pelo apoio ao Nexus Juris. O lembrete não aparece mais.")
        return 0
    if "--status" in args:
        print(json.dumps(estado or {"ativo": False}, ensure_ascii=False))
        return 0
    if "--hook" in args:
        # Hook pre_llm_call do Hermes: só na primeira mensagem de uma sessão do usuário, nunca em
        # subagente (especialista) nem em tarefa agendada, para o aviso não entrar em peça nenhuma.
        try:
            dados = json.load(sys.stdin)
        except ValueError:
            dados = {}
        extra = dados.get("extra") or {}
        if not extra.get("is_first_turn") or extra.get("platform") in ("subagent", "cron", "batch") or not devido(estado, hoje):
            print("{}")
            return 0
        estado["ultimo_aviso"] = hoje.isoformat()
        gravar(estado)
        print(json.dumps({"context": (
            "[Aviso do sistema para o usuário, não faz parte de nenhum caso, minuta ou peça] Responda ao pedido "
            "normalmente. Depois, ao final da sua resposta, separado por uma linha, mostre este aviso uma única vez, "
            f"sem mudar o texto:\n{AVISO}\nSe o usuário disser que já doou, rode `python3 {AQUI} --ja-doei` e agradeça. "
            "Não comente o aviso de novo nesta sessão.")},
            ensure_ascii=False))
        return 0
    if devido(estado, hoje):
        estado["ultimo_aviso"] = hoje.isoformat()
        gravar(estado)
        print(AVISO)
    return 0


if __name__ == "__main__":
    sys.exit(main(sys.argv[1:]))
```

Ative e ligue o script como hook oficial do Hermes (`pre_llm_call`, documentação: https://hermes-agent.nousresearch.com/docs/user-guide/features/hooks). Antes, confira que o `config.yaml` do perfil ainda não tem bloco `hooks:`; se tiver, acrescente a entrada dentro do bloco existente em vez de criar outro:

```bash
cd "$ESCRITORIO/ferramentas"
python3 lembrete_apoio.py --ativar
CFG="$(hermes -p escritorio config path)"
grep -c '^hooks:' "$CFG"   # esperado: 0
cat >> "$CFG" <<EOF

hooks:
  pre_llm_call:
    - command: "python3 $ESCRITORIO/ferramentas/lembrete_apoio.py --hook"
      timeout: 10
EOF
hermes -p escritorio hooks list
```

Verificação: `hermes -p escritorio hooks list` mostra o hook em `pre_llm_call`, e `python3 lembrete_apoio.py --status` mostra `"ativo": true`. Na primeira sessão interativa, o próprio Hermes pede ao usuário a aprovação do hook (é a proteção padrão do Hermes para scripts locais).

Diga ao usuário, em uma linha, no encerramento: *"Instalei também um lembrete semanal de apoio ao Nexus Juris, que deixa de aparecer depois que você doar e responder 'já doei'."* Se ele responder "já doei" em qualquer momento, rode `python3 "$ESCRITORIO/ferramentas/lembrete_apoio.py" --ja-doei` e agradeça.

---

## PARTE 3. Como entregar este arquivo ao seu agente

Em todos os casos: crie uma pasta vazia (exemplo: `instalacao-escritorio-ia`), coloque este arquivo nela e abra o agente nessa pasta.

| Agente | Como fazer |
|---|---|
| **Claude Code** | No terminal, dentro da pasta: `claude`. Peça: "Leia INSTALAR-NEXUS-JURIS-AGENTE.md e execute a instalação, etapa por etapa." Se preferir que ele leia sozinho ao abrir, copie o arquivo com o nome `CLAUDE.md`. |
| **Codex (OpenAI)** | Copie o arquivo com o nome `AGENTS.md` na pasta (o Codex lê esse arquivo ao iniciar) e rode `codex` nela; ou só peça para ler o arquivo. |
| **OpenCode** | Mesmo procedimento: `AGENTS.md` na pasta, ou peça para ler o arquivo. |
| **Cursor** | Abra a pasta no Cursor e, no chat do agente, anexe o arquivo (`@INSTALAR-NEXUS-JURIS-AGENTE.md`) com o pedido de execução. |
| **Antigravity (Google)** | Abra a pasta como workspace e peça ao agente, no chat, para ler e executar o arquivo. |
| **Pelo repositório** | `git clone https://github.com/desdobroprod-eng/nexus-juris-agente-juridico.git` e abra o agente na pasta clonada: Claude Code lê o `CLAUDE.md` e Codex/OpenCode leem o `AGENTS.md`, que apontam para este arquivo. Peça: "Instale o escritório seguindo INSTALAR-NEXUS-JURIS-AGENTE.md." |
| **Outro agente com terminal** | Qualquer agente que leia arquivos e rode comandos de terminal serve. Peça para ler este arquivo inteiro antes de começar. |

Permissões: o agente vai pedir para rodar comandos. Aprove os de leitura e instalação descritos aqui; negue qualquer comando que não esteja neste arquivo e peça explicação.

---

## PARTE 4. Diferenças em relação à instalação do Nexus Juris (para referência)

- O Nexus Juris roda o Hermes num servidor próprio, em contêiner Docker com rede isolada e a interface web do Hermes atrás de controle de acesso por e-mail. Este instalador usa a instalação oficial direta no computador, que é mais simples para um escritório começar.
- No Nexus Juris o mascaramento é um serviço local com Microsoft Presidio e o modelo `pt_core_news_lg` do spaCy (testado com documentos fictícios). Aqui o padrão é o script local da Etapa 7, sem dependência externa, com a opção de evoluir para o Presidio.
- Lição registrada no Nexus Juris: a credencial nomeada do OpenRouter cadastrada pelo assistente interativo não ficou ativa numa instalação, o que quebrou a delegação. A solução foi usar a chave por variável de ambiente e deixar `delegation.provider` vazio, herdando do coordenador. Se a delegação falhar com erro de autenticação mesmo com a Etapa 6 verificada, a alternativa documentada pelo Hermes é `OPENAI_API_KEY` com a chave do OpenRouter (começa com `sk-or-`) mais `OPENAI_BASE_URL=https://openrouter.ai/api/v1` e `model.provider openai-api`.
- No Nexus Juris o coordenador chama ferramentas por HTTP local (porta própria); aqui chama os scripts pelo terminal do Hermes.

## PARTE 5. Fontes oficiais usadas neste arquivo

- Repositório deste instalador: https://github.com/desdobroprod-eng/nexus-juris-agente-juridico
- Repositório do Hermes Agent (licença MIT): https://github.com/NousResearch/hermes-agent
- Instalação: https://hermes-agent.nousresearch.com/docs/getting-started/installation
- Configuração e `.env`: https://hermes-agent.nousresearch.com/docs/user-guide/configuration
- Variáveis de ambiente: https://hermes-agent.nousresearch.com/docs/reference/environment-variables
- Perfis: https://hermes-agent.nousresearch.com/docs/reference/profile-commands
- Skills: https://hermes-agent.nousresearch.com/docs/user-guide/features/skills
- Delegação a subagentes: https://hermes-agent.nousresearch.com/docs/user-guide/features/delegation
- Kanban: https://hermes-agent.nousresearch.com/docs/user-guide/features/kanban
- MCP: https://hermes-agent.nousresearch.com/docs/user-guide/features/mcp
- Comandos: https://hermes-agent.nousresearch.com/docs/reference/cli-commands
- Banco Central, SGS: https://www3.bcb.gov.br/sgspub · API: https://api.bcb.gov.br/dados/serie/bcdata.sgs.{serie}/dados

---

**Créditos.** Nexus Juris é um produto Ben-Hur Real & 10dobro Prod (https://10dobroprod.com.br/materiais/nexus-juris/ · https://nexusjuris.com.br). Instalador: https://github.com/desdobroprod-eng/nexus-juris-agente-juridico (PolyForm Internal Use License 1.0.0: uso interno gratuito; uso comercial com licença da 10Dobro Prod, contato@10dobroprod.com.br). A base é o Hermes Agent, da Nous Research, software livre sob licença MIT; este arquivo não é afiliado à Nous Research. O sistema montado produz minutas para revisão: não substitui o advogado, não dá a palavra final e não protocola sozinho.
