The tmc CLI - The Modding Community

Pas Encore Publié

tmc est un client en ligne de commande pour notre API de contenu publique. Il crée, modifie et supprime vos ressources, mods, serveurs, articles, communautés, collections et groupes — et, parce que c'est à cela que l'API sert vraiment, il téléverse des fichiers et publie des versions en une seule commande.

Python 3.10+Zéro dépendanceLicence MIT

tmc n'est pas encore publié. Il n'est pas sur PyPI et n'a pas de dépôt public — aujourd'hui il s'installe depuis une copie des sources, et cette page décrit ce que l'outil fait déjà plutôt que d'annoncer une sortie.

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

Un seul paquet en bibliothèque standard : rien à compiler et rien à résoudre — et chaque commande, option et code de sortie est documenté.

Versions

La Raison D'Avoir Un Outil

Publier une version via l'API brute, c'est quatre requêtes dans un ordre précis : téléverser les fichiers, récupérer leurs ids, lire l'ensemble des versions existantes, puis réécrire la nouvelle sans toucher aux autres. release publish, c'est cette séquence.

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

La Relancer Met À Jour

La même --version deux fois met à jour cette version et fusionne les nouveaux fichiers dans son ensemble. Vos autres versions ne sont jamais touchées, et une version masquée reste masquée.

Des Globs, Par Lots

Passez --file 'dist/*.zip' et autant de fichiers que vous voulez ; la limite de vingt téléversements par requête est gérée pour vous.

Les Gros Fichiers Sont Streamés

Un téléversement d'1 Go est lu depuis le disque par morceaux, pas chargé en mémoire. Tout ce qui dépasse la limite de taille de votre clé est signalé avant l'envoi.
Ce Qu'Il Fait

Tout Ce Que Fait L'API, Détaillé

Une commande par chose que vous feriez dans le navigateur, et quelques-unes que vous n'y feriez pas : modifications en masse, pipelines et publications scriptées.

Aucune Dépendance

Python 3.10+ et la bibliothèque standard. Déposez-le sur une machine de build ou un serveur de jeu sans index de paquets et il tourne. cryptography est utilisé pour la signature s'il se trouve installé, et une implémentation RFC 8032 embarquée sinon — mêmes signatures dans les deux cas.

Les Deux Modes D'Authentification

Des clés Bearer tmc_, ou des assertions signées Ed25519 où vous gardez la clé privée et où nous ne stockons que la moitié publique.

Une Grammaire Pour Chaque Type

Les mêmes cinq verbes — list, get, create, update, delete — sur les quatorze types, dont douze ont leur propre commande. tmc content <type> est la forme uniforme, et le seul chemin vers les types autonomes release et media.

Des Relations Sans Tout Renvoyer

Tags, médias, versions, liens, sources et éléments de collection se gèrent séparément, donc ajouter une capture d'écran ne veut pas dire réécrire tout l'élément.

En Masse, Dans Chaque Limite

Créez ou modifiez depuis un fichier JSON de n'importe quelle taille. Chaque plafond du serveur — 25 par écriture, 100 par suppression, 200 membres de relation, 500 clés lors d'une suppression de relation, 20 parties de téléversement — est découpé pour vous, et un échec partiel nomme l'élément fautif pour que vous puissiez reprendre plutôt que tout recommencer.

Les Fautes De Frappe Détectées En Local

Les noms de champs sont vérifiés contre une copie locale des schémas de l'API, avec la suggestion la plus proche : 'mod' n'a pas de champ 'tgs'. Vouliez-vous dire 'tags' ? tmc schema mod affiche la liste des champs utilisée pour la vérification.

Conçu Pour Les Pipes

Sept formats de sortie — table, json, jsonl, csv, tsv, yaml, ids — avec --field pour ne garder que les colonnes voulues. Les données sur stdout, la progression sur stderr, et tmc completion bash|zsh|fish pour le shell que vous utilisez.

Les Limites De Débit Gérées

Un 429 est attendu exactement le temps demandé par l'API, jusqu'à --retry-wait-max, puis vous indique le temps restant plutôt que de bloquer un build. Le backoff ne s'applique qu'aux méthodes idempotentes — un POST n'est jamais rejoué en silence.
Identifiants

