Skip to content

Ferramenta de linha de comandos (CLI)

A CLI oficial do Shogi Dojo. Publique artigos, envie partidas e automatize no terminal tudo o que faz no navegador. Os mesmos comandos funcionam em macOS, Windows e Linux.

1 Necessário: Node.js 20 ou mais recente

A CLI não tem dependências. Só precisa de Node.js — e a única coisa que muda conforme o sistema é como o instalar.

macOS

Com Homebrew:

brew install node
node --version
Windows

Com winget (o instalador oficial serve igualmente):

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

Em Debian / Ubuntu — noutras distribuições use o seu gestor de pacotes:

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

2 Instalação

O comando é o mesmo nos três sistemas, mas no Linux instale na sua pasta pessoal. Uma instalação para todo o sistema pede root, e um CLI não justifica um sudo.

macOS

Execute:

npm install -g @shogidojo/cli
Windows

O mesmo comando, no PowerShell:

npm install -g @shogidojo/cli
Linux

Na sua pasta pessoal, então não é preciso sudo. Coloque a segunda linha também no perfil do shell (~/.bashrc ou ~/.zshrc), para um terminal novo continuar a encontrá-la:

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

Confirme que ficou instalada:

shogidojo --version
shogidojo --help

3 Iniciar sessão

A CLI autentica-se com uma chave de API pessoal. Uma chave faz tudo o que a sua conta faz: trate-a como a sua palavra-passe. Uma automação pode ter a sua própria chave com nome, só de leitura se apenas lê.

A forma habitual. Abre-se um navegador, inicia sessão e a chave regressa sozinha — nunca aparece numa linha de comandos, por isso nunca chega ao histórico da shell:

shogidojo login --browser

Numa máquina alcançada por SSH, --browser sozinho não conclui: a chave volta para o 127.0.0.1 da máquina que executou o comando, então um navegador no seu computador não tem a quem entregá-la. Encaminhe uma porta escolhida por você:

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

Ou cole uma chave. Ela é lida da entrada padrão, portanto não vai para o histórico do shell:

shogidojo login --stdin

Onde não há navegador, como em CI, passe-a pelo ambiente. Nada é escrito no disco:

SHOGIDOJO_TOKEN=rustify… shogidojo whoami

Para CI, Windmill ou qualquer outra automação, emita uma chave com nome à parte; a da sua máquina continua a funcionar. A chave é mostrada uma única vez (o stdout traz apenas a chave) e não fica guardada nesta máquina. Com --read-only pode ler, mas não publicar nem alterar nada:

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

Listar as chaves que tem (nome, âmbito, criação, última utilização, expiração) e revogar uma delas. `app` é a chave da conta, a que a página de definições emite:

shogidojo token list
shogidojo token revoke 3

A chave fica em ~/.config/shogidojo/config.json com modo 0600 (%APPDATA%\shogidojo no Windows). Para ver ou remover:

shogidojo whoami
shogidojo logout

4 Utilização

Os comandos com nome são atalhos. Tudo o que a aplicação faz está acessível através de call.

Publicar um artigo:

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

Enviar uma partida:

shogidojo kif upload game.kif --dir /2026

Ver quais motores estão disponíveis, analisar uma partida e acompanhar o progresso:

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

Criar um quiz a partir de uma partida. --ply 44 pergunta pelo lance 44, mostrando a posição depois do lance 43. --answer pode ser um lance que não foi jogado na partida (USI, ou notação como △5五歩); nesse caso o cartão guarda também o lance jogado:

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

Tudo o resto — --query para ler, omitido para escrever:

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

Tudo o que este servidor aceita. A lista é exatamente o que call recebe:

shogidojo procedures --grep quiz

5 Escrever uma publicação

O corpo de post create é Markdown, com dois acréscimos que incorporam tabuleiros e partidas.

[sfen:<SFEN>] desenha uma posição e [game:<gameId>] incorpora um cartão de partida. O resto é Markdown normal:

## After ▲7六歩 △3四歩

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

[game:user-1-…]

Uma partida importada começa como PRIVATE. O seu cartão [game:] aparece para si e fica em branco para qualquer outro leitor. Publique-a ao importá-la com --public, ou deixe isso para post create --game, que acrescenta o token [game:] e para se uma partida PRIVATE estiver prestes a entrar numa publicação PUBLIC (acrescente --publish-game para a publicar primeiro):

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

Para colocar posições-chave num artigo, obtenha o SFEN após o lance N e coloque-o em [sfen:] (0 é o início; sem --ply, a posição final):

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

Para o mesmo diagrama num artigo noutro sítio, exporte-o como SVG. --sfen não precisa de conta nem de rede; --game tira de uma partida a posição, os jogadores e a casa do último lance. Para um PNG, converta o SVG (rsvg-convert, ImageMagick, um 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 é só uma etiqueta e um filtro do feed; o corpo é apresentado da mesma forma. ARTICLE é um artigo, KIFU apresenta uma partida, BOOK apresenta um livro.

post create imprime a URL da publicação, /posts/<id>. A página de uma partida é /review/<gameId> (/game/<id> é o tabuleiro ao vivo), e é essa que kif import / upload imprimem:

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: título de 200 caracteres, corpo de 50 000, até 20 etiquetas de 40 caracteres cada. A CLI para antes de enviar seja o que for que os ultrapasse.

6 Procedimentos para call

--describe diz-lhe o que call recebe. O servidor responde com o esquema Zod com que valida a entrada, em JSON Schema, por isso não pode afastar-se da realidade. A forma do resultado só aparece nos procedimentos que a declaram; os mais comuns estão abaixo (acrescente --query para uma leitura).

Ver o que um procedimento recebe:

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

Publicações:

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

Quizzes (playedUsi / playedNotation são o lance jogado na partida, gameId a partida de origem; ambos opcionais):

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 Se algo correr mal

Três causas explicam quase tudo.

Uma mensagem "Unsupported engine" ou um erro de sintaxe costuma significar que o Node é demasiado antigo. É preciso a 20 ou mais recente:

node --version

Se a instalação global falhar com EACCES, mova o prefixo de instalação para a sua pasta pessoal em vez de recorrer a sudo:

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

login --browser imprime uma URL, mas o endereço de retorno dentro dela aponta para o loopback da máquina que a imprimiu. Abrir essa URL noutra máquina faz o login lá e a chave não chega a lugar nenhum. Por SSH, encaminhe uma porta e passe-a com --port, ou cole a chave com --stdin — os dois estão acima:

shogidojo login --stdin