The tmc CLI - The Modding Community

Ainda Não Lançado

tmc é um cliente de linha de comando para a nossa API pública de conteúdo. Ele cria, edita e apaga seus assets, mods, servidores, artigos, comunidades, coleções e grupos — e, porque é para isso que a API é realmente usada, ele envia arquivos e publica releases em um único comando.

Python 3.10+Zero dependênciasLicença MIT

O tmc ainda não foi lançado. Ele não está no PyPI e não tem repositório público — hoje se instala a partir de uma cópia do código-fonte, e esta página descreve o que a ferramenta já faz em vez de anunciar um lançamento.

install.sh
# From the source checkout — there is nothing to build
pip install .
pip install '.[fast]'   # optional: cryptography, for faster signing
tmc --version       # tmc 1.1.0

# Keys are made under Account → API Keys
tmc auth login --token tmc_xxxxxxxxxxxx
tmc auth whoami

# …or read public items with no key at all
tmc mod list --anon --app 4 -o json

Um único pacote de biblioteca padrão, então não há nada para compilar nem nada para resolver — e cada comando, flag e código de saída está documentado.

Releases

O Motivo De Existir Uma Ferramenta

Publicar uma release pela API crua são quatro requisições numa ordem específica: enviar os arquivos, coletar seus ids, ler o conjunto de releases que já existe e então gravar o novo sem mexer nos outros. release publish é exatamente essa sequência.

publish.sh
# Upload the files, attach them, write the release — one command
tmc release publish --mod 5 \
  --version 1.2.0 \
  --title "Bug fixes" \
  --content-file CHANGELOG.md \
  --file 'dist/*.zip' --file dist/checksums.txt

# Everything on the item, without re-sending the item
tmc release list  --mod 5
tmc release files --mod 5 --version 1.2.0

Rodar De Novo Atualiza

A mesma --version duas vezes atualiza aquela release e mescla os novos arquivos no conjunto dela. Suas outras releases nunca são tocadas, e uma release oculta continua oculta.

Globs, Em Lotes

Passe --file 'dist/*.zip' e quantos arquivos você tiver; o limite de vinte envios por requisição é tratado para você.

Arquivos Grandes Vão Em Streaming

Um envio de 1 GB é lido do disco em pedaços, não para a memória. Qualquer coisa acima do limite de tamanho da sua chave é sinalizada antes de ser enviada.
O Que Ele Faz

Tudo O Que A API Faz, Explicado

Um comando para cada coisa que você faria no navegador, e algumas que você não iria querer fazer lá — edições em massa, pipelines e releases via script.

Nenhuma Dependência

Python 3.10+ e a biblioteca padrão. Coloque numa máquina de build ou num servidor de jogo sem índice de pacotes e ele roda. cryptography é usado para assinar se estiver instalado e uma implementação RFC 8032 embutida se não estiver — as mesmas assinaturas nos dois casos.

Os Dois Modos De Autenticação

Chaves Bearer tmc_, ou asserções assinadas com Ed25519, em que você guarda a chave privada e nós só armazenamos a metade pública.

Uma Gramática Para Cada Tipo

Os mesmos cinco verbos — list, get, create, update, delete — em todos os catorze tipos, doze dos quais ganham um comando próprio. tmc content <tipo> é a forma uniforme, e o único caminho para os tipos independentes release e media.

Relações Sem Reenviar Tudo

Tags, mídias, releases, links, fontes e itens de coleção são gerenciados separadamente, então adicionar uma captura de tela não significa reescrever o item inteiro.

Em Massa, Dentro De Cada Limite

Crie ou edite a partir de um arquivo JSON de qualquer tamanho. Cada limite do servidor — 25 por escrita, 100 por exclusão, 200 membros de relação, 500 chaves numa exclusão de relação, 20 partes de upload — é dividido em lotes para você, e uma falha parcial identifica o elemento que falhou para que você retome em vez de recomeçar.

Erros De Digitação Pegos Localmente

Os nomes de campo são verificados contra um espelho local dos esquemas da API, com a sugestão mais próxima: 'mod' não tem o campo 'tgs'. Você quis dizer 'tags'? tmc schema mod imprime a lista de campos usada na verificação.

Feito Para Pipes

Sete formatos de saída — table, json, jsonl, csv, tsv, yaml, ids — com --field para manter só as colunas que você quer. Dados no stdout, progresso no stderr, e tmc completion bash|zsh|fish para o shell em que você estiver.

Limites De Taxa Tratados

Um 429 é aguardado exatamente pelo tempo que a API pedir, até --retry-wait-max, e então informa quanto falta em vez de travar um build. O backoff se aplica só a métodos idempotentes — um POST nunca é repetido em silêncio.
Credenciais

Chaves, Perfis E A Metade Pública

