Seshat

Matriz de Paridade Python x Rust

Referencia primaria: site/docs/cli.md.

Status:

  • ported: comportamento portado e coberto ou equivalente.
  • partial: comportamento existe, mas ainda falta cobertura ou detalhe.
  • missing: comportamento Python ainda nao existe no Rust.
  • changed: comportamento Rust difere de proposito ou por pendencia registrada.

Resumo

AreaStatusEvidenciaGap/Card
Comandos publicosportedcommit, flow, init, fix, config existem em src/cli.rs-
Git com repo explicitoportedGitClient usa git -C <repo_path>002
E2E de repos Git temporariosportedtests/e2e_git.rs003
Fast paths sem IAportedE2E no_ai_e2e_*004
Config global + .seshat + .env + keyringportedresolve_effective_config centraliza precedencia006, 007, 008
Providers HTTP/CLIportedProviders HTTP cobertos por transporte fake; providers CLI cobertos com executaveis fake-
Code reviewportedParser, filtros, logs e JUDGE cobertos-
Tooling/fixportedStrategies separadas por linguagem e E2E com comandos fake para commit/fix-
UI/JSONportedUI humana e JSONL de commit tem contrato documentado e testes-
GPGportedPrewarm usa tempdir seguro, respeita gpg.format e falha antes de IA-
Release/cutoverportedEstrategia de repos separados por linguagem documentada; sem pendencia no repo Rust-

seshat commit

Flags

Item PythonRustStatusNotasGap/Card
--providerCommitArgs.providerportedOverride aplicado antes de validar config-
--modelCommitArgs.modelportedOverride aplicado antes de validar config-
--yes, -yCommitArgs.yesportedE2E cobre commits reais004
--verbose, -vCommitArgs.verboseportedUsado em diff/check/commit quiet-
--date, -dCommitArgs.dateportedE2E valida data do commit004
--max-diffCommitArgs.max_diffportedOverride aplicado em config efetiva-
--check, -cCheckKindportedfull, lint, test, typecheck; E2E cobre lint com comando fake-
--review, -rCommitArgs.reviewportedLiga review por flag013, 014
--no-reviewCommitArgs.no_reviewportedSobrepoe .seshat014
--no-checkCommitArgs.no_checkportedPula checks-
--format jsonOutputFormat::JsonportedJSONL cobre message_ready, committed, cancelled e error-

Contratos de comportamento

Item PythonRustStatusNotasGap/Card
.seshat obrigatorio no commitrun_commit valida arquivoportedEm JSON emite erro antes do erro final-
Oferece seshat init se .seshat faltarNao oferecechangedRust falha direto; decisao mantida para automacao-
Delecao sem IAGitClient::is_deletion_only_commitportedE2E valida subject004
Markdown sem IAis_markdown_only_commitportedE2E smoke e no-AI003, 004
Imagem sem IAis_image_only_commitportedE2E valida subject004
Lock file sem IAis_lock_file_only_commitportedE2E valida subject004
Dotfile sem IAis_dotfile_only_commitportedE2E valida subject004
Mix builtin no-AIis_builtin_no_ai_only_commitportedE2E valida subject generico004
commit.no_ai_extensionsmatches_no_ai_ruleportedE2E valida .txt004
commit.no_ai_pathsmatches_no_ai_ruleportedE2E valida generated/004
Diff grande com confirmacaovalidate_diff_sizeportedE2E cobre cancelamento sem --yes e continuidade com --yes-
Checks por flagrun_pre_commit_checksportedE2E cobre sucesso, falha bloqueante, falha nao bloqueante e output truncado-
Checks por .seshatproject_config.checksportedE2E cobre check habilitado e check desabilitado sem flag-
Code review por flag/configcommit_with_aiportedInclui bloqueio e reavaliacao por JUDGE-
Commit assinado GPGensure_gpg_auth_for_repoportedUsa repo path, gpg.program, user.signingkey, tempdir seguro e detalhe de stderr-

seshat flow

Flags

Item PythonRustStatusNotasGap/Card
COUNT posicionalFlowArgs.countportedLimita arquivos processados-
--path, -pFlowArgs.pathportedE2E roda fora do repo alvo002, 003
--providerFlowArgs.providerportedOverride de config-
--modelFlowArgs.modelportedOverride de config-
--yes, -yFlowArgs.yesportedE2E cobre --yes003
--verbose, -vFlowArgs.verboseportedPassado ao processamento-
--date, -dFlowArgs.dateportedE2E proprio valida data no commit gerado por flow-
--check, -cFlowArgs.checkportedE2E cobre fake tool no flow-
--review, -rFlowArgs.reviewportedPassado ao commit por arquivo-
--no-checkFlowArgs.no_checkportedE2E cobre skip de fake tool no flow-

