Configuracao do Seshat
Este documento descreve as fontes de configuracao da implementacao Rust, a precedencia real e o schema do arquivo .seshat/config.yaml.
Precedencia real
Para provider, modelo, limites de diff, linguagem e segredos, a ordem efetiva e:
- Defaults internos
- Arquivo global
~/.seshat - Keyring do sistema para
API_KEYeJUDGE_API_KEY - Arquivo local
.env - Variaveis de ambiente reais
commit.*em.seshat/config.yaml- Flags da CLI (
--provider,--model,--max-diff,--profile)
Observacoes:
- para
profile, a precedencia base implementada agora e:--profile>SESHAT_PROFILEreal >commit.profile> binding local.cloak>default_profiledo Cloak >~/.seshat. checks,commands,code_revieweuivivem apenas no arquivo de projeto.seshat commitexige.seshat/config.yaml.seshat flowpode rodar sem config de projeto, mas usa o arquivo se ele existir.
Keyring e fallback
seshat config --api-key e seshat config --judge-api-key tentam salvar o segredo no keyring do sistema.
Se o keyring falhar, a CLI oferece fallback para gravar o segredo em texto plano no ~/.seshat.
Variaveis de ambiente reconhecidas
Principais
AI_PROVIDERAI_MODELAPI_KEYJUDGE_PROVIDERJUDGE_MODELJUDGE_API_KEYMAX_DIFF_SIZEWARN_DIFF_SIZECOMMIT_LANGUAGEDEFAULT_DATESESHAT_PROFILE
Timeouts e providers HTTP
AI_TIMEOUTCODE_REVIEW_TIMEOUTOPENAI_BASE_URLANTHROPIC_BASE_URLGEMINI_BASE_URLZAI_BASE_URLOLLAMA_BASE_URL
Codex CLI
CODEX_BINCODEX_MODELCODEX_PROFILECODEX_TIMEOUTCODEX_API_KEYCODEX_HOME
O provider codex usa a CLI local e nao exige API_KEY. Em automacao com codex exec, a credencial dedicada suportada pela CLI e CODEX_API_KEY. Se CODEX_HOME nao for definido explicitamente, o Seshat tenta resolvelo a partir do profile do Cloak.
Claude CLI
CLAUDE_BINCLAUDE_MODELCLAUDE_AGENTCLAUDE_SETTINGSCLAUDE_TIMEOUTCLAUDE_CONFIG_DIR
O provider claude usa a CLI local e nao exige API_KEY. claude-cli continua aceito como alias legado. Se CLAUDE_CONFIG_DIR nao for definido explicitamente, o Seshat tenta resolvelo a partir do profile do Cloak.
Aliases de chave por provider
- Gemini:
GEMINI_API_KEY - Z.ai:
ZAI_API_KEYouZHIPU_API_KEY - Claude API:
ANTHROPIC_API_KEYouCLAUDE_API_KEY - Codex API:
OPENAI_API_KEY
Os aliases funcionam para o provider principal e para o JUDGE.
Classificacao explicita de providers
O runtime agora classifica providers com ProviderTransportKind:
Api: providers HTTP comoopenai,codex-api,claude-api,deepseek,gemini,zaieollama.Cli: providers locais comocodexeclaude.
Essa separacao e usada pelo pipeline de review e pelo fluxo do JUDGE. A diferenca entre API e CLI nao depende mais de comparar strings de nome de provider espalhadas pelo codigo.
Compatibilidade de aliases:
claude-clicontinua aceito como alias legado declaude.- aliases publicos continuam validos, mas comparacoes internas usam a identidade compartilhada do provider family.
Semantica do review contextual
O review usa um ReviewInput estruturado. O diff continua sendo a referencia do que mudou; o contexto adicional existe para interpretacao, nao para ampliar arbitrariamente o escopo do review.
Campos principais:
diff: recorte principal da mudanca.changed_files: arquivos staged ou explicitamente selecionados.staged_files: staged snapshot por arquivo, com metadados para texto, binario, delecao e truncation.repo_root: raiz do repo usada pelos providers CLI para inspecao contextual controlada.custom_prompt: prompt opcional do projeto.
Regras operacionais:
- providers HTTP recebem uma serializacao compacta desse payload.
- providers CLI recebem review contextual com
diff+ arquivos + staged snapshot. - se o working tree divergir do staged, o staged snapshot e a fonte de verdade do commit.
- em CLI, o agente pode ler contexto local para reduzir falso positivo por falta de contexto, mas o review continua focado no que o
diffstaged mostra.
Profiles do Cloak e storage proprio
O Cloak e uma aplicacao separada do Seshat. Repositorio oficial: https://github.com/juniormartinxo/cloak
Layout padrao considerado pelo Seshat:
- config global:
~/.config/cloak/config.toml - perfis instalados:
~/.config/cloak/profiles/<profile>/ - binding local por diretorio: arquivo
.cloak
A integracao com o Cloak obedece estas regras:
- descoberta em modo leitura de
~/.config/cloak/config.tomle~/.config/cloak/profiles/* - nenhuma escrita em
.cloak - nenhuma escrita em
~/.config/cloak/**durante operacao normal - fallback seguro quando o Cloak nao existe
- fallback seguro para profiles incompletos, sem injetar
CODEX_HOMEouCLAUDE_CONFIG_DIRindevidos
Comandos de introspeccao:
seshat profile listseshat profile currentseshat profile doctor
Import opcional:
seshat profile import cloak- destino:
~/.config/seshat/profiles.json - o import registra proveniencia (
source = "cloak") e metadados do profile importado - o import e idempotente e nao duplica profiles por reexecucao
Riscos e limites conhecidos
- staged snapshot pode ser truncado por arquivo para respeitar limite de contexto.
- arquivos binarios e delecoes sao descritos por metadados, nao por conteudo integral.
- prompts de review contextual em CLI reduzem falso positivo, mas nao eliminam julgamento ruim do modelo.
- overrides de ambiente do JUDGE continuam baseados na identidade do provider family para preservar compatibilidade com
CODEX_MODEL,CLAUDE_MODELeCODEX_API_KEYpara o providercodex.
Schema de .seshat/config.yaml
Exemplo completo
project_type: rust
commit:
language: PT-BR
max_diff_size: 3000
warn_diff_size: 2500
provider: codex
model: gpt-5.4
profile: amjr
no_ai_extensions: [".md", ".mdx"]
no_ai_paths: ["docs/", ".github/", "CHANGELOG.md", ".env", ".nvmrc"]
checks:
lint:
enabled: true
blocking: true
auto_fix: false
command: ["rustfmt", "--check", "--config", "skip_children=true"]
fix_command: ["rustfmt", "--config", "skip_children=true"]
extensions: [".rs"]
pass_files: true
test:
enabled: true
blocking: false
typecheck:
enabled: true
blocking: true
code_review:
enabled: true
blocking: true
mode: interactive
max_diff_size: 16000
prompt: .seshat/review.md
extensions: [".rs"]
log_dir: .seshat/review-logs
commands:
rustfmt:
auto_fix: true
clippy:
command: ["cargo", "clippy", "--all-targets", "--all-features", "--", "-D", "warnings"]
ui:
force_rich: true
icons:
info: "[info]"
success: "[ok]"
warning: "[warn]"
error: "[err]"
step: ">"
project_type
Aceita:
rustpythontypescript
Se omitido, o runner detecta por arquivos do projeto. A prioridade atual e:
- TypeScript
- Rust
- Python
commit
Campos suportados:
languagemax_diff_sizewarn_diff_sizeprovidermodelprofileno_ai_extensionsno_ai_paths
Os campos legados no topo do YAML ainda sao lidos para compatibilidade:
language,commit_language,COMMIT_LANGUAGEprovider,ai_provider,AI_PROVIDERmodel,ai_model,AI_MODELprofile,SESHAT_PROFILEmax_diff_size,MAX_DIFF_SIZEwarn_diff_size,WARN_DIFF_SIZE
checks
Cada check aceita:
enabledblockingauto_fixcommandextensionspass_filesfix_command
Notas importantes:
auto_fix: truefaz o runner usarfix_commanddurante o check.auto_fix: falsedesliga o auto-fix, inclusive quando a ferramenta tem um default embutido.commandefix_commandaceitam string unica ou lista de argumentos.
commands
commands sobrescreve comportamento por nome da ferramenta ou por tipo de check.
Exemplos validos:
commands.rustfmtcommands.clippycommands.pytestcommands.lintcommands.testcommands.typecheck
Se uma entrada existir, ela e aplicada sobre o tool detectado.
code_review
Campos suportados:
enabledblockingmodemax_diff_sizepromptlog_dirextensions
Notas:
mode: interactivemostra o review completo no terminal e mantem o fluxo interativo.- no modo
interactive, cada finding bloqueante aceitaF(falso positivo),I(JUDGE IA) ouP(pular). Ienvia apenas o item bloqueante para o JUDGE, nao o review inteiro.- se todos os itens bloqueantes forem
P, o commit continua mesmo assim. mode: filesgrava os findings em.seshat/code_review/<branch>/<path_relativo>.md, com campoAção: <F | P>, e reduz a interacao no terminal.- no modo
files, esse campoAçãoe documental hoje; ele nao e reimportado automaticamente para o store de falsos positivos. promptaponta para o prompt customizado do projeto.seshat initgera.seshat/review.mdautomaticamente.- quando
blocking: true, findings[BUG]e[SECURITY]bloqueiam o commit.
ui
A implementacao Rust suporta hoje:
force_richicons
Nao existe suporte a tema/paleta configuravel na CLI Rust atual. Se theme: aparecer no YAML, ele sera ignorado.
As chaves de icons suportadas hoje sao:
infosuccesswarningerrorstep
Auto-fix por linguagem
Rust
lintusarustfmttypecheckusacargo clippytestusacargo test
Detalhes atuais do Rust:
lintusarustfmt --config skip_children=truelinttem auto-fix embutido por default; usechecks.lint.auto_fix: falsepara desligartypecheckemflowecommit --check typechecke escopado ao pacote Cargo afetadotestso roda para integration tests emtests/*.rs, e apenas para os alvos staged- se o diff staged adicionar exatamente uma funcao de teste em um unico integration test, o runner chama
cargo test --test=<arquivo> <nome_do_teste>
Python e TypeScript
Os comandos default sao detectados pelo runner, mas podem ser sobrescritos em checks.* ou commands.*.
Detalhes atuais de Python e TypeScript:
pytestrecebe arquivos de teste relevantes quando o check e escopado por arquivo- se um unico
def test_*novo estiver staged,pytestrecebe o nodeid especifico do teste jestevitestrecebem arquivos.test.*e.spec.*relevantes- se um unico
test(...)ouit(...)novo estiver staged,jest/vitestrecebemarquivo -t <nome_do_teste>
Arquivos legados
O repo Rust ainda reconhece layouts antigos do repo Python:
.seshatna raiz do projetoseshat-review.mdna raiz
Quando possivel, seshat init e as rotinas de migracao movem isso para:
.seshat/config.yaml.seshat/review.md