Entre uma vez e a credencial fica guardada em ~/.config/tmc/config.json no modo 0600 — ou passe-a pelo ambiente e nada toca o disco. Um perfil por site ou por chave, e --anon para a metade da API que não precisa de chave nenhuma.

auth.sh
# A bearer key, or an Ed25519 key you hold the private half of
tmc auth login --token tmc_xxxxxxxxxxxx
tmc auth login --jwt --key-id tmcak_xxxxxxxx --private-key ~/keys/tmc.pem

# A second key on the same site — a scoped one for scripts
tmc auth login --profile ci \
  --base-url https://moddingcommunity.com --token tmc_…
tmc auth use ci

# Which key is active, and what the server lets it do
tmc auth whoami
tmc auth doctor

# …or no key at all
tmc mod list --anon --app 4 -o json

Um Perfil Por Site Ou Chave

--profile nomeia um, tmc auth use troca o padrão, e cada valor armazenado tem um gêmeo no ambiente — TMC_TOKEN, TMC_KEY_ID, TMC_PRIVATE_KEY_FILE, TMC_BASE_URL, TMC_PROFILE.

Pergunte O Que Uma Chave Realmente Pode Fazer

auth whoami descobre as permissões reais da chave com três sondagens deliberadamente inofensivas — uma leitura, uma criação que não consegue validar e uma exclusão de uma lista de ids vazia. Nada é criado ou apagado; --read-only envia apenas a leitura.

Um Médico Para A Configuração

auth doctor relata qual backend de assinatura está em uso, se as permissões do seu arquivo de configuração são seguras e se o site responde — as três coisas que vale saber antes de depurar um pipeline.

Lendo Sem Chave Nenhuma

--anon lê o resumo público de sete tipos sem cabeçalho Authorization — é um endpoint genuinamente diferente, então recusa escritas antes de a requisição sair, descarta os filtros que essa superfície não tem em vez de deixar parecer que filtraram, e nunca se promove silenciosamente a uma chave salva. --set apiPublic=false é como um item sai dali.
Relações

Quatro Verbos Que Dizem O Que Fazem

O perigoso é set: nesta API um PUT numa relação significa "este é agora o conjunto completo", então um PUT com um único membro apaga todo o resto no item. A CLI mantém os quatro separados e avisa antes de enviar o destrutivo.

Comando Método Significa
tmc rel add POST Mescle estes, deixe o resto
tmc rel set PUT Este é agora o conjunto completo
tmc rel rm DELETE Remova os que você nomeou
tmc rel clear DELETE Remova todos
relations.sh
# Add two tags. The rest of the item is untouched
tmc tags add mod 5 pvp vanilla

# Upload a screenshot and attach it in one step
tmc media add mod 5 --file shot.png --title Screenshot

# Read one relation back
tmc rel get mod 5 releases

# …and the one that REPLACES the whole gallery
tmc rel set mod 5 media --from-file gallery.json
Automação

Feito Para Viver Em CI

Compile seu projeto, publique uma release e envie os arquivos dela a cada tag. As credenciais vêm do ambiente, então nada é escrito no disco de um runner.

release.yml
- name: Publish to TMC
  env:
    TMC_TOKEN: ${{ secrets.TMC_TOKEN }}
  run: |
    tmc release publish --mod 42 \
      --version "${GITHUB_REF_NAME#v}" \
      --content-file CHANGELOG.md \
      --file 'dist/*.zip'

# Clean pipes: data on stdout, progress on stderr
tmc mod list --mine --all -o ids | xargs -n1 tmc mod get -o json

Nada Escrito Num Runner

A credencial sai do ambiente, então nenhum perfil é criado e nada sobrevive ao job. Uma chave JWT pode continuar sendo um arquivo secreto que o runner monta — nós só guardamos a metade pública dela.

Códigos De Saída Com Significado

2 uso, 3 autenticação, 4 não encontrado, 5 validação, 6 limite de taxa, 7 servidor, 8 rede — para um pipeline distinguir "tente de novo" de "conserte sua chave".

Nunca Travado Por Uma Build Antiga

Um campo que a ferramenta ainda não conhece passa mesmo assim com --allow-unknown-fields, e tmc raw envia qualquer requisição.

Testado Contra A Coisa Real

75 testes executam a CLI de verdade contra um mock da API no mesmo processo por um socket real — os dois modos de autenticação, o loteamento, a semântica das relações e o caminho de retentativa.

As Chaves Ficam Em Conta → Chaves De API

Uma chave é gratuita, leva um instante para criar e carrega escopos de leitura / escrita / exclusão, validade, listas de IP permitidas e o próprio limite de taxa — então uma chave entregue a um servidor de build pode fazer exatamente uma coisa. Cada comando, flag e código de saída está descrito na documentação.

Uma chave já é útil hoje — a API está no ar e a documentação está escrita. O tmc em si continua sem lançamento: ainda não há pacote no PyPI nem repositório público, então é uma cópia do código-fonte até isso mudar.