Skip to content

Инструмент командной строки (CLI)

Официальный CLI Сёги Додзё. Публикуйте статьи, загружайте партии и автоматизируйте из терминала всё, что делаете в браузере. Одни и те же команды работают в macOS, Windows и Linux.

1 Требуется: Node.js 20 или новее

У самого CLI нет зависимостей. Нужен только Node.js — и различается лишь способ его установки.

macOS

Через Homebrew:

brew install node
node --version
Windows

Через winget (официальный установщик подойдёт так же):

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

В Debian / Ubuntu — в других дистрибутивах используйте свой пакетный менеджер:

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

2 Установка

Команда одна и та же на всех трёх системах, но в Linux ставьте её в домашний каталог. Установка на всю систему требует root, а ради CLI нет смысла браться за sudo.

macOS

Выполните:

npm install -g @shogidojo/cli
Windows

Та же команда в PowerShell:

npm install -g @shogidojo/cli
Linux

В домашний каталог — тогда sudo не нужен. Вторую строку добавьте и в профиль оболочки (~/.bashrc или ~/.zshrc), чтобы её нашёл новый терминал:

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

Проверьте, что установилось:

shogidojo --version
shogidojo --help

3 Вход

CLI аутентифицируется личным API-ключом. Ключ может всё, что может ваша учётная запись, — относитесь к нему как к паролю. Для автоматизации можно выпустить отдельный именованный ключ — только для чтения, если она только читает.

Обычный способ. Откроется браузер, вы входите, и ключ возвращается сам — он никогда не попадает в командную строку, а значит и в историю оболочки:

shogidojo login --browser

На машине, до которой вы дошли по SSH, одного --browser недостаточно: ключ возвращается на 127.0.0.1 той машины, где выполнена команда, так что браузеру на вашем столе его некому отдать. Перенаправьте выбранный вами порт:

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

Либо вставьте ключ. Он читается со стандартного ввода и потому не попадает в историю оболочки:

shogidojo login --stdin

Там, где браузера нет (например, в CI), передайте его через переменную окружения. На диск ничего не пишется:

SHOGIDOJO_TOKEN=rustify… shogidojo whoami

Для CI, Windmill или любой другой автоматизации выпустите отдельный именованный ключ; ключ на вашей машине продолжит работать. Ключ показывается один раз (в stdout выводится только сам ключ) и не сохраняется на этой машине. С --read-only он может читать, но не может публиковать или что-либо изменять:

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

Посмотреть список своих ключей (имя, область действия, создан, последнее использование, срок действия) и отозвать один из них. `app` — ключ учётной записи, тот, что выдаёт страница настроек:

shogidojo token list
shogidojo token revoke 3

Ключ хранится в ~/.config/shogidojo/config.json с правами 0600 (в Windows — %APPDATA%\shogidojo). Посмотреть и удалить:

shogidojo whoami
shogidojo logout

4 Использование

Именованные команды — это сокращения. Всё, что умеет приложение, доступно через call.

Опубликовать статью:

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

Загрузить запись партии:

shogidojo kif upload game.kif --dir /2026

Посмотреть доступные движки, разобрать партию и следить за ходом:

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

Создать викторину из партии. --ply 44 спрашивает 44-й ход и показывает позицию после 43-го. --answer может быть ходом, которого в партии не было (USI или запись вида △5五歩); тогда карточка сохраняет и сыгранный ход:

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

Всё остальное — --query для чтения, без него для записи:

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

Всё, что можно спросить у этого сервера. Этот список — ровно то, что принимает call:

shogidojo procedures --grep quiz

5 Как написать пост

Текст post create — это Markdown с двумя дополнениями для встраивания позиций и партий.

[sfen:<SFEN>] рисует позицию, а [game:<gameId>] встраивает карточку партии. Всё остальное — обычный Markdown:

## After ▲7六歩 △3四歩

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

[game:user-1-…]

Импортированная партия начинается как PRIVATE. Её карточка [game:] видна вам, а для всех остальных читателей пуста. Опубликуйте партию при импорте через --public или поручите это post create --game: он добавит токен [game:] и остановится, если PRIVATE-партия попадает в PUBLIC-пост (добавьте --publish-game, чтобы сначала её опубликовать):

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

Чтобы поставить в статью ключевые позиции, возьмите SFEN после хода N и вставьте его в [sfen:] (0 — начальная позиция; без --ply — финальная):

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

Чтобы использовать ту же диаграмму в статье на другом сайте, выведите её в SVG. --sfen не нужны ни учётная запись, ни сеть; --game берёт из партии позицию, игроков и поле последнего хода. Для PNG сконвертируйте SVG (rsvg-convert, ImageMagick, браузер):

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 — это только метка и фильтр ленты; текст отображается одинаково. ARTICLE — статья, KIFU представляет запись партии, BOOK представляет книгу.

post create печатает URL поста, /posts/<id>. Страница партии — /review/<gameId> (/game/<id> — доска в реальном времени), и именно её печатают 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)

Ограничения: заголовок 200 символов, текст 50 000, до 20 тегов по 40 символов. CLI остановится, не отправив ничего сверх этого.

6 Процедуры для call

--describe показывает, что принимает call. Сервер отвечает той самой схемой Zod, по которой проверяет ввод, в виде JSON Schema, поэтому она не может разойтись с действительностью. Форма результата показывается только для процедур, которые её объявляют; распространённые приведены ниже (для чтения добавьте --query).

Посмотреть, что принимает процедура:

shogidojo procedures --describe quiz.import

Записи партий:

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

Посты:

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

Викторины (playedUsi / playedNotation — ход, сыгранный в партии, gameId — исходная партия; оба необязательны):

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 Если что-то не работает

Три причины покрывают почти всё.

Сообщение «Unsupported engine» или синтаксическая ошибка обычно значат, что Node слишком старый. Нужен 20 или новее:

node --version

Если глобальная установка падает с EACCES, перенесите каталог установки в домашнюю папку вместо того, чтобы брать sudo:

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

login --browser печатает URL, но адрес возврата внутри него указывает на локальную петлю той машины, которая его напечатала. Откроете этот URL на другой машине — войдёте там, а ключ не придёт никуда. По SSH перенаправьте порт и передайте его через --port либо вставьте ключ через --stdin; и то и другое выше:

shogidojo login --stdin