Contratos de comportamento

Item PythonRustStatusNotasGap/Card
Seleciona modified + untracked + stagedGitClient::modified_filesportedUsa diff, ls-files, diff --cached003
git add -- <file> por arquivoGitClient::add_pathportedCentralizado com repo path002
Lock em .git/seshat-flow-locksBatchCommitService::lock_path_for_fileportedE2E valida repo alvo003
TTL 30 minlock_ttlportedSem E2E de stale lock ainda003 futuro
Nao exige .seshatCLI nao valida .seshat no flowportedUsa se existir-
Executa fora do cwd do repo alvoGitClient com repo_pathportedE2E e2e_flow_path_uses_target_repository002, 003

seshat init

Item PythonRustStatusNotasGap/Card
--path, -pInitArgs.pathportedE2E cobre criacao em path005
--force, -fInitArgs.forceportedE2E cobre sobrescrita permitida005
Detecta TypeScriptToolingRunnerportedUnit tests cobrem detection005
Detecta PythonToolingRunnerportedUnit tests cobrem detection005
Detecta RustToolingRunnerchangedRust novo no port; desejado para binario Rust015
Inclui commit.no_ai_* no templaterun_initportedE2E valida presenca no template005
Inclui ui no templaterun_initportedE2E valida presenca; contrato documentado em site/docs/ui-contract.md-
Nao sobrescreve prompt customizadorun_initportedE2E migra/preserva prompt em .seshat/review.md-

seshat fix

Item PythonRustStatusNotasGap/Card
--check lintFixCheckKind::LintportedApenas lint, como Python-
--all, -aFixArgs.run_allportedRoda sem lista de arquivos-
Arquivos especificosFixArgs.filesportedPassa lista ao runner-
Default em staged filesgit::staged_filesportedE2E cobre arquivo staged com ruff fake005
Comandos fake em E2Etests/e2e_cli.rsportedCobre sucesso, --all, arquivos explicitos, falha e fix_command configurado-

seshat config

Item PythonRustStatusNotasGap/Card
--api-keyConfigArgs.api_keyportedTenta keyring antes de plaintext007
--providerConfigArgs.providerportedValida provedores-
--modelConfigArgs.modelportedSalva modelo-
--judge-api-keyConfigArgs.judge_api_keyportedKeyring e fluxo JUDGE portados-
--judge-providerConfigArgs.judge_providerportedUsado pelo fluxo JUDGE-
--judge-modelConfigArgs.judge_modelportedUsado pelo fluxo JUDGE-
--max-diffConfigArgs.max_diffportedValida maior que zero-
--warn-diffConfigArgs.warn_diffportedValida maior que zero-
--languageConfigArgs.languageportedNormaliza caixa-
--default-dateConfigArgs.default_dateportedUsado por commit/flow-
Exibir config atual sem flagsrun_configportedMascara API key-

Variaveis de Ambiente

Item PythonRustStatusNotasGap/Card
API_KEYAppConfig.api_keyportedEnv tem precedencia008 para pipeline formal
AI_PROVIDERAppConfig.ai_providerportedEnv e CLI override-
AI_MODELAppConfig.ai_modelportedDefault por provider-
JUDGE_API_KEYAppConfig.judge_api_keyportedUsado como API_KEY temporaria do JUDGE-
JUDGE_PROVIDERAppConfig.judge_providerportedSeleciona provider do JUDGE-
JUDGE_MODELAppConfig.judge_modelportedSeleciona modelo do JUDGE-
MAX_DIFF_SIZEAppConfig.max_diff_sizeportedEnv carregado-
WARN_DIFF_SIZEAppConfig.warn_diff_sizeportedEnv carregado-
COMMIT_LANGUAGEAppConfig.commit_languageportedEnv carregado-
DEFAULT_DATEAppConfig.default_dateportedCommit/flow usam-
GEMINI_API_KEYnormalize_configportedFallback para provider Gemini-
ZAI_API_KEY / ZHIPU_API_KEYnormalize_configportedFallback para Zai-
.env localload_config_for_pathportedUnit tests cobrem precedencia e aliases006

Campos .seshat