Clés, Profils Et La Moitié Publique

Connectez-vous une fois et l'identifiant est stocké dans ~/.config/tmc/config.json en mode 0600 — ou passez-le par l'environnement et rien ne touche le disque. Un profil par site ou par clé, et --anon pour la moitié de l'API qui ne demande aucune clé.

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

Un Profil Par Site Ou Par Clé

--profile en désigne un, tmc auth use change celui par défaut, et chaque valeur stockée a son jumeau dans l'environnement — TMC_TOKEN, TMC_KEY_ID, TMC_PRIVATE_KEY_FILE, TMC_BASE_URL, TMC_PROFILE.

Demandez Ce Qu'Une Clé Peut Vraiment Faire

auth whoami établit les permissions réelles de la clé avec trois sondes délibérément inoffensives : une lecture, une création qui ne peut pas valider, et une suppression d'une liste d'ids vide. Rien n'est créé ni supprimé ; --read-only n'envoie que la lecture.

Un Docteur Pour L'Installation

auth doctor indique quel backend de signature est utilisé, si les permissions de votre fichier de configuration sont sûres et si le site répond tout court — les trois choses à savoir avant de déboguer un pipeline.

Lire Sans La Moindre Clé

--anon lit le résumé public de sept types sans en-tête Authorization — c'est un endpoint réellement différent, il refuse donc les écritures avant même l'envoi, écarte les filtres que cette surface n'a pas plutôt que de laisser croire qu'ils ont filtré, et ne bascule jamais discrètement sur une clé enregistrée. --set apiPublic=false est la façon d'en sortir un élément.
Relations

Quatre Verbes Qui Disent Ce Qu'Ils Font

Le dangereux, c'est set : sur cette API, un PUT sur une relation signifie « voici désormais l'ensemble complet », donc un PUT à un seul membre supprime tout le reste sur l'élément. La CLI garde les quatre distincts et prévient avant d'envoyer le destructeur.

Commande Méthode Signifie
tmc rel add POST Ajoute ceux-ci, laisse tout le reste
tmc rel set PUT Voici désormais l'ensemble complet
tmc rel rm DELETE Retire ceux que vous avez nommés
tmc rel clear DELETE Retire-les tous
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
Automatisation

Fait Pour Vivre En CI

Compilez votre projet, publiez une version et téléversez ses fichiers à chaque tag. Les identifiants viennent de l'environnement, donc rien n'est écrit sur le disque d'un 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

Rien D'Écrit Sur Un Runner

L'identifiant sort de l'environnement : aucun profil n'est créé et rien ne survit au job. Une clé JWT peut rester un fichier secret monté par le runner — nous ne détenons jamais que sa moitié publique.

Des Codes De Sortie Qui Veulent Dire Quelque Chose

2 usage, 3 authentification, 4 introuvable, 5 validation, 6 limite de débit, 7 serveur, 8 réseau — de quoi permettre à un pipeline de distinguer « réessaie » de « corrige ta clé ».

Jamais Bloqué Par Une Version Périmée

Un champ que l'outil ne connaît pas encore passe quand même avec --allow-unknown-fields, et tmc raw envoie n'importe quelle requête.

Testé Contre La Vraie Chose

75 tests pilotent la vraie CLI face à un simulacre de l'API en processus, via une vraie socket — les deux modes d'authentification, le découpage en lots, la sémantique des relations et le chemin de réessai.

Les Clés Sont Dans Compte → Clés D'API

Une clé est gratuite, se crée en un instant, et porte des permissions lecture / écriture / suppression, une expiration, des listes d'IP autorisées et sa propre limite de débit — donc une clé confiée à un serveur de build peut faire exactement une chose. Chaque commande, option et code de sortie est décrit dans la documentation.

Une clé est utile dès aujourd'hui — l'API est en ligne et la documentation est écrite. tmc lui-même n'est pas encore publié : pas de paquet PyPI ni de dépôt public pour l'instant, donc c'est une copie des sources jusqu'à nouvel ordre.