Skip to content

Kommandozeilen-Werkzeug (CLI)

Das offizielle Shogi Dojo-CLI. Beiträge veröffentlichen, Partien hochladen und alles, was im Browser geht, aus dem Terminal automatisieren. Dieselben Befehle laufen unter macOS, Windows und Linux.

1 Voraussetzung: Node.js 20 oder neuer

Das CLI selbst hat keine Abhängigkeiten. Es braucht nur Node.js — und nur dessen Installation unterscheidet sich je nach Betriebssystem.

macOS

Mit Homebrew:

brew install node
node --version
Windows

Mit winget (der offizielle Installer geht genauso):

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

Unter Debian / Ubuntu — auf anderen Distributionen die eigene Paketverwaltung verwenden:

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

2 Installation

Der Befehl ist auf allen drei Systemen derselbe, unter Linux installiere ihn aber ins Home-Verzeichnis. Eine systemweite Installation braucht root, und für ein CLI lohnt kein sudo.

macOS

Ausführen:

npm install -g @shogidojo/cli
Windows

Derselbe Befehl in PowerShell:

npm install -g @shogidojo/cli
Linux

Ins Home-Verzeichnis, damit kein sudo nötig ist. Die zweite Zeile gehört auch in die Shell-Konfiguration (~/.bashrc oder ~/.zshrc), damit ein neues Terminal sie findet:

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

Prüfen, ob es angekommen ist:

shogidojo --version
shogidojo --help

3 Anmelden

Das CLI authentifiziert sich mit einem persönlichen API-Schlüssel. Ein Schlüssel kann alles, was dein Konto kann — behandle ihn wie dein Passwort. Eine Automatisierung kann einen eigenen benannten Schlüssel bekommen, schreibgeschützt, wenn sie nur liest.

Der übliche Weg. Ein Browser öffnet sich, du meldest dich an, und der Schlüssel kommt von selbst zurück — er steht nie auf einer Kommandozeile und landet damit nie in der Shell-Historie:

shogidojo login --browser

Auf einem per SSH erreichten Rechner reicht --browser nicht: der Schlüssel kommt an 127.0.0.1 des Rechners zurück, der den Befehl ausgeführt hat — ein Browser auf deinem eigenen Desktop hat also niemanden, dem er ihn übergeben könnte. Leite einen selbst gewählten Port weiter:

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

Oder füge einen Schlüssel ein. Er wird von der Standardeingabe gelesen und landet damit nicht in der Shell-Historie:

shogidojo login --stdin

Wo kein Browser da ist, etwa in CI, kommt er aus der Umgebung. Auf die Platte wird nichts geschrieben:

SHOGIDOJO_TOKEN=rustify… shogidojo whoami

Für CI, Windmill oder andere Automatisierungen stellst du einen eigenen benannten Schlüssel aus; der auf deinem Rechner funktioniert weiter. Der Schlüssel wird einmal angezeigt (auf stdout steht nur der Schlüssel) und nicht auf diesem Rechner gespeichert. Mit --read-only kann er lesen, aber nichts posten oder ändern:

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

Deine Schlüssel auflisten (Name, Umfang, erstellt, zuletzt benutzt, Ablauf) und einen davon widerrufen. `app` ist der Kontoschlüssel, den die Einstellungsseite ausstellt:

shogidojo token list
shogidojo token revoke 3

Der Schlüssel liegt in ~/.config/shogidojo/config.json mit Modus 0600 (unter Windows %APPDATA%\shogidojo). Ansehen und entfernen:

shogidojo whoami
shogidojo logout

4 Benutzen

Die benannten Befehle sind Abkürzungen. Alles, was die App kann, ist über call erreichbar.

Einen Artikel veröffentlichen:

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

Eine Partie hochladen:

shogidojo kif upload game.kif --dir /2026

Sehen, welche Engines zur Verfügung stehen, eine Partie analysieren und dem Lauf zusehen:

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

