Skip to content

Herramienta de línea de comandos (CLI)

La CLI oficial de Shogi Dojo. Publica artículos, sube partidas y automatiza desde la terminal todo lo que puedes hacer en el navegador. Los mismos comandos funcionan en macOS, Windows y Linux.

1 Requisito: Node.js 20 o superior

La CLI no tiene dependencias. Solo necesita Node.js, y lo único que cambia según el sistema es cómo instalarlo.

macOS

Con Homebrew:

brew install node
node --version
Windows

Con winget (el instalador oficial sirve igual):

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

En Debian / Ubuntu — en otras distribuciones usa tu gestor de paquetes:

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

2 Instalación

El comando es el mismo en los tres sistemas, pero en Linux instálalo en tu carpeta personal. Una instalación para todo el sistema necesita root, y un CLI no merece un sudo.

macOS

Ejecuta:

npm install -g @shogidojo/cli
Windows

El mismo comando, en PowerShell:

npm install -g @shogidojo/cli
Linux

En tu carpeta personal, así no hace falta sudo. Pon también la segunda línea en el perfil de tu shell (~/.bashrc o ~/.zshrc) para que una terminal nueva la encuentre:

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

Comprueba que quedó instalada:

shogidojo --version
shogidojo --help

3 Iniciar sesión

La CLI se autentica con una clave de API personal. Una clave puede hacer todo lo que puede tu cuenta: trátala como tu contraseña. Una automatización puede tener su propia clave con nombre, de solo lectura si solo lee.

La forma habitual. Se abre el navegador, inicias sesión y la clave vuelve sola — nunca aparece en la línea de comandos, así que nunca llega al historial del shell:

shogidojo login --browser

En una máquina a la que llegaste por SSH, --browser por sí solo no puede terminar: la clave vuelve al 127.0.0.1 de la máquina que ejecutó el comando, así que un navegador en tu escritorio no tiene a quién entregarla. Redirige un puerto que elijas tú:

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

O pega una clave. Se lee de la entrada estándar, así que no llega al historial del shell:

shogidojo login --stdin

Donde no hay navegador, como en CI, pásala por el entorno. No se escribe nada en disco:

SHOGIDOJO_TOKEN=rustify… shogidojo whoami

Para CI, Windmill o cualquier otra automatización, emite una clave aparte con nombre; la de tu máquina sigue funcionando. La clave se muestra una sola vez (stdout lleva solo la clave) y no se guarda en esta máquina. Con --read-only puede leer, pero no publicar ni cambiar nada:

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

Lista las claves que tienes (nombre, alcance, creación, último uso, caducidad) y revoca una de ellas. `app` es la clave de la cuenta, la que emite la página de ajustes:

shogidojo token list
shogidojo token revoke 3

La clave se guarda en ~/.config/shogidojo/config.json con permisos 0600 (%APPDATA%\shogidojo en Windows). Para verla o borrarla:

shogidojo whoami
shogidojo logout

4 Uso

Los comandos con nombre son atajos. Todo lo que hace la aplicación es accesible mediante call.

Publicar un artículo:

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

Subir una partida:

shogidojo kif upload game.kif --dir /2026

Ver qué motores puedes usar, analizar una partida y seguir su avance:

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

Crear un quiz a partir de una partida. --ply 44 pregunta por la jugada 44 y muestra la posición tras la jugada 43. --answer puede ser una jugada que no se jugó en la partida (USI, o notación como △5五歩); la tarjeta conserva entonces también la jugada que se jugó:

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

Todo lo demás — --query para leer, sin él para escribir:

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

Todo lo que este servidor admite. La lista es exactamente lo que recibe call:

shogidojo procedures --grep quiz

5 Escribir una publicación

El cuerpo de post create es Markdown, con dos añadidos que incrustan tableros y partidas.

[sfen:<SFEN>] dibuja una posición y [game:<gameId>] incrusta una tarjeta de partida. Todo lo demás es Markdown normal:

## After ▲7六歩 △3四歩

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

[game:user-1-…]

Una partida importada empieza como PRIVATE. Su tarjeta [game:] se ve para ti y aparece vacía para cualquier otro lector. Publícala al importarla con --public, o deja que lo haga post create --game, que añade el token [game:] y se detiene si una partida PRIVATE va a entrar en una publicación PUBLIC (añade --publish-game para publicarla antes):

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

Para poner posiciones clave en un artículo, toma el SFEN tras la jugada N y ponlo en [sfen:] (0 es el inicio; sin --ply, la posición final):

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

Para usar el mismo diagrama en un artículo en otro sitio, expórtalo como SVG. --sfen no necesita cuenta ni red; --game toma de una partida la posición, los jugadores y la casilla de la última jugada. Para un PNG, convierte el SVG (rsvg-convert, ImageMagick, un navegador):

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 es solo una etiqueta y un filtro del feed; el cuerpo se muestra igual. ARTICLE es un artículo, KIFU presenta una partida, BOOK presenta un libro.

post create imprime la URL de la publicación, /posts/<id>. La página de una partida es /review/<gameId> (/game/<id> es el tablero en vivo), y kif import / upload la imprimen:

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)

Límites: título de 200 caracteres, cuerpo de 50.000, hasta 20 etiquetas de 40 caracteres cada una. La CLI se detiene antes de enviar nada que los supere.

6 Procedimientos para call

--describe te dice qué recibe call. El servidor responde con el esquema Zod con el que valida la entrada, como JSON Schema, así que no puede desviarse de la realidad. La forma del resultado solo aparece en los procedimientos que la declaran; los habituales están abajo (añade --query para una lectura).

Ver qué recibe un procedimiento:

shogidojo procedures --describe quiz.import

Partidas:

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

Publicaciones:

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

Quizzes (playedUsi / playedNotation son la jugada que se jugó en la partida, gameId la partida de origen; ambos opcionales):

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 Si algo falla

Tres causas explican casi todo.

Un mensaje "Unsupported engine" o un error de sintaxis suele significar que Node es demasiado antiguo. Hace falta 20 o superior:

node --version

Si la instalación global falla con EACCES, mueve el prefijo de instalación a tu carpeta personal en vez de recurrir a sudo:

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

login --browser imprime una URL, pero la dirección de retorno que lleva dentro apunta al bucle local de la máquina que la imprimió. Abrir esa URL en otra máquina te conecta allí y la clave no llega a ninguna parte. Por SSH, redirige un puerto y pásalo con --port, o pega la clave con --stdin; los dos están arriba:

shogidojo login --stdin