You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Sem cliente de linha de comando para submeter (CD-MOJ tem moj-comp) #145
Comparando com o CD-MOJ, que documenta um CLI de submissão (moj-comp, "offline submission capability") além da interface web.
Situação aqui
Existe API de submissão: Route::apiResource('runs', RunController::class) com Sanctum. Então dá para submeter por HTTP — o que falta é o cliente.
Por que um CLI importa
Em treino, a equipe está no editor e não no navegador. moj-comp arquivo.cpp é um comando; a alternativa é trocar de janela, escolher problema num select, escolher linguagem, anexar arquivo. Numa sessão de treino com dezenas de submissões isso muda o quanto a ferramenta atrapalha.
Numa prova oficial normalmente se exige a interface web — então isto é sobretudo para treino, que é justamente o caso do Treino Livre (#43).
Escopo
Um script pequeno que leia servidor e token de um arquivo de config, descubra o problema pelo nome do arquivo ou por argumento, detecte a linguagem pela extensão e acompanhe o veredito até sair. Nada novo no servidor: a API já existe.
A parte que precisa de decisão é o token — hoje Sanctum emite token de usuário, e uma equipe teria que gerar o dela. Vale ver se isso encosta no #47 (contas gerenciadas) antes de inventar um fluxo separado.
Fora de escopo, deliberadamente
O CD-MOJ também despacha para outro juiz (SPOJ, beecrowd) em vez de executar localmente. Isso é a arquitetura dele, não uma funcionalidade faltando aqui: o microHelium é compatível com BOCA e julga com casos de teste próprios, e o #53 acabou de construir o julgamento distribuído próprio. Registro para não voltar como sugestão.
bin/mh — Python 3 e biblioteca padrão, um arquivo, copiável para qualquer lugar do PATH. Roda na máquina do competidor, não no servidor, então nada que precise de pip install.
mh login --server https://contest.exemplo.org
mh problems
mh submit A.sh # problema pelo nome do arquivo, linguagem pela extensão
mh runs
mh logout
submit espera o veredito e sai com ele (0 aceito, 1 recusado, 2 erro), então compõe com &&.
A afirmação do issue — "nada novo no servidor" — foi conferida e é verdade, mas não pelo motivo óbvio: não existe rota de linguagens, e POST /api/runs exige language_id. O que salva é que GET /api/contests/{id} já devolve problemas e linguagens ativas.
Quatro testes E2E sobre socket de verdade, contra um artisan serve. Dois defeitos achados pelo caminho e corrigidos: o throttle do #159 contava num cache compartilhado entre rodadas de teste (daí CACHE_FILE_PATH), e o nome do arquivo ia cru para o Content-Disposition — A"1.sh produzia cabeçalho malformado, achado em revisão.
Activity
Emitir tokens de API: a superficie autenticada estava inalcancavel (#159
Sede sem link: decisao registrada de nao replicar, com a evidencia (#146
Cliente de linha de comando para submeter (#145)
Cliente de linha de comando para submeter (#145) (#177)
matbrgz commentedon Sep 15, 2026
Fechado pelo PR #177, mergeado em
1a452a5.bin/mh— Python 3 e biblioteca padrão, um arquivo, copiável para qualquer lugar doPATH. Roda na máquina do competidor, não no servidor, então nada que precise depip install.submitespera o veredito e sai com ele (0 aceito, 1 recusado, 2 erro), então compõe com&&.A afirmação do issue — "nada novo no servidor" — foi conferida e é verdade, mas não pelo motivo óbvio: não existe rota de linguagens, e
POST /api/runsexigelanguage_id. O que salva é queGET /api/contests/{id}já devolve problemas e linguagens ativas.Quatro testes E2E sobre socket de verdade, contra um
artisan serve. Dois defeitos achados pelo caminho e corrigidos: o throttle do #159 contava num cache compartilhado entre rodadas de teste (daíCACHE_FILE_PATH), e o nome do arquivo ia cru para oContent-Disposition—A"1.shproduzia cabeçalho malformado, achado em revisão.