Ein Quiz aus einer Partie machen. --ply 44 fragt nach dem 44. Zug und zeigt die Stellung nach dem 43. Zug. --answer darf ein Zug sein, der in der Partie nicht gespielt wurde (USI oder Notation wie △5五歩); die Karte behält dann auch den tatsächlich gespielten Zug:

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

Alles Weitere — --query zum Lesen, ohne zum Schreiben:

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

Alles, was dieser Server beantwortet. Die Liste ist genau das, was call erwartet:

shogidojo procedures --grep quiz

5 Einen Beitrag schreiben

Der Text von post create ist Markdown, mit zwei Ergänzungen, die Stellungen und Partien einbetten.

[sfen:<SFEN>] zeichnet eine Stellung, [game:<gameId>] bettet eine Partiekarte ein. Alles andere ist normales Markdown:

## After ▲7六歩 △3四歩

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

[game:user-1-…]

Eine importierte Partie beginnt als PRIVATE. Ihre [game:]-Karte siehst nur du, für alle anderen Leser bleibt sie leer. Veröffentliche sie gleich beim Import mit --public, oder überlass es post create --game: Das hängt das [game:]-Token an und bricht ab, wenn eine PRIVATE-Partie in einen PUBLIC-Beitrag soll (mit --publish-game wird sie vorher veröffentlicht):

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

Für Schlüsselstellungen in einem Artikel nimm die SFEN nach Zug N und setze sie in [sfen:] (0 ist die Ausgangsstellung; ohne --ply die Schlussstellung):

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

Für dasselbe Diagramm in einem Artikel anderswo schreibst du es als SVG aus. --sfen braucht weder Konto noch Netzwerk; --game übernimmt Stellung, Spieler und das Feld des letzten Zugs aus einer Partie. Für ein PNG wandle das SVG um (rsvg-convert, ImageMagick, ein Browser):

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 ist nur ein Label und ein Feed-Filter; der Text wird gleich dargestellt. ARTICLE ist ein Artikel, KIFU stellt eine Partie vor, BOOK stellt ein Buch vor.

post create gibt die URL des Beitrags aus, /posts/<id>. Die Seite einer Partie ist /review/<gameId> (/game/<id> ist das Live-Brett), und kif import / upload geben sie aus:

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)

Grenzen: Titel 200 Zeichen, Text 50.000, bis zu 20 Tags mit je 40 Zeichen. Das CLI bricht ab, bevor es etwas darüber hinaus sendet.

6 Prozeduren für call

--describe zeigt, was call erwartet. Der Server antwortet mit dem Zod-Schema, gegen das er die Eingabe prüft, als JSON Schema — es kann also nicht von der Wirklichkeit abweichen. Eine Rückgabeform wird nur für Prozeduren gezeigt, die eine deklarieren; die gängigen stehen unten (--query für Lesezugriffe).

Sehen, was eine Prozedur erwartet:

shogidojo procedures --describe quiz.import

Partien:

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":"…"}

Beiträge:

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

Quizze (playedUsi / playedNotation sind der in der Partie gespielte Zug, gameId die Quellpartie; beides optional):

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 Wenn etwas nicht klappt

Drei Ursachen decken das meiste ab.

"Unsupported engine" oder ein Syntaxfehler heißt meist: Node ist zu alt. Nötig ist 20 oder neuer:

node --version

Scheitert die globale Installation an EACCES, verlege das Installationsziel ins Home-Verzeichnis, statt zu sudo zu greifen:

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

login --browser gibt eine URL aus, aber die Rückadresse darin zeigt auf die Loopback-Adresse des Rechners, der sie ausgegeben hat. Öffnest du die URL auf einem anderen Rechner, meldest du dich dort an und der Schlüssel kommt nirgends an. Über SSH also einen Port weiterleiten und mit --port übergeben — oder den Schlüssel mit --stdin einfügen; beides steht oben:

shogidojo login --stdin