Инструмент командной строки (CLI)
Официальный CLI Сёги Додзё. Публикуйте статьи, загружайте партии и автоматизируйте из терминала всё, что делаете в браузере. Одни и те же команды работают в macOS, Windows и Linux.
1 Требуется: Node.js 20 или новее
У самого CLI нет зависимостей. Нужен только Node.js — и различается лишь способ его установки.
Через Homebrew:
brew install node
node --version Через winget (официальный установщик подойдёт так же):
winget install OpenJS.NodeJS.LTS
node --version В 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.
Выполните:
npm install -g @shogidojo/cli Та же команда в PowerShell:
npm install -g @shogidojo/cli В домашний каталог — тогда 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