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 नहीं चाहिए। दूसरी पंक्ति अपने shell प्रोफ़ाइल (~/.bashrc या ~/.zshrc) में भी डाल दें, ताकि नया टर्मिनल भी उसे पा सके:

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

जाँचें कि स्थापित हो गया:

shogidojo --version
shogidojo --help

3 साइन इन

CLI व्यक्तिगत API कुंजी से प्रमाणित होता है। कुंजी वह सब कर सकती है जो आपका खाता कर सकता है — उसे पासवर्ड की तरह सँभालें। किसी ऑटोमेशन को उसकी अपनी नामित कुंजी दी जा सकती है — अगर वह केवल पढ़ता है तो read-only।

सामान्य तरीका। ब्राउज़र खुलता है, आप साइन इन करते हैं, और कुंजी अपने आप लौट आती है — वह कभी कमांड-लाइन पर नहीं आती, इसलिए शेल इतिहास में भी नहीं जाती:

shogidojo login --browser

SSH से पहुँची मशीन पर अकेला --browser पूरा नहीं हो सकता: कुंजी उसी मशीन के 127.0.0.1 पर लौटती है जहाँ कमांड चला, इसलिए आपके अपने डेस्कटॉप के ब्राउज़र के पास उसे देने वाला कोई नहीं। अपना चुना हुआ एक पोर्ट फ़ॉरवर्ड करें:

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

या कुंजी पेस्ट करें। वह standard input से पढ़ी जाती है, इसलिए shell के इतिहास में नहीं जाती:

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

लेख में मुख्य स्थितियाँ रखने के लिए चाल 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 पोस्ट का 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 के लिए प्रक्रियाएँ

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 एक URL छापता है, पर उसमें लौटने का पता उसी मशीन के loopback का है जिसने उसे छापा। उस URL को दूसरी मशीन पर खोलने से साइन-इन वहीं पूरा होता है और कुंजी कहीं नहीं पहुँचती। SSH पर एक पोर्ट फ़ॉरवर्ड कर --port से दें, या --stdin से कुंजी पेस्ट करें — दोनों ऊपर हैं:

shogidojo login --stdin