Campo PythonRustStatusNotasGap/Card
project_typeProjectConfig.project_typeportedUsado por tooling/review-
commit.languageCommitConfig.languageportedOverride global-
commit.providerCommitConfig.providerportedOverride global-
commit.modelCommitConfig.modelportedOverride global-
commit.max_diff_sizeCommitConfig.max_diff_sizeportedOverride global-
commit.warn_diff_sizeCommitConfig.warn_diff_sizeportedOverride global-
commit.no_ai_extensionsCommitConfig.no_ai_extensionsportedE2E cobre004
commit.no_ai_pathsCommitConfig.no_ai_pathsportedE2E cobre004
Campos legados no toponormalize_legacy_commit_fieldsportedUnit test cobre parte008
checks.*.enabledProjectConfig.checksportedE2E cobre habilitado e desabilitado-
checks.*.blockingProjectConfig.checksportedE2E cobre bloqueante e nao bloqueante-
checks.*.commandCheckConfig.command / CommandOverrideportedUnit cobre override; E2E executa comando fake-
checks.*.extensionsToolCommand.extensionsportedE2E cobre skip por arquivo irrelevante-
checks.*.pass_filesToolCommand.pass_filesportedE2E cobre true e false-
checks.*.fix_commandToolCommand.fix_commandportedE2E cobre fix e auto_fix-
checks.*.auto_fixToolCommand.auto_fixportedE2E cobre uso do fix_command no check-
code_review.enabledCodeReviewConfig.enabledportedAtiva review e respeita --no-review-
code_review.blockingCodeReviewConfig.blockingportedAciona parada, continuar ou JUDGE em BUG/SECURITY-
code_review.promptget_review_promptportedUsado pelo review principal e JUDGE-
code_review.extensionsfilter_diff_by_extensionsportedUnit tests cobrem filtros default/custom e exclusoes-
code_review.log_dirsave_review_to_logportedUnit tests cobrem agrupamento, paths e unknown-
ui.force_rich / ui.iconsui::apply_configportedAplicado em commit, fix e flow; theme fica documentado como futuro-

Arquivos Lidos e Escritos

ArquivoPythonRustStatusGap/Card
.seshat localLeitura obrigatoria em commitLeitura obrigatoria em commitported-
.seshat local em flowOpcionalOpcionalported-
~/.seshat globalJSONJSON com secrets removidos quando keyring funcionaported007, 008
.env localLidoLido do path do projetoported006
.git/seshat-flow-locks/*Escrito/removidoEscrito/removidoported003
Logs de reviewEscrito se configuradoEscrito se configurado e testadoported-
Keyring do sistemaUsado para segredosUsado para API_KEY e JUDGE_API_KEYported007

Efeitos Colaterais em Git

EfeitoPythonRustStatusGap/Card
Le git diff --cachedSimSim via GitClientported002
Le staged filesSimSim via GitClientported002
git commit -mSimSim via GitClientported003, 004
git commit --dateSimSimported004
flow faz git add -- <file>SimSim via GitClientported003
flow faz git commit --only -- <file>SimSim via GitClientported003
flow --path usa repo alvoSim esperadoSim testadoported002, 003
GPG prewarm antes de providerSimSimportedE2E cobre commit e flow antes da IA

Testes de Referencia

PythonRust atualStatusGap/Card
tests/test_cli.py commit/config/initUnit + E2E Rust para commit/config/init/fix/jsonported-
tests/test_core.py fast paths/reviewUnit + E2E no-AI/reviewported-
tests/test_config.py config/keyring/dotenvUnit de config/keyring/dotenvportedKeyring real fica como smoke manual de release por depender do ambiente
tests/test_providers.py providersUnit de providers HTTP e CLI com fakes offlineported-
tests/test_tooling.py discoveryUnit Rust + E2E fake commandsported-
tests/test_tooling_fix.py fixE2E com ruff fake e fix_command configuradoported-
tests/test_code_review.py reviewUnit parser/filtro/logs/JUDGEported-
tests/test_ui.py UIUnit tests de contrato textual em src/ui.rs; JSONL em E2Eported-

Decisoes changed

ItemDiferencaMotivoCard
commit sem .seshatRust falha direto; Python oferece init interativoReduz surpresa em automacao; decisao mantida-
UI themeRust nao aplica tema customizado aindaContrato documenta tema como futuro; force_rich e icons ja funcionam020
Suporte Rust em tooling/initRust detecta Cargo.toml; Python original focava Python/TSNecessario para manter o port Rust015