命令行工具 (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,而一个命令行工具不值得动用 sudo。
执行:
npm install -g @shogidojo/cli 在 PowerShell 里也是同一条命令:
npm install -g @shogidojo/cli 装到主目录,因此不需要 sudo。第二行也写进 shell 配置(~/.bashrc 或 ~/.zshrc),新开的终端才找得到:
npm install -g --prefix ~/.local @shogidojo/cli
export PATH="$HOME/.local/bin:$PATH" 确认安装成功:
shogidojo --version
shogidojo --help 3 登录
CLI 使用个人 API 密钥认证。密钥拥有与账号相同的权限,请像对待密码一样保管。自动化任务可以拥有自己的命名密钥;如果只需读取,还可以设为只读。
常用方式。浏览器会打开,登录后密钥自动返回 —— 它不会出现在命令行上,因此不会留在 shell 历史里:
shogidojo login --browser 在通过 SSH 连上的机器上,只用 --browser 无法完成:密钥会回到执行命令那台机器的 127.0.0.1,所以你本地的浏览器无处交付。请自行选一个端口并转发:
ssh -L 47311:127.0.0.1:47311 you@host
shogidojo login --browser --port 47311 也可以粘贴密钥。它从标准输入读取,因此不会留在 shell 历史里:
shogidojo login --stdin 没有浏览器的地方(例如 CI)改用环境变量传入,不会写入磁盘:
SHOGIDOJO_TOKEN=rustify… shogidojo whoami CI、Windmill 或其他自动化任务请另行签发一个命名密钥;你本机上的密钥照常可用。新密钥只显示一次(标准输出中只有密钥本身),也不会保存在这台机器上。加上 --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 要在文章中放关键局面,取出第 N 手之后的 SFEN 填入 [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 会打印文章的网址 /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 可用的过程
call 接受什么,可以用 --describe 查看。服务器会把它用来校验输入的 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 会打印一个网址,但其中的回调地址指向打印它那台机器的本机回环。在另一台机器上打开,登录发生在那一边,密钥不会到任何地方。走 SSH 时请转发端口并用 --port 传入,或用 --stdin 粘贴密钥——两者都在上面:
shogidojo login --stdin