Skip to content

Outil en ligne de commande (CLI)

La CLI officielle de Shogi Dojo. Publiez des articles, envoyez des parties et automatisez depuis un terminal tout ce que vous faites dans le navigateur. Les mêmes commandes fonctionnent sur macOS, Windows et Linux.

1 Prérequis : Node.js 20 ou plus récent

La CLI n'a aucune dépendance. Il lui faut seulement Node.js — et seule son installation diffère selon le système.

macOS

Avec Homebrew :

brew install node
node --version
Windows

Avec winget (l'installateur officiel convient aussi) :

winget install OpenJS.NodeJS.LTS
node --version
Linux

Sur Debian / Ubuntu — utilisez votre gestionnaire de paquets sur les autres distributions :

curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt install -y nodejs
node --version

2 Installation

La commande est la même sur les trois systèmes, mais sous Linux installez-la dans votre répertoire personnel. Une installation système exige root, et un CLI ne vaut pas un sudo.

macOS

Exécutez :

npm install -g @shogidojo/cli
Windows

La même commande, dans PowerShell :

npm install -g @shogidojo/cli
Linux

Dans votre répertoire personnel, donc sans sudo. Mettez aussi la deuxième ligne dans votre profil de shell (~/.bashrc ou ~/.zshrc) pour qu'un nouveau terminal la trouve :

npm install -g --prefix ~/.local @shogidojo/cli
export PATH="$HOME/.local/bin:$PATH"

Vérifiez que c'est en place :

shogidojo --version
shogidojo --help

3 Connexion

La CLI s'authentifie avec une clé d'API personnelle. Une clé peut tout ce que votre compte peut : traitez-la comme votre mot de passe. Une automatisation peut avoir sa propre clé nommée, en lecture seule si elle ne fait que lire.

La méthode habituelle. Un navigateur s'ouvre, vous vous connectez, et la clé revient d'elle-même — elle n'apparaît jamais sur une ligne de commande, donc jamais dans l'historique du shell :

shogidojo login --browser

Sur une machine atteinte en SSH, --browser seul ne peut pas aboutir : la clé revient sur le 127.0.0.1 de la machine qui a lancé la commande, donc un navigateur sur votre poste n'a personne à qui la remettre. Redirigez un port de votre choix :

ssh -L 47311:127.0.0.1:47311 you@host
shogidojo login --browser --port 47311

Ou collez une clé. Elle est lue sur l'entrée standard, elle ne passe donc pas par l'historique du shell :

shogidojo login --stdin

Là où il n'y a pas de navigateur, en CI par exemple, passez-la par l'environnement. Rien n'est écrit sur le disque :

SHOGIDOJO_TOKEN=rustify… shogidojo whoami

Pour la CI, Windmill ou toute autre automatisation, émettez une clé nommée distincte ; celle de votre machine continue de fonctionner. La clé n'est affichée qu'une fois (stdout ne contient que la clé) et n'est pas enregistrée sur cette machine. Avec --read-only, elle peut lire mais ni publier ni rien modifier :

shogidojo token create --name windmill --read-only --days 90

Lister vos clés (nom, portée, création, dernière utilisation, expiration) et en révoquer une. `app` est la clé du compte, celle qu'émet la page des paramètres :

shogidojo token list
shogidojo token revoke 3

La clé est enregistrée dans ~/.config/shogidojo/config.json en mode 0600 (%APPDATA%\shogidojo sous Windows). Pour la voir ou l'effacer :

shogidojo whoami
shogidojo logout

4 Utilisation

Les commandes nommées sont des raccourcis. Tout ce que fait l'application est accessible via call.

Publier un article :

shogidojo post create --title "..." --body-file note.md --tag 居飛車

Envoyer une partie :

shogidojo kif upload game.kif --dir /2026

Voir les moteurs disponibles, analyser une partie et suivre l'avancement :

shogidojo engines
shogidojo analyze game.kif --seconds 5
shogidojo jobs

Créer un quiz à partir d'une partie. --ply 44 demande le coup 44 et montre la position après le coup 43. --answer peut être un coup qui n'a pas été joué dans la partie (USI, ou notation comme △5五歩) ; la carte garde alors aussi le coup réellement joué :

shogidojo quiz create --game user-1-… --ply 44 --answer △5五歩 --note "Suggested in the post-mortem" --deck Ryuo --public

Tout le reste — --query pour lire, omis pour écrire :

shogidojo call post.list --query --input '{"page":1}'
shogidojo call quiz.createDeck --input '{"name":"..."}'

Tout ce que ce serveur accepte. Cette liste est exactement ce que prend call :

shogidojo procedures --grep quiz

5 Rédiger une publication

Le corps de post create est en Markdown, avec deux ajouts qui intègrent des positions et des parties.

[sfen:<SFEN>] dessine une position et [game:<gameId>] intègre une carte de partie. Le reste est du Markdown ordinaire :

## After ▲7六歩 △3四歩

[sfen:lnsgkgsnl/1r5b1/pppppp1pp/6p2/9/2P6/PP1PPPPPP/1B5R1/LNSGKGSNL b - 3]

[game:user-1-…]

Une partie importée commence en PRIVATE. Sa carte [game:] s'affiche pour vous et reste vide pour tous les autres lecteurs. Publiez-la dès l'import avec --public, ou laissez faire post create --game, qui ajoute le jeton [game:] et s'arrête si une partie PRIVATE doit entrer dans une publication PUBLIC (ajoutez --publish-game pour la publier d'abord) :

