Este manual é para quem cria e organiza problemas no
MOJ — professores, monitores, organizadores. Explica os dois eixos de
organização (org e coleção), o que
cada um faz, e como operar cada coisa nas DUAS
interfaces: a web (Gestão de Problemas) e a CLI
moj. Os dois clientes falam com a mesma API, então qualquer
operação pode ser feita de qualquer lado — use o que for mais
confortável.
O formato dos metadados (o que fica no
.moj-meta.json, como o id é montado) é descrito, em detalhe canônico, no PACOTE.md (seções 7–9). Aqui o foco é o uso.
| ORG | COLEÇÃO | |
|---|---|---|
| Para que serve | Acesso: quem pode ver/editar o problema | Agrupamento: rótulo para navegar/organizar |
| Quantas por problema | Exatamente 1 (é o prefixo do id
org#prob) |
Várias (m:n) — o problema pode estar em quantas quiser |
| Dá acesso? | Sim — membro da org edita os problemas dela | Não — é só um rótulo; não deixa ninguém editar |
| Muda o id? | Sim: o problema é <org>#<prob> |
Não |
| Exemplo | apc, obi-problems,
mdp-2026-1 |
problemas-apc, Prova EDA1 2026/1,
dificil |
Regra de ouro: a org decide QUEM mexe; a coleção decide COMO você encontra. Elas são ortogonais — dois problemas de orgs diferentes podem estar na mesma coleção, e uma org pode ter problemas espalhados por várias coleções.
Todo usuário já nasce com uma org implícita com o seu próprio
login (ex.: ana.silva), sempre privada — é onde
seus rascunhos ficam se você não criar outra org.
Uma org costuma representar uma disciplina, turma ou
competição (ex.: uma por semestre de uma matéria, uma para cada
olimpíada). O nome é minúsculo, sem espaços: ele é o
prefixo do id <org>#<prob>
(^[a-z0-9][a-z0-9._-]{1,63}$ — quem vira subdomínio é o id
do contest, não a org). Criar org exige a mesma
permissão de criar problema/contest.
| Web (Gestão de Problemas) | CLI |
|---|---|
| No editor de um problema novo, no topo da aba Enunciado, clique “+ nova org”. Ou vá à aba Orgs e crie por lá. | moj mkdir <org> · ou
moj org create <org> [--public] [--members a,b] [--admins c] |
Quem cria a org vira automaticamente membro e admin dela. Um problema só pode ser salvo dentro de uma org — por isso o editor pede para criar a primeira antes de deixar salvar.
| Web | CLI |
|---|---|
| Aba Orgs → escolha a org → gerencie membros/admins: clique na estrela do chip do membro (⭐ admin ↔︎ ☆ membro) para promover/rebaixar; ✕ remove da org. O criador da org é sempre admin (não dá para rebaixá-lo). No editor de um problema há também o share (adiciona coautor à org daquele problema). | moj share <org> <login> (adiciona membro) ·
moj org members <org> --add a,b --remove c --admins-add d --admins-remove e |
Acesso a problema privado é decidido só pela org — nem um
.adminglobal do MOJ vê o conteúdo/pacote de um problema privado de uma org da qual não é membro. Provas em elaboração não vazam, por construção.
Adicionar alguém a uma org não aceita mais qualquer texto. Cada login
que entra (como membro ou admin, pela web, pelo
moj share ou pelo moj org members --add) é
conferido na hora:
| Situação | Resposta |
|---|---|
Formato inválido (Inv@lido) |
422 login_invalid |
| Não existe conta no treino | 404 — "Não existe conta no treino: 'fulano'" |
| Existe, mas não pode criar problemas | 403 — "'fulano' não pode criar problemas (motivo) — membro de org edita o acervo dela" |
O critério de "pode criar problemas" é o mesmo de
criar um problema ou um contest: conta .admin sempre pode;
a lista de autorizados e a de bloqueados do painel do treino mandam;
senão vale o limiar de problemas resolvidos. Se o seu monitor foi
recusado, o conserto é autorizá-lo em Painel do treino › Quem
pode criar contests e problemas — não é contornar por outra
tela.
A recusa é atômica: se você mandar cinco logins e um
for inválido, nenhum entra (a org nem chega a ser
criada, no caso do create). Remover não
valida nada — lixo que ficou de antes sempre pode sair.
public_allowed) — o anti-vazamentoToda org nasce privada: seus problemas não podem ser publicados no Treino Livre. Isso é proposital — é a proteção contra vazar uma prova em elaboração. Para que os problemas de uma org possam ficar públicos, um admin da org precisa liberar o público da org.
| Web | CLI |
|---|---|
| Aba Orgs → a org → ligar/desligar a trava de público. | moj org public <org> on /
moj org public <org> off |
⚠️ Desligar a trava DESPUBLICA em cascata todos os problemas públicos daquela org (eles voltam a privado na hora). Ligue com calma; desligue com mais calma ainda.
A org implícita (<seulogin>) é
sempre privada e não aceita liberar público — ela é seu
rascunho pessoal. Para publicar, mova o problema para uma org com
público liberado.
Só é possível apagar uma org vazia (sem nenhum problema). A org implícita nunca é removida.
| Web | CLI |
|---|---|
| Aba Orgs → remover (só habilita se estiver vazia). | moj org rm <org> |
Como a org é o prefixo do id, mover um problema muda o
id (orgA#p → orgB#p). Só vale para
problema não público (409 is_public; um
problema privado já usado num contest ainda move); você precisa ser
membro das duas orgs.
| Web | CLI |
|---|---|
| Na lista de problemas, o botão “Mover” (aparece só nos seus rascunhos). | moj mv <id> <org-destino> |
Coleção é um rótulo livre para agrupar problemas —
pode ter espaços e acentos (ex.:
Prova EDA1 2026/1, Geometria,
iniciantes). Um problema pode estar em
várias. Serve para: navegação no Treino Livre, filtros
da busca, e o sorteio de problemas na criação de
contest. Coleção não dá acesso a nada — é puramente
organização.
O registro de coleções é curado: para marcar um problema numa coleção, ela precisa existir (você cria a coleção primeiro). Cada coleção tem um dono (quem a criou).
| Web | CLI |
|---|---|
| Aba Coleções da Gestão de Problemas → campo nova coleção → “+ Coleção”. (Também dá para criar do painel de coleções dentro do editor.) | moj collection create "<nome livre>" |
| Web | CLI |
|---|---|
| No editor do problema, painel de coleções: marque/desmarque os rótulos e Salve. | moj collection add <id> "<nome>" ·
moj collection remove <id> "<nome>" |
| Web | CLI |
|---|---|
| Aba Coleções (filtro “só minhas”, clique no nome para ver os problemas). No Treino Livre, o explorador agrupa as coleções por prefixo e filtra por texto. | moj collection ls ·
moj collection show "<nome>" |
Só o dono da coleção (ou um .admin)
renomeia/apaga. A operação re-etiqueta os N problemas em segundo
plano (o servidor faz o trabalho pesado sem travar); a CLI
acompanha até o fim mostrando o progresso.
| Web | CLI |
|---|---|
| Aba Coleções → renomear/excluir (dono/admin); um banner de progresso ("⏳ re-tag em andamento: N/M") aparece na própria aba até o job terminar. | moj collection rename "<nome>" "<novo>" ·
moj collection delete "<nome>" ·
moj collection status (acompanha os jobs) |
Renomear/apagar não afeta o acesso de ninguém (coleção é só rótulo) — só troca/remove a etiqueta nos problemas.
.admin
global; o acesso é decidido pela membership da org.public_allowed ligado; senão o
botão/publish recusa.moj collection status.Montar uma disciplina do zero (privada):
moj mkdir eda1-2026 (ou “+ nova org” no editor) — nasce
privada.moj collection create "Prova 1 EDA1 2026/1" e marque os
problemas da prova nela, para organizar/sortear.Abrir problemas ao Treino Livre:
moj org public eda1-2026 on (ou aba Orgs na web).moj publish eda1-2026#<prob> (ou o botão
Publicar no editor) — o servidor valida + calibra e ele
aparece no Treino Livre.Compartilhar a autoria com um colega:
moj share eda1-2026 colega.login (ou o
share no editor) — o colega passa a editar todos os
problemas da org..moj-meta.json, o id, as seções 7
(ORG), 8 (COLEÇÃO) e 9 (ORG × COLEÇÃO))./orgs/* e /problems/collection* para quem
automatiza.