Gestão de orgs e coleções (manual do gestor de problemas) — MOJ docs

Gestão de orgs e coleções (manual do gestor de problemas)

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.

Os dois eixos, em 30 segundos

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.


Parte 1 — ORGs

Criar uma 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.

Membros e admins

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 .admin global 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.

Quem PODE virar membro (validado desde 2026-08-20)

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.

Trava de público (public_allowed) — o anti-vazamento

Toda 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.

Apagar uma org

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>

Mover um rascunho para outra org

Como a org é o prefixo do id, mover um problema muda o id (orgA#porgB#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>

Parte 2 — COLEÇÕES

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).

Criar uma coleção

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>"

Marcar / desmarcar um problema numa coleção

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>"

Renomear / apagar uma coleção

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.


Permissões e armadilhas (o resumo que evita dor de cabeça)

Receitas rápidas

Montar uma disciplina do zero (privada):

  1. moj mkdir eda1-2026 (ou “+ nova org” no editor) — nasce privada.
  2. Crie os problemas dentro dela (ficam privados, bons para prova).
  3. moj collection create "Prova 1 EDA1 2026/1" e marque os problemas da prova nela, para organizar/sortear.

Abrir problemas ao Treino Livre:

  1. Um admin da org liga o público: moj org public eda1-2026 on (ou aba Orgs na web).
  2. Publique cada problema: 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:

Ver também