shogidojo kif import game.kif --public
shogidojo post create --type KIFU --title "..." --body-file note.md --game user-1-… --publish-game

Pour placer des positions clés dans un article, prenez le SFEN après le coup N et mettez-le dans [sfen:] (0 est la position de départ ; sans --ply, la position finale) :

shogidojo kif position user-1-… --ply 60

Pour le même diagramme dans un article ailleurs, exportez-le en SVG. --sfen ne demande ni compte ni réseau ; --game prend dans une partie la position, les joueurs et la case du dernier coup. Pour un PNG, convertissez le SVG (rsvg-convert, ImageMagick, un navigateur) :

shogidojo diagram --sfen "lnsgkgsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL b - 1" -o start.svg
shogidojo diagram --game user-1-… --ply 60 -o move60.svg
rsvg-convert -o move60.png move60.svg

--type n'est qu'une étiquette et un filtre du fil ; le corps s'affiche de la même façon. ARTICLE est un article, KIFU présente une partie, BOOK présente un livre.

post create affiche l'URL de la publication, /posts/<id>. La page d'une partie est /review/<gameId> (/game/<id> est le plateau en direct), et c'est elle qu'affichent kif import / upload :

Posted #12  https://shogidojo.online/posts/12
Imported game.kif as user-1-…
  https://shogidojo.online/review/user-1-…  (private — only you can open it)

Limites : titre de 200 caractères, corps de 50 000, jusqu'à 20 tags de 40 caractères chacun. La CLI s'arrête avant d'envoyer quoi que ce soit au-delà.

6 Procédures pour call

--describe indique ce que prend call. Le serveur répond avec le schéma Zod qui valide l'entrée, au format JSON Schema ; il ne peut donc pas s'écarter de la réalité. La forme du résultat n'apparaît que pour les procédures qui en déclarent une ; les plus courantes figurent ci-dessous (ajoutez --query pour une lecture).

Voir ce que prend une procédure :

shogidojo procedures --describe quiz.import

Parties :

game.importKifFromText        {"kifText":"…","dir":"/2026"}
  → {"game_id":"user-1-…"}
game.setGameVisibility        {"gameId":"user-1-…","visibility":"PUBLIC"}
  → {"success":true}
game.getFullGameById (read)   {"gameId":"user-1-…"}
  → {"game_id":…, "visibility":…, "moves":[{"id":1, "moveNumber":0, "sfen":"…",
       "children":[{"childId":2, "usi":"7g7f", "notation":"▲7六歩"}]}, …]}
game.applyMove (read)         {"sfen":"…","move":"△5五歩","lastUsi":"7g7f"}
  → {"sfen":"…","usi":"5d5e","notation":"△5五歩","nextSfen":"…"}

Publications :

post.create   {"type":"KIFU","title":"…","body":"…","tags":["居飛車"],"visibility":"PUBLIC"}
  → {"id":12, …}

Quiz (playedUsi / playedNotation sont le coup joué dans la partie, gameId la partie d'origine ; tous deux facultatifs) :

quiz.import   {"title":"…","visibility":"PUBLIC","gameId":"user-1-…",
               "items":[{"sfen":"…","answerUsi":"5d5e","answerNotation":"△5五歩",
                         "nextSfen":"…","note":"…",
                         "playedUsi":"8a7c","playedNotation":"△7三桂"}]}
  → {"deckId":5,"listIds":[9]}
  (or {"deck":{"title":"…"},"lists":[ …the same list… ]} for a named deck)

7 En cas de problème

Trois causes expliquent l'essentiel.

Un message « Unsupported engine » ou une erreur de syntaxe signifie en général que Node est trop ancien. Il faut la version 20 ou plus :

node --version

Si l'installation globale échoue avec EACCES, déplacez le préfixe d'installation dans votre dossier personnel plutôt que d'utiliser sudo :

npm config set prefix ~/.local
export PATH="$HOME/.local/bin:$PATH"

login --browser affiche une URL, mais l'adresse de retour qu'elle contient désigne la boucle locale de la machine qui l'a affichée. Ouvrir cette URL sur une autre machine vous connecte là-bas et la clé n'arrive nulle part. En SSH, redirigez un port et passez-le avec --port, ou collez la clé avec --stdin : les deux sont ci-dessus :

shogidojo login --stdin