Komentoriviliittymä (CLI)

Johdanto

blunderDB sisältää täydellisen komentoriviliittymän (CLI) samassa suoritettavassa tiedostossa kuin graafinen käyttöliittymä. CLI on erityisen hyödyllinen seuraaviin tarkoituksiin:

  • ottelujen massatuonti: koko hakemistollinen ottelutiedostoja (XG, SGF, MAT, BGF…) tuodaan yhdellä komennolla,

  • automaatio: blunderDB:n integrointi shell-skripteihin säännöllisiä varmuuskopioita, ajastettuja vientejä tai käsittelyputkia varten,

  • palvelinkäyttö: tietokantojen hallinta koneilla, joilla ei ole graafista ympäristöä,

  • nopea tarkastus: tietokannan sisällön tai eheyden tarkistaminen käynnistämättä graafista käyttöliittymää.

CLI käyttää täsmälleen samaa tietokantamuotoa kuin graafinen käyttöliittymä: molemmat kirjoittavat samaa tiedostoa, eikä mitään tarvitse synkronoida.

Muista

Jos sovellus on auki samalla kun skripti kirjoittaa. Tiedosto on WAL-tilassa: luku ei koskaan estä kirjoitusta, ja molemmat ohjelmat työskentelevät samassa tietokannassa toisiaan häiritsemättä. Kaksi kirjoitusta sen sijaan seuraavat toisiaan — jälkimmäinen odottaa kirjoituslukkoa (kymmenen sekuntia lausetta kohti ja muutama uudelleenyritys päälle) eikä epäonnistu ennen kuin odotusaika on kulunut umpeen, jolloin viesti mainitsee SQLiten:

Error: failed to import match: sqlite: save match: database is locked (5) (SQLITE_BUSY)

Graafinen käyttöliittymä ei tarkkaile tiedostoa: se näyttää edelleen sitä, minkä oli ladannut, kunnes CTRL-R lataa asemat uudelleen. Mitään ei menetetä, mutta näyttö on tietokantaa jäljessä.

Yleinen syntaksi

Tila tunnistetaan automaattisesti: jos ensimmäinen argumentti on CLI-komento, blunderDB käynnistyy headless-tilassa, muuten se käynnistää graafisen käyttöliittymän.

# GUI
./blunderdb

# CLI
./blunderdb <command> [options]

Tämän sivun esimerkeissä kirjoitetaan ./blunderdb: binääri sellaisena kuin se ladataan, kutsuttuna siitä kansiosta, jossa se sijaitsee. Paketista asennettuna tai PATH-kansiosta linkitettynä (katso Lataaminen ja asentaminen) se on yksinkertaisesti blunderdb.

Totuusarvoiset valitsimet, joiden kohdalla lukee ”oletus: kyllä”, poistetaan käytöstä muodolla --option=false — --recursive=false, --analysis=false. Välilyönnillä erotettua muotoa ei ole: --recursive false jättää valitsimen oletusarvoonsa ja käsittelee sanaa false yhtenä argumenttina liikaa.

Käytettävissä olevat komennot

Komento

Kuvaus

create

Luo uusi tietokanta.

import

Tuo tietoja (ottelu, asema, erä).

export

Vie tietoja.

identity

Näyttää tai siirtää liikkeeseenlaskijan identiteetin (vesileimojen allekirjoitusavain).

open

Muuntaa salasanalla suojatun tiedoston (.dbx) tavalliseksi tietokannaksi.

search

Hae asemia suodattimilla.

list

Näytä tietokannan sisältö.

match

Näytä ottelun asemat ja analyysit.

collection

Hallitsee kokoelmia (luettelo, sisältö, luonti, uudelleennimeäminen, poisto, vienti).

anki

Välitoistopakat (luettelo, tilastot, ennuste, synkronointi).

rollout

Pelaa aseman loppuun asti erottaakseen sen siirrot tai tuplauspäätöksen toisistaan (XGID tai OGID).

epc

Laskee ulosajoaseman (XGID tai OGID) Effective Pip Countin ja kuutiotuomion.

bearoff

Luo, listaa, tarkistaa ja poistaa bearoff-tietokantoja.

analyze

Kirjoittaa gammonNet-analyysin jokaiselle asemalle, jolla ei ole yhtään analyysiä.

info

Näytä tietokannan metatiedot.

edit

Muokkaa tietokannan metatietoja ja kynnysarvoja.

verify

Tarkista tietokannan eheys.

vacuum

Tiivistää tietokantatiedoston ja ottaa vapautuneen tilan takaisin.

repair

Laskee uudelleen sen, minkä tietokanta johtaa siitä mitä se tallentaa.

delete

Poista tietoja.

healthcheck

Kysyy käynnissä olevalta serve-taustaprosessilta: paluukoodi 0, jos se on valmis.

mcp

Tarjoaa tietokannan työkalut tekoälyavustajalle (Model Context Protocol).

completion

Tulostaa shell-täydennysskriptin (bash, zsh, fish).

help

Näytä ohje.

version

Näytä versio.

serve, migrate, call

Palvelintila ja siirto PostgreSQL:ään: ks. Headless-tila (palvelin).

Jokainen komento hyväksyy --help-valitsimen yksityiskohtaisen ohjeen näyttämiseksi.

create — Luo tietokanta

Luo uusi tietokantatiedosto valinnaisilla metatiedoilla.

./blunderdb create --db <path> [--user <name>] [--description <text>] [--force]

Valitsimet:

  • --db — Luotavan tietokantatiedoston polku (pakollinen).

  • --user — Tietokannan omistajan nimi.

  • --description — Tietokannan kuvaus.

  • --force — Korvaa tiedosto, jos se on jo olemassa.

  • --format — Tulostusmuoto: text (oletus) tai json (polku, versio, käyttäjä, kuvaus, luontipäivä).

.db-pääte lisätään automaattisesti, jos se puuttuu. Ylähakemistot luodaan tarvittaessa.

Esimerkki:

./blunderdb create --db mes_matchs.db --user "Jean" --description "Matchs de tournoi 2025"

import — Tuo tietoja

Tuo ottelu- tai asematiedostoja tietokantaan.

./blunderdb import --db <path> --type <type> [options]

Valitsimet:

  • --db — Tietokannan polku (pakollinen).

  • --type — Tuontityyppi: match, position tai batch (pakollinen).

  • --file — Tuotava tiedosto (tyypeille match ja position).

  • --dir — Tuotava hakemisto (tyypille batch).

  • --recursive — Selaa alihakemistot rekursiivisesti (oletus: kyllä).

  • --watch — Yhdessä --type batch-valitsimen kanssa: ei pysähdy, vaan tuo jokaisen ottelutiedoston heti kun se ilmestyy hakemistoon --dir (Ctrl-C lopettaa).

  • --watch-every — Kuinka usein --watch katsoo (oletus: 10s, alaraja 2s).

  • --format — Tulostusmuoto: text (oletus) tai json.

  • --fail-on-error — Epäonnistuu, jos edes yhtä kohdetta (position tai batch) ei voitu tuoda, vaikka muut onnistuisivat.

Paluukoodi noudattaa neljää sääntöä:

  • mitään ei tunnistettu (jokainen tiedosto epäonnistui): virhe, oli --fail-on-error annettu tai ei;

  • pelkkiä kaksoiskappaleita (jokainen tiedosto oli jo tietokannassa): onnistuminen. Hakemisto, joka ajetaan uudelleen ilman uutta tiedostoa — skriptin tavallinen yö — päättyy koodiin 0, ja duplicates on ainoa nollasta poikkeava;

  • osittainen epäonnistuminen (osa kohteista tuotiin, osa hylättiin): virhe vain, jos --fail-on-error on annettu;

  • vähintään yksi uusi kohde tuotiin ilman --fail-on-error-valitsinta: onnistuminen, ja hylätyt tiedostot luetellaan taulukossa.

Kansion valvonta

--watch muuttaa hakemistotuonnin valvonnaksi: komento ei palaa, vaan tuo jokaisen ottelutiedoston, joka kansioon ilmestyy. Se on sovelluksen valvotun kansion käyttöliittymätön muoto.

# Importer ce que le dossier contient déjà, puis surveiller ce qui arrive
./blunderdb import --db base.db --type batch --dir ~/XG/Matches
./blunderdb import --db base.db --type batch --dir ~/XG/Matches --watch

Vain ilmestyvät tiedostot tuodaan: se mitä kansiossa on käynnistyshetkellä kirjataan tunnetuksi ja jätetään rauhaan — valvonnan osoittaminen neljän vuoden otteluihin ei saa tuoda niitä kaikkia. Yllä olevat kaksi komentoa siis täydentävät toisiaan juuri niin kuin toivoisi.

Tiedosto tuodaan vasta kun sen koko on vakiintunut, eli se on nähty kahdesti muuttumattomana: ottelu, jota toinen ohjelma kirjoittaa, kasvaa katsomasta toiseen, ja puoliksi kirjoitettuna tuotuna siitä tulisi syntaksivirhe, jolle kukaan ei voi mitään. Kansiota ei käydä läpi rekursiivisesti. Lukukelvottomaksi muuttunut verkkojako ei pysäytä valvontaa, eikä sen sisältö käy uudesta sen palatessa.

Ctrl-C pysäyttää tiedostojen välissä, ei koskaan kesken yhden: tuotava tiedosto viedään loppuun ja sen raportti tulostetaan ennen kuin komento palaa.

Ottelun tuonti

Tuetut muodot: eXtreme Gammon (.xg, .xgp), GNUbg (.sgf), Jellyfish (.mat, .txt), BGBlitz (.bgf) ja HedgeHog (.ogxm).

./blunderdb import --db base.db --type match --file match.xg

# Successfully imported match (ID: 1)
#
# Match Details:
#   Players: Kévin Unger vs Maxence Job
#   Event: HSBT Paris 2023
#   Match Length: 7
#   Games: 7

--format json antaa samat kentät yhtenä dokumenttina:

{
  "type": "match",
  "match_id": 1,
  "player1": "Kévin Unger",
  "player2": "Maxence Job",
  "event": "HSBT Paris 2023",
  "location": "Paris, Fédération Française de Bridge",
  "match_length": 7,
  "games": 7
}

Asemien tuonti

Tuo asemia tekstitiedostosta, yksi JSON-asema riviä kohti. Tämä on täsmälleen se, mitä export --type positions kirjoittaa: komennot vastaavat toisiaan, ja vienti tuodaan takaisin sellaisenaan ilman mitään muokkausta.

./blunderdb import --db base.db --type position --file positions.txt

# Successfully imported 4 positions

Yksi rivi sellaisena kuin export sen tuottaa — lauta vie siitä valtaosan, kaksikymmentäkuusi pistettä ja niiden perässä ulos kannetut nappulat:

{"id":1,"board":{"points":[{"checkers":0,"color":0},{"checkers":1,"color":1},…],"bearoff":[0,0]},"cube":{"owner":-1,"value":0},"dice":[0,0],"score":[7,7],"player_on_roll":0,"decision_type":1,"has_jacoby":0,"has_beaver":0,"individually_imported":true,"flagged":false}

Analyysit ja kommentit eivät kulje tässä muodossa: se kantaa aseman, ei mitään muuta. Kokonaisen kirjaston siirtämiseen tarvitaan export --type database.

Erätuonti

Tuo kaikki hakemiston ottelutiedostot yhdellä toimenpiteellä. Tämä on tehokkain tapa tuoda suuri määrä otteluita.

./blunderdb import --db base.db --type batch --dir ./matchs/
./blunderdb import --db base.db --type batch --dir ./matchs/ --recursive=false
./blunderdb import --db base.db --type batch --dir ./matchs/ --format json --fail-on-error

Yhteenvetotaulukko näyttää jokaisen tiedoston kohdalla, onnistuiko tuonti (✓), epäonnistuiko (✗) vai oliko kyseessä kaksoiskappale (⊘). Kaksoiskappaletta ei lasketa epäonnistumiseksi, ja erä, jossa on pelkkiä kaksoiskappaleita, on onnistuminen (ks. säännöt yllä).

Batch importing from: ./matchs/ (recursive: true)

Found 3 match file(s) to import

[1/3] Importing: 02_NDT_FR.txt... ERROR: failed to parse file: ingest: parse gnubg file: invalid MAT file: no match header found
[2/3] Importing: test.mat... DUPLICATE
[3/3] Importing: test.xg... OK (ID: 1, 341 positions)

====================================================================
IMPORT SUMMARY
====================================================================
Status  File           ID  Player 1     Player 2     Games  Positions  Error
------  ----           --  --------     --------     -----  ---------  -----
✗       02_NDT_FR.txt                                0      0          failed to parse file: ingest: ...
⊘       test.mat                                     0      0
✓       test.xg        1   Kévin Unger  Maxence Job  7      341
--------------------------------------------------------------------
Total: 3 files | Success: 1 | Duplicates: 1 | Failed: 1 | Positions imported: 341

--format json antaa samat tiedot skriptille sopivassa muodossa: yksi olio tiedostoa kohti kentässä files, sitten kokonaissummat. Rauhallisen yön jäljiltä duplicates on ainoa nollasta poikkeava, failed on nolla ja paluukoodi on 0; vain erä, jossa mitään ei tunnistettu, päättyy virheeseen.

{
  "files": [
    {"file_path": "02_NDT_FR.txt", "success": false, "error": "failed to parse file: …"},
    {"file_path": "test.xg", "success": true, "positions": 341}
  ],
  "total": 3,
  "success": 1,
  "duplicates": 1,
  "failed": 1,
  "positions_imported": 341
}

export — Vie tietoja

Vie tietokannan sisältö tiedostoihin.

./blunderdb export --db <path> --type <type> --file <output> [options]

Valitsimet:

  • --db — Lähdetietokanta (pakollinen).

  • --type — Vientityyppi: database, positions, matches tai mat (yhden tai useamman ottelun vienti Jellyfish .mat -transkriptioon) (pakollinen).

  • --file — Tulostiedosto (pakollinen, paitsi --type mat -vaihtoehdolle yhdessä --dir kanssa).

  • --dir — Erävientinä tehtävän .mat-viennin tulostushakemisto (useita otteluita, yksi tiedosto ottelua kohden; ilman --match-ids viedään kaikki ottelut).

  • --analysis — Sisällytä analyysit (oletus: kyllä).

  • --comments — Sisällytä kommentit (oletus: kyllä).

  • --filters — Sisällytä suodatinkirjasto (oletus: kyllä).

  • --played-moves — Sisällytä pelatut siirrot (oletus: kyllä).

  • --matches — Sisällytä ottelut (oletus: kyllä).

  • --collections — Sisällytä kokoelmat (oletus: ei).

  • --collection-ids — Vietävien kokoelmien tunnukset (pilkulla eroteltuna).

  • --match-ids — Vietävien otteluiden tunnukset (pilkulla eroteltuna, tyhjä = kaikki).

  • --tournament-ids — Vietävien turnausten tunnukset (pilkulla eroteltuna).

  • --password — Kääri tuloksen salattuun säiliöön (.dbx).

  • --watermark — Kirjoittaa allekirjoitetun alkuperäilmoituksen vietyyn tiedostoon (katso Tietokannan jakaminen: alkuperä ja salasana).

  • --watermark-note — Vesileimaan liitettävä vapaa teksti (käyttöehdot, yhteystieto); käytetään yhdessä --watermark-valitsimen kanssa.

  • --format — Tulostusmuoto: text (oletus) tai json (vientiä kokoava asiakirja: polku, koko tavuina, määrät).

Esimerkkejä:

./blunderdb export --db base.db --type database --file sauvegarde.db
./blunderdb export --db base.db --type positions --file positions.txt
./blunderdb export --db base.db --type matches --file selection.db --match-ids 1,3,5

# .mat : un match, puis plusieurs (ou tous) dans un répertoire
./blunderdb export --db base.db --type mat --match-ids 5 --file match5.mat
./blunderdb export --db base.db --type mat --match-ids 5,9,12 --dir sorties/
./blunderdb export --db base.db --type mat --dir sorties/

# .dbx : filigrané et protégé par mot de passe
./blunderdb export --db cours.db --type database --file cours-diffusion.dbx \
    --watermark "Cours de Jean Dupont — 12 mars 2026" \
    --watermark-note "Merci de ne pas rediffuser." \
    --password secret

Vesileima allekirjoitetaan paikallisella liikkeeseenlaskijan identiteetillä (katso identity-komento alla): sitä ei voi väärentää, mutta sen voi poistaa — tiedosto pysyy tavallisena SQLite-tietokantana. Se ei suojaa mitään, se vain kertoo, mistä tiedosto on peräisin. Salasana suojaa tiedoston kuljetusta (kadonnut kopio, vahingossa lähetetty liite), ei itse tietokantaa: kuka tahansa salasanan saanut voi avata sen. blunderDB ei koskaan kirjaa mitään vastaanottajan puolelle (ei rekisteriä, ei lokia) — katso ADR-0007.

identity — Liikkeeseenlaskijan identiteetti

Näyttää tai siirtää liikkeeseenlaskijan identiteettisi: Ed25519-avaimen, joka allekirjoittaa jokaisen vesileiman. Se syntyy itsestään ensimmäisen vesileiman yhteydessä; mitään ei tarvitse asettaa. Se kuuluu henkilölle, ei tietokannalle: kaikki merkitsemäsi kantaa yhtä ja samaa julkista sormenjälkeä.

./blunderdb identity
./blunderdb identity --name "Jean Dupont"
./blunderdb identity --export jean.bdbid --passphrase pw
./blunderdb identity --import jean.bdbid --passphrase pw

Valitsimet:

  • --name — Vaihtaa identiteetin näyttönimen.

  • --export — Vie identiteetin .bdbid-tiedostoon.

  • --import — Tuo identiteetin .bdbid-tiedostosta.

  • --passphrase — Valinnainen tunnuslause, joka suojaa viedyn/tuodun tiedoston (paikallinen identiteetti jätetään tarkoituksella suojaamatta).

  • --format — Tulostusmuoto: text (oletus) tai json (nimi, sormenjälki, tallennuspolku).

Viety tiedosto antaa kenelle tahansa sen haltijalle mahdollisuuden allekirjoittaa sinun nimissäsi — älä jaa sitä. Uudelleennimeäminen muuttaa vain nimilapun: jo merkityt tiedostot säilyttävät nimen, jolla ne sinetöitiin, ja ne todentuvat edelleen.

open — Suojatun tiedoston avaaminen

Muuntaa salasanalla suojatun tiedoston (.dbx) tavalliseksi tietokannaksi. Salasanaa kysytään vain kerran; sen jälkeen kyseessä on tavallinen tiedosto.

./blunderdb open --db cours.dbx --password secret
./blunderdb open --db cours.dbx --password secret --file ./mon-cours.db

Valitsimet:

  • --db — Avattava .dbx-tiedosto (pakollinen).

  • --password — Säiliön salasana (pakollinen).

  • --file — Tavallisen tietokannan tulostuspolku (oletus: sama nimi, pääte .db).

Mitä salasana suojaa: tiedoston kuljetusta — latauskansioon unohtunutta kopiota, vahingossa lähetettyä liitettä. Ei tietokantaa: kuka tahansa salasanan saanut voi avata sen. Säiliön otsake on selkokielinen, joten blunderdb info lukee suojatun tiedoston alkuperän ilman salasanaa.

search — Hae asemia

Hae asemia tietokannasta yhdisteltävien kriteerien avulla.

./blunderdb search --db <path> [options]

Pääasialliset valitsimet:

  • --db — Tietokanta (pakollinen).

  • --format — Tulostusmuoto: table, json tai xgid (oletus: table).

  • --limit — Tulosten enimmäismäärä (0 = rajoittamaton).

  • --offset — Ohita n ensimmäistä tulosta ennen kuin laskeminen alkaa; yhdessä --limit-valitsimen kanssa tämä on sivutus.

  • --export — Vie tulokset uuteen tietokantaan.

  • --query-help — Näyttää luettelon tunnuksista, jotka --query ymmärtää, eikä tee muuta. Yhtään tietokantaa ei avata: --db on tarpeeton.

Käytettävissä olevat suodattimet:

  • --decision — Päätöstyyppi: checker tai cube.

  • --dice — Nopanheitto. 5,3 hakee asemat, joissa molemmat nopat täsmäävät (järjestyksellä ei ole väliä). 5 hakee asemat, joissa 5 esiintyy jommassakummassa nopassa (toisen nopan arvo jätetään huomiotta). Sisältää --decision checker, jos --decision-arvoa ei ole annettu.

  • --pip-min / --pip-max — Pip-eron väli.

  • --winrate-min / --winrate-max — Voittoprosentin väli (%).

  • --cube — Tuplauskuution arvo.

  • --score1 / --score2 — Pelaajien pisteet.

  • --match-length — Ottelun pituus.

  • --error-min — Kynnys sille, mitä virhe asemassa maksaa: parhaan ja toiseksi parhaan siirron välinen ero tai suurin kolmesta kuutiovirheestä. Yksikkönä equity-pisteet — --error-min 0.1 poimii asemat, joissa erehtyminen maksaa vähintään kymmenesosan pisteestä. Se ei kerro mitään siitä, mitä asemassa on pelattu.

  • --move-error-min / --move-error-max — Kynnys pelaajan 1 tosiasiallisesti pelaaman siirron virheelle. Yksikkönä equityn tuhannesosat (millipisteet): --move-error-min 50 on kahdeskymmenesosa pistettä. Tämä on hakukieliopin tunnus E sellaisenaan kirjoitettuna.

  • --has-analysis — Vain asemat, joissa on analyysi.

  • --off1-min / --off2-min — Vähimmäismäärä ulospelattuja nappuloita (pelaaja 1/2).

  • --match-ids — Suodata otteluiden tunnusten mukaan (pilkulla eroteltuna).

  • --tournament-ids — Suodata turnausten tunnusten mukaan (pilkulla eroteltuna).

  • --position-ids — Suodata asemien tunnusten mukaan: väli 2,7 (asemat 2–7) tai puolipisteillä eroteltu eksplisiittinen luettelo 5;10;15.

  • --individual — Vain erikseen tuodut asemat, eli ne jotka lisäsit itse, eikä niitä jotka ottelun tuonti toi mukanaan.

  • --flagged — Vain asemat, jotka on merkitty (flag) tutkittaviksi alkuperäisessä ohjelmassa (eXtreme Gammonin merkinnät). Ei takautuva: jo tuodut ottelut on tuotava uudelleen, jotta merkinnät saadaan.

  • --has-comment — Vain asemat, joissa on kommentti. Alkuperää ei eroteta: käsin kirjoitettu muistiinpano ja ottelun tuonnin mukana tullut kommentti lasketaan molemmat. Ottelun tai turnauksen kommentteja ei katsota.

  • --no-comment — Vain asemat ilman kommenttia. Toisensa poissulkeva --has-comment-valitsimen kanssa.

Varoitus

--error-min ja --move-error-min eivät mittaa samaa asiaa eivätkä ota samaa yksikköä: kerroin on tuhat. Ensimmäinen annetaan equity-pisteinä (0.1), kaksi muuta tuhannesosina (100) — yksi piste on 1000 tuhannesosaa. --move-error-min vastaa kysymykseen ”missä tein virheen”; --error-min vastaa kysymykseen ”mitkä asemat olivat hankalia”.

Mitä search tulostaa:

--format table (oletus) antaa yhden rivin asemaa kohti: tunniste, tulos, kuution arvo, päätöksen tyyppi, heitto, paras päätös ja sen equity. Kaksi viimeistä saraketta jäävät tyhjiksi asemalla, jolla ei ole analyysia.

Found 5 position(s)

ID  Score  Cube  Type  Dice  Best Move  Equity
--  -----  ----  ----  ----  ---------  ------
2   7-7    0     cube        No Double  -0.005
4   7-7    0     cube        No Double  -0.027
6   7-7    0     cube        No Double  -0.161
8   7-7    0     cube        No Double  0.256
10  7-7    0     cube        No Double  -0.234

--format json antaa taulukon samoista asemista. Kentät id, score, cube, decision_type (checker tai cube) ja dice ovat aina mukana; best_move, equity ja xgid esiintyvät vain, jos asemalla on analyysi, joka ne täyttää. Rivi Found n position(s) tulostetaan edelleen ennen taulukkoa: skriptin, joka odottaa pelkkää JSONia, on ohitettava ensimmäinen rivi tai käytettävä valitsinta --export.

[
  {
    "id": 5266,
    "score": [
      5,
      4
    ],
    "cube": 1,
    "decision_type": "checker",
    "dice": [
      4,
      3
    ],
    "best_move": "10/3",
    "equity": 0.565
  }
]

--format xgid tulostaa yhden XGID:n riviä kohti eikä mitään muuta. Se tulostaa vain ne asemat, joiden tallennettu analyysi kantaa XGID:n: sovellukseen tekstiviennistä liitetyn aseman tai BGF-tiedoston, joka tuo XGID:n mukanaan. XG-, GNUbg- tai Jellyfish-ottelun tuonnin mukanaan tuomilla asemilla ei sellaista ole, jolloin tuloste jää tyhjäksi. Alikomento collection show sen sijaan muodostaa XGID:n uudelleen laudalta.

Kyselykieli:

Yllä olevat valitsimet kattavat vain osan suodattimista. --query antaa pääsyn sovelluksen kyselykieleen — komentorivin kieleen — ja siten kaikkiin suodattimiin, joita ei piirretä laudalle: siirtokuvio, kommenttiteksti, pelaaja, päivämäärä, equity, poissuljetut heitot, vyöhykkeet ja blotit.

Kielioppi on kirjoitettu vain yhteen paikkaan, Hakusuodattimet. Sen taulukko antaa jokaisen tunnuksen, sen muodon ja sitä vastaavan search-valitsimen silloin kun sellainen on olemassa. Tämä sivu ei toista sitä.

./blunderdb search --db base.db --query 's p>30 E>50'
./blunderdb search --db base.db --query 's m"13/11" t"blunder" pl"Alice" T>2026/01/01'

Aseman naapurien järjestäminen kulkee saman kieliopin kautta: --query 's like42', yksin tai muiden tunnusten seuraamana rajaamassa järjestettyä joukkoa.

--query-help muistuttaa luettelosta avaamatta yhtään tietokantaa:

$ ./blunderdb search --query-help
blunderdb search --query — the interface's query language

A query is the same text the application's command bar takes:
  s cube p>30 E>50        cube decisions, 30+ pips behind, 50+ millipoints of error
  s m"13/11" T>2026/01/01 played 13/11, imported this year

Flags (no value):
  cube score   match the cube / the score of the position on the board
  d            match the decision type (checker or cube)
  …

Ranges — each takes x>n, x<n or xa,b (lower-case: you; upper-case: the opponent):
  p P          pip count difference / absolute pip count
  …
  E            error of the played move, in millipoints
  T            creation date, T>2026/01/01

Values:
  t"tag"       comment text (";" separates alternatives)
  …

--query korvaa suodatinvalitsimet sen sijaan että täydentäisi niitä: niiden yhdistäminen hylätään, ja virheellinen valitsin nimetään. Valitsimet, jotka kertovat mistä haetaan ja miten näytetään — --db, --format, --limit, --offset, --export — pysyvät voimassa.

Tunnus, jota mikään ei tunnista, kaataa komennon sen sijaan että kaventaisi hakua hiljaisesti. Kaksi rajoitusta seuraa siitä, ettei komentorivillä ole lautaa: nappulakuviota ei voi kirjoittaa, ja viisi laudalta lukevaa tunnusta — cube, score, d, D/D1 ja x — vertautuvat täällä tyhjään lautaan. Haku, joka tarvitsee jotakin näistä, kirjoitetaan kokonaan valitsimilla, koska --query ei yhdisty niihin — esimerkiksi kuutiopäätökset, joissa pip-ero on vähintään 30 ja virhe vähintään 50 millipistettä:

./blunderdb search --db base.db --decision cube --pip-min 30 --move-error-min 50

Esimerkkejä:

./blunderdb search --db base.db --decision cube
./blunderdb search --db base.db --individual
./blunderdb search --db base.db --error-min 0.1
./blunderdb search --db base.db --tournament-ids 1 --export cubes.db

# 6-5 dans les deux ordres, puis un 6 sur l'un des deux dés
./blunderdb search --db base.db --dice 6,5
./blunderdb search --db base.db --dice 6

# Pagination
./blunderdb search --db base.db --format json --limit 10 --offset 20

list — Luettele sisältö

Näytä tietokannan sisältö.

./blunderdb list --db <path> --type <type> [--limit <n>] [--offset <n>]

Tyypit:

  • matches — Luettelo tuoduista otteluista.

  • tournaments — Luettelo turnauksista.

  • positions — Luettelo asemista (oletuksena 10; --offset <n> ohittaa ensimmäiset n). Vain näytettävä ikkuna luetaan, oli tietokanta minkä kokoinen tahansa. Valinnalla --format csv siitä tulee taulukkovienti: yksi rivi asemaa kohden, jossa on sen XGID, vaihe, tilanne, tuplauskuutio, pipit ja johdetut analyysisarakkeet.

  • imports — Tallennetut tuonnit, uusimmasta vanhimpaan: tunniste, päivämäärä, muoto, lähde, tuodut / ohitetut / rikastetut ottelut, lukukelvottomat tiedostot ja uudet asemat. Valitsimella --batch <id> näytetään yhden tuonnin täysi raportti: merkityt asemat, asemat ilman analyysiä, kyseisen erän PR ja sen viisi huonointa päätöstä (katso Tuontiraportti).

  • stats — Suorituskykytilastojen raportti: PR / Snowie ER / MWC (kokonais, nappulat, kuutio), liukuva PR viimeisten N päätöksen osalta, pahimmat virheet, jakauma kuutiotoiminnoittain ja virhesuuruuksien histogrammi.

  • players — Vertailutaulukko, yksi rivi kutakin tietokannan pelaajaa kohden: ottelut, voitot/tappiot, lasketut päätökset, PR yhteensä / nappulat / kuutio, Snowie ER, virheet, karkeat virheet ja tuuri. Tämä on tilastopaneelin Pelaajat-välilehden komentorivivastine.

  • moves — Kirjattujen siirtojen taulukkovienti, yksi riviä kohden, ottelu johon ne kuuluvat toistettuna joka rivillä: tunnisteet, päivämäärä, pelaajat, pituus, siirron numero ja tyyppi, asema, nopat, pelattu siirto, kuutiotoiminto, onni. --format csv vaaditaan.

  • analyses — Tallennettujen analyysien taulukkovienti, yksi riviä kohden: moottori, syvyys, paras siirto ja sen ekviteetti, pelatun siirron virhe, paras kuutiotoiminto ja sen virhe, kuusi voittoprosenttia. --format csv vaaditaan.

  • tags — Tietokannan tunnistesanasto: jokainen kommenttiin kirjoitettu #sana ja niiden asemien määrä, jotka sitä kantavat, käytetyimmästä alkaen. Tietokannassa, jossa ei ole yhtään tunnistetta, näytetään suositeltu sanasto tyhjän listan sijaan (katso Tunnisteet). Hyväksyy --format json ja --format csv.

Taulukkoviennit

Kolme tyyppiä — positions, moves ja analyses — viedään CSV:ksi notebookia, taulukkolaskentaa tai skriptiä varten:

./blunderdb list --db base.db --type positions --format csv > positions.csv
./blunderdb list --db base.db --type moves     --format csv > moves.csv
./blunderdb list --db base.db --type analyses  --format csv > analyses.csv

--limit pätee vain jos annat sen. Sen oletusarvo (10) on olemassa, jottei päätteelle tulostettu list vierittäisi koko tietokantaa ohi; vienti sen sijaan menee tiedostoon, jota ohjelma lukee, ja sen katkaiseminen hiljaisesti kymmeneen riviin olisi ansa, jota kukaan ei huomaa ennen kuin luvut ovat väärin.

Sarakkeet ovat sopimus. Näitä nimiä vasten kirjoitetun notebookin tai skriptin täytyy toimia jatkossakin: sarakkeita lisätään loppuun, niitä ei koskaan nimetä uudelleen eikä järjestetä uudelleen. Kaikki ekviteetit ovat kokonaislukumillipisteinä, koska niin ne tallennetaan ja koska liukuluku CSV:ssä houkuttelee lokaalia muotoilemaan sen uudelleen.

Parquetia ei tarjota, ja se on mitattu eikä dogmaattinen valinta: sarakepohjainen kirjasto painaa useita megatavuja binäärissä, jonka kokoa seurataan, kun taas kaikki mihin tämä vienti on tarkoitettu lukee CSV:tä yhdellä rivillä (pd.read_csv, polars.read_csv, read.csv, taulukkolaskenta). Parquet ansaitsee paikkansa kymmenillä miljoonilla riveillä; kymmenen vuotta vanha backgammon-kirjasto sisältää satatuhatta. Jos jonain päivänä ero on mitattavissa oikealla tietokannalla, juuri se mittaus avaa asian uudelleen.

Näiden vientien mukana tulee esimerkkinotebook Jupyterille (notebooks/blunderdb-analyse.ipynb repositoriossa): PR ajan mittaan, virheiden suuruuksien jakauma, kymmenen pahinta päätöstä XGID:eineen. Se käyttää vain noita kolmea CSV-tiedostoa, ja se ajetaan joka yö jatkuvassa integraatiossa — notebook jota kukaan ei aja on notebook joka on lakannut toimimasta kenenkään huomaamatta.

Valitsimet (vain tyyppi stats):

  • --metric — Näytettävä mittari: pr tai mwc (oletus: pr).

  • --player — Rajaa ilmoitettuun pelaajaan.

  • --tournament — Rajaa yhteen tai useampaan turnauksen tunnukseen (pilkulla eroteltuna).

  • --from — Aloituspäivä (VVVV-KK-PP).

  • --to — Lopetuspäivä (VVVV-KK-PP).

  • --decision-type — Päätöstyyppi: all, checker tai cube (oletus: all).

  • --top-blunders — Lueteltavien pahimpien virheiden määrä (oletus: 10).

  • --format — Tulostusmuoto: text tai json (oletus: text).

Valitsimet (vain tyyppi imports):

  • --batch — Erän tunniste: näyttää sen täyden raportin luettelon sijaan.

  • --queue — Yhdessä --batch-valitsimen kanssa: erän opiskelujono sen raportin sijaan — asemat, jotka ansaitsevat toisen katseen, siinä järjestyksessä kuin ne käydään läpi (katso Opiskelujono). Ensin päätökset, jotka maksoivat jotain, sitten lähdeohjelmassa merkityt asemat, sitten tiukat kuutiopäätökset; asema esiintyy vain kerran.

  • --format — Tulostusmuoto: text tai json (oletus: text).

Raportin mitattu puolisko lasketaan uudelleen joka kutsulla: erä, jonka asemat on sittemmin analysoitu, palauttaa tämän päivän luvut, ei tuontipäivän lukuja.

Valitsimet (vain tyyppi players):

  • --from / --to — Päivämäärärajat (VVVV-KK-PP), esimerkiksi kilpailun päivät.

  • --tournament — Rajaa yhteen tai useampaan turnaustunnukseen.

  • --format — Tulostusmuoto: text, json tai csv (oletus: text).

--player ja --decision-type eivät koske tätä tyyppiä: taulukko kattaa kaikki pelaajat ja erittelee nappulat ja kuution jo omiin sarakkeisiinsa.

Muista

Viiva ”—” (CSV:ssä tyhjä kenttä) merkitsee arvoa, jota ei ole koskaan mitattu; sitä ei pidä sekoittaa nollaan. Näin on tuurin kohdalla kaikissa otteluissa, jotka tuotiin ennen skeemaversiota 2.15.0, sekä muodoissa, jotka eivät sitä kuljeta (BGF, Jellyfish .mat): tuo lähdetiedostot uudelleen saadaksesi sen. Sarake luck_rolls kertoo, kuinka monesta heitosta keskiarvo on laskettu.

Kukin tyyppi tulostaa yhden lohkon kohdetta kohden, ja ensin löydettyjen kokonaismäärän. Viimeinen rivi kertoo, mikä ikkuna näytetään: --limit rajaa sen (asemille oletus 10) ja --offset siirtää sitä:

Found 3859 position(s):

ID: 1
  Score: 7-7
  Player on roll: 0
  Decision: Checker play

ID: 2
  Score: 7-7
  Player on roll: 0
  Decision: Cube action

…

(Showing 1-10 of 3859 positions, use --offset and --limit to see more)

Esimerkkejä:

# Les imports enregistrés, puis le compte rendu de l'un d'eux
./blunderdb list --db base.db --type imports
./blunderdb list --db base.db --type imports --batch 3

./blunderdb list --db base.db --type stats
./blunderdb list --db base.db --type stats --metric mwc --player "Alice"
./blunderdb list --db base.db --type stats --decision-type checker --from 2026-01-01
./blunderdb list --db base.db --type stats --format json

# Un tableau par joueur, borné aux dates d'une compétition
./blunderdb list --db base.db --type players --from 2026-03-01 --to 2026-03-08
./blunderdb list --db base.db --type players --format csv

./blunderdb list --db base.db --type matches
./blunderdb list --db base.db --type positions --limit 20

match — Näytä ottelu

Näytä tuodun ottelun asemat ja analyysit.

./blunderdb match --db <path> --id <id> [--format <format>] [--output <file>]

Valitsimet:

  • --db — Tietokanta (pakollinen).

  • --id — Näytettävän ottelun tunnus (pakollinen).

  • --format — Tulostusmuoto: json, text tai summary (oletus: json).

  • --output — Tulostiedosto (oletus: vakiotuloste).

Esimerkkejä:

./blunderdb match --db base.db --id 1 --format summary
./blunderdb match --db base.db --id 1 --format text
./blunderdb match --db base.db --id 1 --output match1.json

collection — Kokoelmien hallinta

Hallitsee kokoelmia, näitä käyttöliittymän Kokoelmat-paneelissa käsin valittuja asemajoukkoja. Jokainen alikomento ottaa parametrin --db; list ja show hyväksyvät parametrin --format text (oletus), json tai csv, kuten list.

./blunderdb collection <subcommand> [options]

Alikomennot:

  • list — Kokoelmien luettelo: tunnus, nimi, asemien määrä, kuvaus.

  • show --id <id> — Kokoelman asemat: tunnus, indeksi (käyttöliittymän tilarivillä näytetty 1-pohjainen numero), pistetilanne, päätöstyyppi ja XGID.

  • create --name <nom> [--description <texte>] — Luo tyhjän kokoelman.

  • filter --id <id> --query <kysely> — Tekee kokoelmasta elävän: sen sisällöksi tulee haun tulos, joka lasketaan uudelleen joka avauskerralla. Kysely kirjoitetaan sovelluksen omalla hakukieliopilla (katso Hakusuodattimet). --clear palauttaa sen käsin tehdyksi listaksi ja säilyttää sen sisältämät asemat.

  • rename --id <id> --name <nom> [--description <texte>] — Nimeää kokoelman uudelleen (kuvaus säilyy, jos sitä ei anneta).

  • delete --id <id> [--confirm] — Poistaa kokoelman; sen asemat säilyvät tietokannassa.

  • export --id <id[,id…]> --out <fichier.db> [--analysis=false] [--comments=false] [--watermark <texte>] [--watermark-note <texte>] — Vie yhden tai useamman kokoelman uuteen tietokantatiedostoon samalla kutsulla kuin käyttöliittymän vienti-ikkuna (katso vesileimasta komento export).

show-komennon näyttämä XGID on aseman analyysin yhteydessä tallennettu XGID, jos sellainen on olemassa (BGF- ja XGP-tuonnit); muutoin se generoidaan laudalta täsmälleen samoin kuin käyttöliittymän Kopioi asema -toiminto tekee — ottelun pituudeksi tulee tällöin suurempi kahdesta jäljellä olevasta pistemäärästä, sillä tallennettu asema ei säilytä todellista ottelun pituutta.

Esimerkkejä:

./blunderdb collection list --db base.db

# Found 2 collection(s):
#
# ID  Name              Positions  Description
# --  ----              ---------  -----------
# 1   Ouvertures blitz  0          À revoir
# 2   Videaux ratés     0

Tietokanta, jossa ei ole yhtään kokoelmaa, vastaa No collections found in database ja päättyy silti paluukoodiin 0.

./blunderdb collection show --db base.db --id 3 --format csv

./blunderdb collection create --db base.db --name "Ouvertures blitz"
./blunderdb collection rename --db base.db --id 3 --name "Ouvertures"
./blunderdb collection delete --db base.db --id 3 --confirm

# Exporter deux collections, marquées de leur origine
./blunderdb collection export --db base.db --id 3,4 --out ouvertures.db \
    --watermark "Cours de Jean Dupont - 12 mars 2026"

anki — Välitoistopakat

Tarkastelee ja ylläpitää käyttöliittymän Anki-paneelin välitoistopakkoja (FSRS). Kortin kertaaminen vaatii laudan ja tapahtuu käyttöliittymässä; CLI listaa, mittaa ja synkronoi uudelleen.

./blunderdb anki <subcommand> [options]

Alikomennot:

  • decks [--format text|json|csv] — Pakkojen luettelo: lähde, korttien määrä, erääntyneet kortit, uudet kortit.

  • stats --deck <id> [--format text|json] — Pakan kertaustilastot: yhteensä, uudet, opittavana, kerrattavat, nyt erääntyvät, sekä sen FSRS-parametrit.

  • forecast [--deck <id>] [--days <n>] [--format text|json|csv] — Erääntyvät kortit kalenteripäivittäin (UTC) seuraavien n päivän aikana (oletus 30, enintään 365); päivä 0 sisältää kaikki myöhässä olevat kortit; --deck 0 (oletus) kattaa kaikki pakat.

  • sync --deck <id> — Lisää kortin jokaiselle pakan lähteen asemalle, jolla ei vielä ole korttia; olemassa olevat kortit säilyttävät ajoituksensa.

  • retention --deck <id> [--format text|json] — pakan mitattu muistiinjäänti verrattuna omistajan valitsemaan tavoitteeseen.

  • card --id <id> --action suspend|unsuspend|bury|remove [--format text|json] — kohdistuu yhteen korttiin. Hyllytys siirtää sen syrjään historiaa menettämättä (se ei enää tule vastaan istunnossa); hautaus piilottaa sen seuraavaan päivään sanomatta mitään sen arvosta; poisto poistaa sen pakasta — asema itse jää kirjastoon, sillä pakka on vain sen päälle asetettu opiskelulista.

  • log [--deck <id>] [--limit <n>] [--format text|json] — kertausloki, tuorein ensin (--deck 0, oletus, kattaa kaikki pakat; --limit on oletuksena 20). Loki on se, mitä ajoittajalle todella kerrottiin, vastakohtana sille, mitä se tänään suunnittelee: ainoa paikka, jossa vahingossa annettu arvosana näkyy.

Kokoelmaan perustuva pakka lukee kokoelmansa uudelleen. Hakuun perustuva pakka säilyttää haun sellaisena kuin käyttöliittymä sen tallensi (komento, lauta ja tuolloin löydettyjen asemien tunnukset): hakusyntaksi elää käyttöliittymässä, joten CLI synkronoi uudelleen tallennetuista tunnuksista ja ilmoittaa siitä virhetulosteeseen — avaa pakka käyttöliittymässä toistaaksesi itse haun.

Esimerkkejä:

./blunderdb anki decks --db base.db
./blunderdb anki stats --db base.db --deck 2 --format json
./blunderdb anki forecast --db base.db --deck 2 --days 14
./blunderdb anki sync --db base.db --deck 2
./blunderdb anki card --db base.db --id 12 --action suspend
./blunderdb anki log --db base.db --deck 2 --limit 50

# Day         Due
# ---         ---
# 2026-09-02  12
# 2026-09-03  4
# ...
#
# 37 card(s) due over 14 day(s)

stats — Toistuvat virheet

Ryhmittelee suodattimen virheet pelisuunnitelman ja teeman mukaan, kallein ensin: Stats-paneelin Errors-välilehden Toistuvat virheet -taulukko (ks. Stats-paneeli). Yleiset tilastot pysyvät komennon list --type stats alla.

./blunderdb stats recurring --db <fichier> [options]

Valitsimet:

  • --player <nom> — Vain tämän pelaajan päätökset.

  • --tournament <ids>, --from <AAAA-MM-JJ>, --to <AAAA-MM-JJ>, --decision-type all|checker|cube — Sama suodatin kuin komennossa list --type stats.

  • --limit <n> — Tekstinä näytettävien ryhmien määrä (oletus 20, 0 kaikille).

  • --format text|json — JSON sisältää jokaisen ryhmän sekä täydellisen asemaluettelon.

  • --quiz — Arpoo asemia kolmen kalleimman ryhmän asemista (--quiz-size <n>, oletus 20) ja tulostaa ne: nämä ovat tunnisteet, jotka tietovisa ja quiz_grade arvioivat. JSON:ssa kenttä Quiz.

  • --deck <nimi> — Luo tämännimisen Anki-pakan, joka täytetään kolmen kalleimman ryhmän kaikilla asemilla.

  • --group <sija> — --quiz- tai --deck-valinnan kanssa: tämän sijan ryhmä (1 on kallein) kolmen ensimmäisen sijaan.

Nappulasiirron teema on gammon, blots, point tai passive; kuutioteema on offer_missed, offer_premature, answer_wrong_pass tai answer_wrong_take. Virheet, joita mikään sääntö ei nimeä, jäävät pois luokituksesta: ne luetellaan erikseen, yksi rivi pelisuunnitelmaa kohti (Unthemed-kenttä JSONissa), koska selitys ottaa kantaa vasta 60 mp:stä alkaen, Virhe-kynnyksen yläpuolella. COST (PR) -sarake on osuus suodattimen PR:stä, jonka ryhmä edustaa.

Esimerkkejä:

./blunderdb stats recurring --db base.db --player "Alice"
./blunderdb stats recurring --db base.db --decision-type checker --format json
./blunderdb stats recurring --db base.db --quiz --format json
./blunderdb stats recurring --db base.db --group 1 --deck "Mon pire groupe"

stats training — Päätösvisan PR, otteluiden PR ja Ankin pysyvyys, koottuna kalenteri-ikkunoittain kuten Stats-paneelin Harjoittelu-välilehti (katso Stats-paneeli).

./blunderdb stats training --db <fichier> [options]

Valitsimet:

  • --window week|month — Kalenteri-ikkuna (oletus week).

  • --player <nimi>, --tournament <ids>, --from <VVVV-KK-PP>, --to <VVVV-KK-PP>, --decision-type all|checker|cube — Otteluiden suodatin; visan ja Ankin lokit eivät sisällä pelaajaa.

  • --format text|json — JSON sisältää myös visa-istuntojen luettelon.

Jokainen sarja säilyttää otoskokonsa: ikkuna ilman päätöksiä on tekstissä viiva ja JSONissa nollalukumäärä, ei koskaan nolla-arvo.

Esimerkkejä:

./blunderdb stats training --db base.db --player "Alice"
./blunderdb stats training --db base.db --window month --format json

cubematrix — Tuplauskuution matriisi

Antaa aseman kuutiotuomion jokaisessa ottelun pistetilanteessa: kullekin away × away -ruudulle sen, tuplataanko asema ja otetaanko tuplaus vastaan. Puhdasta laskentaa: mitään tietokantaa ei avata, asema tulee XGID- tai OGID-muodossa (OpenGammon).

./blunderdb cubematrix [options] '<XGID|OGID>'

Valitsimet:

  • --format — Tulostusmuoto: text tai json (oletus: text).

  • --match-length — Ottelun pituus, jonka ruudukko kattaa, väliltä 1–25 (oletus: 7).

  • --ply — Kunkin ruudun hakusyvyys, 0 tai 2 (oletus: 2).

  • --prune-k — Karsintaverkon säilyttämien ehdokassiirtojen määrä (oletus: 12).

  • --jobs — Rinnakkain ajettavat haut (oletus: yksi ydintä kohden). Ruudukko on sama arvosta riippumatta; vain aika muuttuu.

Aseman oma pistetilanne ohitetaan — ruudukko korvaa sen — mutta sen kuutio säilyy: kysymys on, missä pistetilanteessa kääntäisin tämän kuution. Ruudukko on kauttaaltaan Crawfordin jälkeinen.

Jokainen ruutu on oma hakunsa, koska moottori ottaa pistetilanteen huomioon: yksi ainoa haku luettuna eri otteluekviteettien läpi olisi väärässä juuri siellä, missä pistetilanne merkitsee.

Esimerkkejä:

# Grille d'un match en 5 points
./blunderdb cubematrix --match-length 5 'XGID=-b----E-C---eE---c-e----B-:0:0:1:00:0:0:0:7:10'

# Les équités de chaque case, pour un script
./blunderdb cubematrix --format json '<XGID>'

Tuloste text: ruudukko, jonka rivit ovat vuorossa olevan pelaajan vielä tarvitsemat pisteet ja sarakkeet vastustajan, sitten lyhenteiden ND / DT / DP / TG selitteet ja kunkin hylätyn ruudun syy.

rollout — Aseman rollout

Pelaa aseman suuren määrän kertoja gammonNetillä ratkaistakseen sen, mitä haku ei ratkaise: kaksi siirtoa, joiden ero on muutama tuhannesosa, tai tuplauspäätös, jossa malli epäröi. Nopilla pelataan sen siirrot (parhaat rolloutin syvyydellä, vähintään 2 ply, tai --move-valitsimella nimetyt); ilman noppia sen tuplauspäätös (Ei tuplausta ja Tuplaus/Hyväksy; Tuplaus/Hylkää on täsmälleen +1). Asema tulee XGID:stä tai OGID:stä tai tietokannasta (--db ja --id); ilman --store-valitsinta mitään ei tallenneta.

./blunderdb rollout [options] '<XGID|OGID>'
./blunderdb rollout --db <path> --id <position> [--store] [options]

Valitsimet:

  • --preset — Lähtöasetus: fast (oletus: 216 peliä katkaistuna 7 puolisiirtoon, pysäytys JSD 3:ssa 108:n jälkeen) tai standard (1296 peliä katkaistuna 11:een, pysäytys JSD 3:ssa 324:n jälkeen). Molemmat pelaavat 0 plyllä — pelkällä verkolla siirroissa, tuplauksessa ja lehdissä; --ply 1 tai enemmän pelaa syvemmälle, moninkertaisella ajalla. Seuraavat valitsimet korvaavat sen yksi kerrallaan.

  • --games, --min-games, --truncation, --jsd, --ply, --candidates — Rolloutin parametrit (--truncation 0 pelaa jokaisen pelin loppuun, --jsd 0 ei pysähdy koskaan ennen loppua).

  • --move — Pelattava siirto blunderDB:n merkinnällä (toistettavissa).

  • --seed — Noppien siemenluku, oletuksena kiinteä: sama komento antaa samat luvut.

  • --jobs — Rinnakkain pelattavat pelit (oletus: yksi ydintä kohti); vain aika muuttuu.

  • --format — Tulostusmuoto: text tai json (oletus: text).

  • --db, --id — Tietokanta ja pelattavan aseman tunniste XGID:n sijaan.

  • --store — Tallentaa valmiin rolloutin asemaan toisena analyysinä omine asetuksineen, tuodun tai lasketun analyysin rinnalle, jota se ei koskaan korvaa. Keskeytettyä rolloutia ei tallenneta; kahdesta samoilla asetuksilla tehdystä rolloutista säilytetään pidempi sarja, ja muilla asetuksilla tehty rollout lisätään rinnalle.

  • --list — Näyttää asemaan tallennetut rolloutit uusimmasta vanhimpaan sen sijaan, että pelaisi uuden.

Kaikki vaihtoehdot pelaavat samoilla nopilla, jokaisen heiton onni poistetaan kunkin pelin tuloksesta (varianssin vähennys), kaksi ensimmäistä heittoa stratifioidaan ja peli päättyy siihen, missä two-sided-bearoff-tietokanta kattaa sen. Jokainen rivi antaa ekvityn, sen 95 %:n välin, pelattujen pelien määrän ja JSD:n, eron parhaaseen erotuksen keskihajontoina. Tuplauskuutiota pelataan pelien aikana: sijoitus on luotettavampi kuin absoluuttinen ekvity. Ctrl-C näyttää, mitä päättyneet pelit ovat osoittaneet.

Esimerkkejä:

./blunderdb rollout 'XGID=-b----E-C---eE---c-e----B-:0:0:1:31:0:0:0:0:10'
./blunderdb rollout --move '8/5 6/5' --move '24/23 13/10' '<XGID>'
./blunderdb rollout --db base.db --id 42 --preset standard --store
./blunderdb rollout --db base.db --id 42 --list

epc — EPC-laskin

Laskee XGID:nä tai OGID:nä (OpenGammon) annetun ulosajoaseman Effective Pip Countin, voittotodennäköisyyden ja rahapelin kuutiotuomion. Puhdas laskenta: mikään tietokantatiedosto ei ole mukana.

./blunderdb epc [options] '<XGID|OGID>'

Valitsimet:

  • --format — Tulostusmuoto: text tai json (oletus: text).

  • --bearoff-ts — Valinnainen kaksipuolinen bearoff-tietokanta (.bd), joka laajentaa sisäänrakennettua TS-06-06:ta (luetaan myös ympäristömuuttujasta BLUNDERDB_TS_PATH). Laajin kelvollinen tietokanta voittaa; kelvoton tiedosto ohitetaan varoituksella.

Toimintatilat. Kaksipuolisen tietokannan kattamalla alueella voittotodennäköisyys ja rahapelin kuutioanalyysi (cubeless, ND, D/T, D/P, tuomio) ovat tarkkoja. Sen ulkopuolella voittotodennäköisyys arvioidaan (yksipuolisten heittojakaumien konvoluutio ja kalibroitu korjaus) ja näytetään mitatun virhemarginaalinsa kanssa; kuutiotuomiota ei tarkoituksella arvioida koskaan (katso ADR-0009).

Esimerkkejä:

# Régime exact : six pions ou moins de chaque côté
./blunderdb epc 'XGID=-BBB------------------bbb-:0:0:1:00:0:0:0:0:10'

# Avec la table TS-06-11 calculée : exact jusqu'à onze pions par joueur
./blunderdb epc --bearoff-ts ~/.local/share/blunderdb/gnubg_ts6x11.bd 'XGID=…'

bearoff — Bearoff-tietokannat

Luo ja hallinnoi bearoff-tietokantoja. Mitään ei ladata eikä mitään ole upotettu: taulukko lasketaan täällä ja tarkistetaan sitä sormenjälkeä vasten, jonka gnubg tuottaa sen alueelle. Yksikään alikomento ei puhu tietokannan kanssa — bearoff-taulukko on aritmetiikkaa pelistä, ei kenenkään asemista — joten yksikään ei ota --db.

./blunderdb bearoff generate --ts <domain> [options]
./blunderdb bearoff list [options]
./blunderdb bearoff verify <file.bd> [options]
./blunderdb bearoff delete --ts <domain> [options]

Alue kirjoitetaan kuten makebearoff-työkalussa: 6x9 kaksipuoliselle taulukolle yhdeksällä nappulalla pelaajaa kohden, os8 kahdeksan pisteen yksipuoliselle taulukolle (pelkkä os tarkoittaa os6).

Kaksi perhettä eivät vastaa samaan kysymykseen. Kaksipuolinen taulukko laajentaa aluetta, jolla voittotodennäköisyys ja kuution tuomio ovat tarkkoja; yksipuolinen laajentaa sitä, kuinka kaukana kotoa nappula saa olla ilman että EPC vaikenee (enintään kymmenen pistettä).

generate. Kertoo koon, muistintarpeen ja arvioidun ajan ennen aloitusta, sitten näyttää prosenttiosuuden ja mitatun jäljellä olevan ajan.

  • --ts — Laskettava kaksipuolinen alue, esimerkiksi 6x9.

  • --os — Laskettava yksipuolinen alue pisteiden määränä: 6–12. Näistä kahdesta tarvitaan täsmälleen yksi.

  • --cores — Käytettävät ytimet (oletus: kaikki paitsi yksi).

  • --data-dir — Minne kirjoitetaan (oletus: sovelluksen datakansio).

  • --quiet — Ei edistymisriviä.

CTRL-C keskeyttää tauolle. Signaali otetaan kiinni: tila kirjoitetaan taulukon viereen, ja sama komento uudelleen ajettuna jatkaa siitä mihin jäi sen sijaan että laskisi kaiken uudelleen. Puoli tuntia aritmetiikkaa kannattaa kirjoittaa muistiin. bearoff delete heittää odottavan jatkon pois. Vain kaksipuolinen ajo menee tauolle; yksipuolinen on peräkkäinen eikä --cores hyödytä sitä.

list. Hinnoittelee jokaisen alueen — koko, muisti, aika tällä koneella — ja kertoo mitkä ovat jo olemassa, tuomioineen, ja millä on tauolla oleva ajo. --format json skriptiä varten, --cores arvion oletuksen muuttamiseen.

verify. Vastaa verified (samat tavut kuin viitteessä), unverified (hyvin muodostettu, mutta alueelle ei ole tallennettu sormenjälkeä) tai corrupt (tiedosto on ristiriidassa itsensä kanssa). Päättyy virheeseen viimeisessä tapauksessa: tämä komento on tehty skriptiin pantavaksi.

delete. Poistaa taulukon, odottavan jatkon ja kuolleen ajon jäänteet. Oletusalue lasketaan uudelleen sovelluksen seuraavalla käynnistyksellä; laajempaa ei.

Esimerkkejä:

# Ce que cette machine a, et ce que chaque domaine coûterait
./blunderdb bearoff list

./blunderdb bearoff generate --ts 6x9 --cores 4

# OS-08 : l'EPC répond alors jusqu'à un pion sur la 8
./blunderdb bearoff generate --os 8

# Sur un serveur, dans le volume que lit le démon
./blunderdb bearoff generate --ts 6x11 --data-dir /srv/bearoff

./blunderdb bearoff verify /srv/bearoff/gnubg_ts6x11.bd

analyze — gammonNet-täydennysanalyysi

Kirjoittaa gammonNet-analyysin jokaiselle asemalle, jolla ei ole yhtään analyysiä — ennen tämän toiminnon olemassaoloa kootun kirjaston täydentäminen (ADR-0013, ADR-0015). Kyseessä on sama toiminto kuin tuonnin jälkeinen automaattinen käynnistys ja graafisen käyttöliittymän painike « Analysoi nyt » sekä serve-daemonin päätepiste /v1/gammonnet.analyzeMissing yhdelle vuokralaiselle — saman toiminnon kolme eri muotoa, ei kolmea erillistä logiikkaa (katso Headless-tila (palvelin)).

./blunderdb analyze --db <path> [options]

Valitsimet:

  • --db — Tietokanta (pakollinen).

  • --ply — Hakusyvyys (oletus: 2, kanoninen asetus).

  • --prune-k — Karsinnan leveys (oletus: 12, kanoninen asetus).

  • --candidates — Siirtopäätöstä kohden säilytettävien ehdokassiirtojen määrä (oletus: 10).

  • --jobs — Rinnakkain analysoitavien asemien määrä (oletus: koneen ydinten määrä).

  • --match — Rajaa erän yhden ottelun asemiin (0, oletusarvo, tarkoittaa koko kirjastoa).

  • --compare — Ei kirjoita mitään: vertaa gammonNetia tuotuihin analyyseihin aukkojen täyttämisen sijaan (katso alta).

  • --limit — Yhdessä --compare:n kanssa: pysähtyy tämän asemamäärän jälkeen (0 = kaikki).

  • --format — Tulostusmuoto: text (oletus, edistymisen kanssa) tai json (yksi yhteenvetoasiakirja, tulostetaan lopussa).

  • --rollout — Pelaa --query-valitsimen valitsemat asemat rolloutilla aukkojen täyttämisen sijaan (katso alla).

  • --query — --rollout-valitsimen kanssa pelattavat asemat haun kyselykielellä (search --query-help); tyhjänä kaikki.

Ilman analyysiä tuotu ottelu saa näin PR-luvun. Näin on verkossa pelatun ottelun tai Jellyfish-.mat-tiedoston laita, kun kukaan ei ole ajanut sitä XG:n läpi. blunderDB tunsi asemat ja pelatut siirrot, mutta mikään ei kertonut mitä ne olivat arvoltaan; erän ajon jälkeen todella pelattua siirtoa verrataan gammonNetin järjestykseen, ja ero syöttää PR:n ja kaikki muut mittarit. Pelattu siirto tulee ottelun omasta siirtotaulusta, joka kirjoitetaan tuonnissa riippumatta siitä kantoiko tiedosto analyysin — sitä ei koskaan arvata.

Tätä vanhemmalla versiolla analysoitua tietokantaa ei tarvitse arvioida uudelleen: repair laskee sarakkeet uudelleen jo tallennetusta ja palauttaa noille otteluille niiden PR:n.

Vain yksi ottelu (--match). Tunnisteella, jonka list --type matches näyttää, erä käy läpi vain kyseisen ottelun asemat: sama aukkosääntö, samat takeet, kapeampi kattavuus. Juuri tuotu ottelu saa analyysinsä ilman että muuta kirjastoa käydään läpi, ja korjattu ja toistamiseen analysoitu ottelu maksaa vain korjauksen luomat asemat, koska kaikilla muilla on jo analyysi. Valitsinta ei voi yhdistää --stale- eikä --compare-valitsimeen, jotka molemmat katsovat asemia joilla jo on analyysi: molempien pyytäminen on virhe eikä hiljaisesti ohitettu kattavuus.

Rinnakkaisuus (--jobs). Erän asemat ovat toisistaan riippumattomia — mikään haku ei vaikuta seuraavaan — joten ne jaetaan --jobs säikeelle, joista jokaisella on oma evaluaattorinsa. Kirjoitetut analyysit ovat identtiset riippumatta siitä, mikä arvo on annettu valitsimelle --jobs; vain laskenta-aika muuttuu. --jobs 1 jättää koneen vapaaksi muuhun käyttöön. Keskeytys ei muutu: Ctrl-C pysäyttää erän ennen jokaista uutta asemaa, ja kaikki jo laskettu kirjoitetaan.

Aukkosääntö (ADR-0013). Asemaan, jolla on jo analyysi — XG, GNUbg, BGBlitz tai aiempi gammonNet-ajo — ei koskaan kosketa riippumatta siitä, mikä moottori puuttuu. Vain asema, jolla ei ole yhtään analyysiä, kirjoitetaan. Komennon voi siis käynnistää uudelleen milloin tahansa ilman riskiä ja keskeyttää siististi: Ctrl-C peruuttaa menettämättä mitään jo kirjoitettua, ja seuraava ajo jatkaa täsmälleen siitä, mihin edellinen jäi — lokia ei tarvita, koska « asemat ilman analyysiä » lasketaan uudelleen jokaisella käynnistyksellä.

Esimerkki:

./blunderdb analyze --db base.db

# Analyzing 1204 position(s) with gammonNet (2-ply, k=12, 16 job(s))...
#   1/1204 (0%)
#   61/1204 (5%)
#   ...
#   1204/1204 (100%)
# Done.

./blunderdb analyze --db base.db --jobs 1

# Un seul match, celui qui vient d'être importé
./blunderdb analyze --db base.db --match 12

Erä-rolloutit (--rollout). Jokainen --query-valitsimen valitsema asema pelataan rolloutilla, yksi kerrallaan kaikilla ytimillä, ja rollout tallennetaan analyysin viereen, ei koskaan sen tilalle. Arvo on esiasetus — fast (216 peliä, katkaistu 7:ään) tai standard (1296 peliä, katkaistu 11:een) — tai vapaat asetukset: valinnainen esiasetus, sitten games=, min-games=, truncation=, jsd=, ply=, candidates=, seed=, pilkuilla erotettuina. Asema, jolla on jo rollout samoilla asetuksilla, ohitetaan: Ctrl-C:llä keskeytetty ajo jatkuu siitä, mihin se jäi, ja kesken oleva asema hylätään kokonaan. Aseman, jota vain rollout analysoi, haku löytää sen kautta; jo analysoitu asema säilyttää analyysinsa sarakkeet.

./blunderdb analyze --db base.db --rollout fast --query 'E>80'
./blunderdb analyze --db base.db --rollout 'standard,ply=1' --query 'c'

--compare: mitä gammonNet on arvoltaan sinun kirjastossasi?

Moottorin tarkkuus mitataan muualla vertailukorpuksia ja tarkkaa poistotaulua vasten. Kumpikaan mittaus ei vastaa siihen kysymykseen, joka käyttäjällä oikeasti on ja joka koskee hänen asemiaan: XG:stä tuoduissa otteluissa, missä sisäänrakennettu moottori on eri mieltä kuin tiedoston mukana tullut analyysi, ja mitä tuo erimielisyys maksaisi?

--compare vastaa, eikä kirjoita mitään. Se ei ole varotoimi vaan komennon koko idea: ADR-0013 suojaa tuotua analyysiä ehdoitta, joten vertailun voi ajaa kirjastoon, jota ei missään nimessä halua kirjoitettavan uusiksi.

Raportti antaa:

  • yksimielisyysasteen parhaasta vastauksesta, eriteltynä nappulasiirtoihin ja kuutiopäätöksiin — näillä kahdella ei ole mitään tekemistä toistensa kanssa, ja yksi luku peittäisi kumpi niistä pettää;

  • erimielisyyden hinnan, arvotettuna tuodun analyysin omalla asteikolla: mitä gammonNetin suosima siirto on arvoltaan tuodun moottorin mukaan, vähennettynä sen oman parhaan siirron arvolla. Tämä suunta on ainoa, jonka molemmat moottorit voivat yhdessä laskea; erimielisyyden hinnoittelu kahdesti houkuttelisi lukemaan pienemmän luvuista;

  • erittelyn pelin vaiheen mukaan, joka kertoo missä erimielisyydet ovat;

  • kymmenen kalleinta erimielisyyttä, asema kerrallaan.

Kaksi moottoria kirjoittaa saman siirron eri tavoin — XG kirjoittaa ”13/7” siinä missä gammonNet kirjoittaa ”13/8 8/7”, syönnit merkitään toisella puolella eikä toisella, toisto tiivistetään joskus muotoon ”(2)”. Nämä erot ovat murretta eivätkä erimielisyyttä: vertailu palauttaa molemmat merkinnät kanoniseen muotoon ennen vertaamista. Ilman sitä testikorpus näytti 78,8 % yksimielisyyttä 93,2 %:n sijaan — viisitoista prosenttiyksikköä valheellisia erimielisyyksiä.

Siirtoa, jota tuotu moottori ei ole listannut, ei voi hinnoitella sen asteikolla: se lasketaan nollakustannuksiseksi erimielisyydeksi eikä keksityksi kustannukseksi.

# Comparer sur un échantillon de 500 positions
./blunderdb analyze --db base.db --compare --limit 500

# compared: 118 decision(s)  (refused 2, failed 0)
# same best answer: 93.2% (110/118)
#   checker play:   93.7% (59/63)
#   cube decision:  92.7% (51/55)
# ...

transcribe — Toista litterointi uudelleen

Toistaa litteroinnin uudelleen ja kertoo, mitä toisto siitä löytää. Lähde on .mat-tiedosto, kirjaston ottelu tai litteroinnin luonnos — täsmälleen yksi kolmesta. Ottelu luetaan sen .mat-muodon kautta, jonka se veisi ulos: toistettavaksi tulee siis se, mitä vienti sisältäisi.

./blunderdb transcribe --mat <fichier> [--check] [--render <sortie>]
./blunderdb transcribe --db <path> --match <id> --check
./blunderdb transcribe --db <path> --draft <id> --check
./blunderdb transcribe --db <path> --match <id> --edit [--accept-losses]
./blunderdb transcribe --db <path> --draft <id> --finish|--abandon

Valitsimet:

  • --mat — Toistettava .mat-tiedosto.

  • --db — Tietokanta, valitsimia --match ja --draft varten.

  • --match — Toistettavan kirjaston ottelun tunniste.

  • --draft — Toistettavan litteroinnin luonnoksen tunniste.

  • --check — Luettelee löydetyt epäjohdonmukaisuudet (oletustoiminta).

  • --render — Kirjoittaa litteroinnin takaisin .mat-muodossa tähän polkuun.

  • --format — Tulostusmuoto: text (oletus) tai json.

  • --edit — Avaa luonnoksen --match-ottelulle (tai palauttaa sille jo avatun).

  • --accept-losses — --edit-valitsimen kanssa tuodulla ottelulla: hyväksyy, että sen analyysit ja kommentit voivat hävitä.

  • --finish — Viimeistelee --draft-luonnoksen: kirjoittaa sen ottelun tai korvaa sen, josta se avattiin, ja vapauttaa luonnoksen.

  • --abandon — Hylkää --draft-luonnoksen: poistaa sen ilman ottelua; ottelu, josta se avattiin, pysyy ennallaan.

  • --yes — --abandon-valitsimen kanssa luonnokseen, josta ei ole koskaan syntynyt ottelua: vahvistaa, että kaikki siihen kirjoitettu menetetään.

--check nimeää jokaisen epäjohdonmukaisuuden siirron numerolla ja pelillä, jossa se on: laiton siirto, kaksi vuoroa peräkkäin samalle pelaajalle, mahdoton tuplauskuution toiminto, ottelun päättymisen jälkeinen toiminto, siirto jonka askeleet eivät käytä sen omia noppia, pelin ensimmäinen siirto tuplanopilla, joka ei voi olla aloitusheitto, kirjaamaton siirto — solu ???, jonka gnubg kirjoittaa kun se ei säilyttänyt pelattua siirtoa, eikä se tarkoita ettei pelaaja olisi voinut siirtää, epäjohdonmukainen ilmoitettu tilanne — peli, jonka tilannerivi ei ole se, jonka aiemmat pelit antavat, ja joka pelataan uudelleen kirjoitetulla tilanteella.

Epäjohdonmukaisuus raportoidaan, sitä ei koskaan pidetä esteenä: mitään ei hylätä sen takia, ja paluuarvo pysyy nollana riippumatta siitä, mitä toisto löytää. Nollasta poikkeava arvo kertoo todellisesta epäonnistumisesta — lukukelvoton tiedosto, tietokanta joka ei aukea, tuloste jota ei voi kirjoittaa. Skripti, joka haluaa toimia havaintojen perusteella, lukee ne muodossa --format json, jossa rikkinäinen tiedosto ja laittoman siirron sisältävä peli eivät mene sekaisin.

--render kirjoittaa litteroinnin takaisin .mat-muotoon, mikä sallii edestakaisen muunnoksen tarkistamisen oikealla tiedostolla testien ulkopuolella.

Vain kolme valitsinta kirjoittaa, samoilla menetelmillä kuin Litterointi-paneeli: --edit avaa luonnoksen olemassa olevalle ottelulle, --finish viimeistelee sen — ottelu korvataan samalla tunnisteella — ja --abandon poistaa luonnoksen ilman ottelua ja vaatii --yes-valitsimen luonnokselle, jota ei ole koskaan viimeistelty ja joka vie mukanaan kaiken siihen kirjoitetun. Tuotu ottelu sisältää analyysejä ja kommentteja, joita .mat ei sisällä: --edit ilmoittaa niiden määrän enintään ja kieltäytyy ilman --accept-losses-valitsinta.

Esimerkki:

./blunderdb transcribe --mat match.mat --check

# match.mat: 7 point match, 4 game(s), 203 action(s)
#   Final score: 9-2
# Inconsistencies: none

tournament — Johdetun turnauksen lukeminen

Lukee johdetun turnauksen ilman graafista käyttöliittymää. Turnauksen johtaminen interaktiivisesti on Nicomaque-moottorin oman konsolin tehtävä; nämä alikomennot lukevat, mikään ei odota syötettä, ja vain move kirjoittaa.

./blunderdb tournament <sous-commande> --db <chemin> [options]

Alikomennot:

  • list [--format text|json] — Tietokannan johdetut turnaukset, niiden tila, moottorin versio, tapahtuma johon kukin kuuluu (tyhjä jos ei mihinkään) ja viimeisimmän päätöksen päivämäärä.

  • verify --id N [--format text|json] — Toistaa johtamisen uudelleen ja ilmoittaa jäljellä olevat varoitukset. Päättyy virheeseen, jos yksikin jää: tämä on turnauksen jälkeinen tarkistus, ja skripti, joka ajaa sen kauden tietokannoille, haluaa paluukoodin eikä suodatettavaa riviä.

  • standings --id N — Sijoitukset CSV-muodossa, palkinnot mukaan lukien, käyttöliittymän kielellä.

  • ranking --season [--rencontre N] [--from AAAA-MM-JJ] [--to AAAA-MM-JJ] [--points 25,18,15] [--participation P] [--elo] [--format csv|json] — Kauden sijoitus: tapahtuman tai ajanjakson päättyneet turnaukset (rajat mukaan lukien, turnauksen päivämäärän mukaan; ilman suodatinta kaikki johdetut turnaukset), kukin sija muunnettuna pisteiksi pisteytyksellä (voittaja ensin; oletuksena 25, 18, 15, 12, 10, 8, 6, 4, 2, 1), lisäksi --participation jokaisesta pelatusta turnauksesta. Tasapisteissä olevat jakavat keskenään haltuunsa ottamiensa sijojen keskiarvon. Henkilö tunnistetaan turnauksesta toiseen nimen perusteella. --elo lisää kauden otteluiden pohjalta uudelleen pelatun seuran Elon (FIBS-kaava, lähtö 1500). CSV antaa yhden rivin henkilöä kohti ja yhden pistesarakkeen turnausta kohti; päättymätön turnaus luetellaan, mutta se ei tuota mitään.

  • page --id N|--rencontre N [--out <kansio>] — Kilpailun HTML-näyttösivu (--id), tai tapahtuman seinäsivu (--rencontre: yksi rivi per pöytä, riippumatta siitä mikä kilpailu sitä käyttää). Tasan toinen näistä vaaditaan. Ilman --out-valitsinta se menee vakiotulosteeseen; sen kanssa se kirjoitetaan kansioon, josta tulee johtamisen tai tapahtuman kansio.

  • export --id N — Raaka tapahtumaloki, jonka moottorin työkalut voivat toistaa. Loki on johtamisen koko totuus: sijoitukset, kaaviot ja varoitukset toistetaan siitä. Tätä tulostetta lukeva työkalu ei tarvitse blunderDB:tä lainkaan.

  • move --id N --match M --table T [--format text|json] — Vaihtaa käynnissä olevan ottelun pöydän, kuten ruudun vetäminen toisen päälle ruudukossa. Jos kohdepöytä on varattu, kaksi ottelua vaihtavat pöytiä keskenään; käytöstä poistettu pöytä hylätään. Tapahtumassa, jos pöydän on varannut toinen kilpailu, vaihto tehdään kahden kilpailun välillä: pöydänvaihto kirjataan kummankin lokiin. Tulostaa jokaisen käynnissä olevan ottelun pöydän.

  • hall --rencontre N [--format text|json] — Tapahtuman kaikki pöydät: yksi rivi pöytää kohti, riippumatta siitä, mikä kilpailu sen varaa (kilpailu, ottelu, pelaajat), sitten kunkin kilpailun ehdotukset. Se on ruudukko, jonka Directionin Kaikki pöydät -näkymä näyttää. Pöydät ryhmitellään saleittain, kun tapahtumalla on saleja, ja ne nimetään, kun niillä on nimi.

  • tables --rencontre N|--tournament N [--format text|json] — Pöytien ominaisuudet (nimi, sali, varattu, osoitettu) ja salit, joissa tapahtuman kukin kilpailu pelataan (--rencontre), tai yksin pelattavan kilpailun ominaisuudet (--tournament). Vain luku: kirjoitus kulkee call-komennon kautta (rencontres.setTables, rencontres.setEventRooms, directions.setTables).

Yhteiset valitsimet: --db (pakollinen), --id (pakollinen paitsi komennoille list, page --rencontre hall ja tables), --format.

Esimerkkejä:

./blunderdb tournament list --db base.db
./blunderdb tournament verify --db base.db --id 3
./blunderdb tournament standings --db base.db --id 3 > classement.csv
./blunderdb tournament ranking --db base.db --season --from 2026-01-01 --to 2026-12-31 --elo > saison.csv
./blunderdb tournament page --db base.db --id 3 --out /tmp/affichage
./blunderdb tournament page --db base.db --rencontre 1 --out /tmp/evenement
./blunderdb tournament export --db base.db --id 3 > journal.json
./blunderdb tournament move --db base.db --id 3 --match m4 --table 7
./blunderdb tournament hall --db base.db --rencontre 1
./blunderdb tournament tables --db base.db --rencontre 1

trash — Roskakori

Mitä on poistettu ja millä sen saa takaisin. Poisto on yhä poisto: JSON-tilannekuva katoavasta kirjoitetaan ensin, eikä mikään muu tietokannassa tiedä tuon taulun olemassaolosta — ei hakusuodatin, ei tilasto, ei säilytyssääntö.

./blunderdb trash <sous-commande> --db <chemin> [options]

Alikomennot:

  • list — Mitä roskakorissa on, uusimmasta poistosta vanhimpaan.

  • restore --id N — Palauttaa merkinnän N ja poistaa sen roskakorista.

  • discard --id N — Poistaa merkinnän N heti, palauttamatta sitä.

  • empty [--older-than P] — Tyhjentää roskakorin tai vain sen, mikä on yli P päivää vanhaa.

  • delete --kind K --id N — Poistaa kohteen roskakorin kautta, jotta teon voi perua. K on position, collection tai comment.

Yhteiset valitsimet: --db (pakollinen), --kind, --limit (oletus 50), --format (text tai json).

Muista

blunderdb delete poistaa yhä ilman turvaverkkoa: skripti, joka poistaa aseman, odottaa sen katoavan, ja hiljainen tilannekuvan jättäminen kasvattaisi tiedostoa, jonka kasvua kukaan ei pyytänyt. trash delete on se, joka säilyttää perumisen.

Aseman palautus kulkee uudelleen Zobrist-deduplikoinnin läpi: se ei koskaan luo kaksoiskappaletta, mutta se ei palauta vanhaa tunnistetta — alkuperäistä riviä ei enää ole. Palautettu asema on sama asema uudella numerolla.

Yli kolmekymmentä päivää vanhat poistaa blunderdb vacuum — ei koskaan tietokannan avaaminen.

Esimerkkejä:

# Supprimer une position en gardant l'annulation
./blunderdb trash delete --db base.db --kind position --id 412

# Voir la corbeille, puis remettre une entrée
./blunderdb trash list --db base.db
./blunderdb trash restore --db base.db --id 3

# Ne garder que ce qui a moins de trente jours
./blunderdb trash empty --db base.db --older-than 30

info — Tietokannan metatiedot

Näytä tietokannan metatiedot ja tilastot.

./blunderdb info --db <path> [--format <format>]

Valitsimet:

  • --db — Tietokanta (pakollinen).

  • --format — Tulostusmuoto: text tai json (oletus: text).

Esimerkkejä:

./blunderdb info --db base.db

# Database Information
# ==================================================
# Path: /home/jean/bg/base.db
#
# Metadata:
#   Version: 2.20.0
#   User: Jean
#   Description: Matchs de tournoi 2025
#   Date of Creation: 2026-09-06 02:43:51
#
# Statistics:
#   Positions: 3859
#   Analyses: 3855
#   Matches: 11
#   Games: 61
#   Moves: 3766

--format json lisää tiedoston alkuperän — issuance kantaa vesileiman, jos sellainen on, sekä tämän koneen liikkeeseenlaskijan identiteetin:

./blunderdb info --db base.db --format json
{
  "issuance": {
    "watermarked": false,
    "issuerFingerprint": "1186-57FA-060C-9378",
    "issuerName": "unger"
  },
  "metadata": {
    "database_version": "2.20.0",
    "dateOfCreation": "2026-09-06 02:43:51",
    "description": "Matchs de tournoi 2025",
    "user": "Jean"
  },
  "path": "/home/jean/bg/base.db",
  "stats": {
    "analysis_count": 3855,
    "game_count": 61,
    "match_count": 11,
    "move_count": 3766,
    "position_count": 3859
  }
}

edit — Muokkaa metatietoja

Muokkaa tietokannan käyttäjänimeä, kuvausta tai kynnysarvoja.

./blunderdb edit --db <path> [options]

Valitsimet:

  • --db — Tietokanta (pakollinen).

  • --user — Uusi käyttäjänimi.

  • --description — Uusi kuvaus.

  • --clear-user — Tyhjennä käyttäjänimi.

  • --clear-description — Tyhjennä kuvaus.

  • --error-threshold — Virhekynnys millipisteinä: päätös, joka maksaa vähintään tämän verran, on virhe.

  • --blunder-threshold — Blunderin kynnys millipisteinä: virhe, joka maksaa vähintään tämän verran, on blunder.

  • --format — Tulostusmuoto: text (oletus) tai json ({"changes": [...]}).

Vähintään yksi muokkausvalitsin vaaditaan.

Esimerkkejä:

./blunderdb edit --db base.db --user "Marie" --description "Ma collection"
./blunderdb edit --db base.db --clear-description
./blunderdb edit --db base.db --error-threshold 20 --blunder-threshold 80

verify — Tarkista eheys

Tarkista tietokannan eheys ja valinnaisesti vertaa ottelua sen lähdetiedostoon.

./blunderdb verify --db <path> [--match <id>] [--mat <file.mat>]

Valitsimet:

  • --db — Tietokanta (pakollinen).

  • --match — Tarkistettavan ottelun tunnus.

  • --mat — Verrattava MAT-tiedosto (käytetään yhdessä --match:n kanssa).

  • --format — Tulostusmuoto: text (oletus) tai json (tilastot, orvot rivit, skeemapoikkeama ja mahdollinen ottelun tarkistus).

Ilman --match-valitsinta komento näyttää tietokannan yleiset tilastot. --match-valitsimen kanssa se tarkistaa ottelun tiedot ja voi verrata niitä alkuperäiseen lähdetiedostoon.

Jokainen ajo tarkistaa myös viite-eheyden: se laskee orvot rivit — pelit ilman ottelua, siirrot ilman peliä, siirtoanalyysit ilman siirtoa, analyysit ilman asemaa, kertauspäiväkirjan merkinnät ilman pakkaa tai ilman asemaa — ja tulostaa WARNING-rivin kokonaismäärällä, jos niitä on. Terve tietokanta vastaa Orphaned rows: none. Orpoja voi jäädä tietokantaan, jonka kirjoitti versio joka ei valvonut vierasavaimia jokaisella yhteydellä, tai ennen kuin kertauspäiväkirjalla oli omansa; ne eivät kuulu mihinkään otteluun eivätkä mihinkään pakkaan ja vievät vain tilaa. Komento päättyy silti paluukoodiin 0.

Jokainen ajo vertaa myös skeemaa viite-DDL:ään ja luettelee taulut, sarakkeet ja indeksit, jotka tietokannasta puuttuvat. Tietokannan avaaminen lisää puuttuvat osat, kun se on mahdollista, ja vain kirjaa lokiin sen, mitä se ei voi lisätä (tyypillisesti UNIQUE-indeksin, jonka uudelleenrakentamisen kaksoisrivit estävät): tässä tuo puute tulee näkyviin, ja kysely, joka nimeää jonkin näistä osista, epäonnistuu, kunnes syy on korjattu. Terve tietokanta vastaa Schema: matches the reference DDL. Kuten orporivit, skeemapoikkeama on havainto, ei virhe: paluukoodi pysyy nollana.

Jokainen ajo tarkistaa lopuksi säännöt, jotka nykyinen DDL esittää mutta joita SQLite ei osaa lisätä jo olemassa olevaan tauluun: CHECK-rajoitteet (nopat välillä 0–6, tuplauskuutio ja pipit ei-negatiivisia, 0–15 ulos kannettua nappulaa, kertausarvosana välillä 1–4), Zobrist-tiivisteen, jota riviltä ei koskaan pitäisi puuttua, sekä yhden analyysin asemaa kohden. Skeemaversiosta 2.18.0 alkaen luotu tietokanta valvoo niitä; vanhempi voi yhä sisältää rivejä, jotka uusi tietokanta hylkäisi, ja juuri ne lasketaan tässä sääntö kerrallaan. Terve tietokanta vastaa Constraints: every row satisfies the current DDL. Yksi havainto lisää: mitään ei korjata ja paluukoodi pysyy nollassa.

Jokainen ajo laskee lopuksi uudelleen kaksi denormalisoitua laskuria, match.game_count ja game.move_count, niistä riveistä joita ne väittävät laskevansa, ja kertoo kuinka moni on eri mieltä ja kuinka paljon pahimmillaan. Molemmat kirjoitetaan kerran, tuonnin yhteydessä, sen mukaan mitä lähdetiedosto sisälsi, ja juuri ne näkyvät otteluluettelossa ja pelinäkymässä: pieni ero on useimmiten tuonti, joka ohitti sen mitä ei osannut muuntaa. Mitään ei kirjoiteta uudelleen — laskurin korvaaminen tallennetulla pyyhkisi juuri sen eron, jota kannattaa katsoa. Terve tietokanta vastaa Counters: game_count and move_count agree with the rows.

Esimerkkejä:

./blunderdb verify --db base.db
./blunderdb verify --db base.db --match 1
./blunderdb verify --db base.db --match 1 --mat original.mat

Käyttö vartijana. Paluukoodi on 0 riippumatta siitä, mitä komento löytää: tuomion kantaa --format json, ja skriptin on luettava laskurit itse.

{
  "stats": {
    "analysis_count": 3855,
    "game_count": 61,
    "match_count": 11,
    "move_count": 3766,
    "position_count": 3859
  },
  "orphans": {
    "games_without_match": 0,
    "moves_without_game": 0,
    "move_analyses_without_move": 0,
    "analyses_without_position": 0,
    "reviews_without_deck": 0,
    "reviews_without_position": 0
  },
  "orphan_total": 0,
  "schema_drift": {
    "missing_tables": null,
    "missing_columns": null,
    "missing_indexes": null
  },
  "schema_drift_count": 0,
  "constraint_violations": [
    {"name": "position.zobrist_hash NOT NULL", "count": 0},
    {"name": "position.dice_1 BETWEEN 0 AND 6", "count": 0}
  ],
  "constraint_violation_total": 0,
  "counter_drift": {
    "matches_with_wrong_game_count": 0,
    "games_with_wrong_move_count": 53,
    "worst_game_count_gap": 0,
    "worst_move_count_gap": 2
  },
  "counter_drift_total": 53
}

Kolme kenttää ansaitsee hälytyksen: orphan_total, schema_drift_count ja constraint_violation_total. Nollasta poikkeavina ne kuvaavat tietokantaa, joka on korjattava.

./blunderdb verify --db base.db --format json \
  | jq -e '.orphan_total == 0 and .schema_drift_count == 0 and .constraint_violation_total == 0'

counter_drift_total ei kuulu näihin, ja yllä oleva esimerkki osoittaa sen: sen tuottanut tietokanta oli juuri tuotu, ja siinä on jo 53 peliä, joiden siirtolaskuri poikkeaa siitä, mitä rivit sisältävät. Nämä laskurit tulevat lähdetiedostosta, eivät tietokannasta; poikkeama kertoo tuonnista, se ei ilmaise vioittumista. Katsokaa sitä, mutta älkää käyttäkö sitä kynnysarvona.

vacuum — Tietokannan tiivistäminen

Ottaa takaisin levytilan, jonka poistot (ottelut, turnaukset, siivoukset) ovat jättäneet: SQLite ei koskaan pienennä tiedostoa itsestään dataa poistettaessa, sitä on pyydettävä nimenomaisesti. Tämä on ainoa tapa käynnistää tiivistys — se ei tapahdu koskaan automaattisesti tietokantaa avattaessa, koska sen kustannus on suuressa tietokannassa arvaamaton.

./blunderdb vacuum --db <path>

Valitsimet:

  • --db — Tietokanta (pakollinen).

  • --format — Tulostusmuoto: text (oletus) tai json ({"size_before", "size_after", "reclaimed"}, tavuina).

Komento aloittaa suorituksella wal_checkpoint(TRUNCATE), jotta ennen tiivistystä näytetty koko on rehellinen, tarkistaa, että levyllä on jäljellä noin kaksi kertaa tiedoston nykyinen koko (SQLite rakentaa koko tietokannan uudelleen ennen siihen siirtymistä), suorittaa VACUUM-toiminnon ja sen jälkeen ANALYZE-toiminnon virittääkseen kyselysuunnittelijan käyttämät tilastot. Jos levytila ei riitä, komento kieltäytyy käynnistymästä selkeällä viestillä sen sijaan, että riskeeraisi keskeytyneen tiivistyksen.

Esimerkki:

./blunderdb vacuum --db base.db

# Compacting database...
#   Before: 128.4 MiB
#   After:  41.2 MiB
#   Reclaimed: 87.2 MiB

repair — Laske uudelleen se, mikä on johdettua

Laskee uudelleen sen, minkä tietokanta johtaa siitä mitä se tallentaa: jokaisen analyysin skalaarisarakkeet itse analyysistä, jonka projektio ne vain ovat; jokaisen aseman vaiheen ja pelityypin sen laudasta; ja jokaisen pistetilanteen Crawford-merkin siitä ottelusta, josta asema on peräisin, tai siitä XGID:stä, jonka mukana se tuli. Analyyseihin ei kosketa: uusiksi tehdään niistä johdetut arvot.

./blunderdb repair --db <path>

Valitsimet:

  • --db — Tietokanta (pakollinen).

  • --format — Tulostusmuoto: text (oletus) tai json — yksi laskuri kierrosta kohden: repaired (analyysisarakkeet), phases (uudelleen luokitellut asemat) ja crawford (uudelleen tiivistetyt asemat). Kukin kertoo todella muuttuneiden rivien määrän.

Hyödyllinen sen jälkeen, kun tuodun analyysin lukutapaa on korjattu. Näin on käynyt jo kahdesti. XG-tuoja kirjoittaa ”ei tuplausta” kahdella tavalla, ja jälkimmäinen ymmärrettiin oikeana tuplauksena — sarake kantoi silloin tuplauksen virhettä, jota ei koskaan tapahtunut. Ja blunderDB:n itse laskema analyysi ei tiennyt mikä siirto oli pelattu, joten ilman analyysiä tuotu ottelu piti virheen nollassa kaikkialla ja PR:n arvossa 0,00; sarake lasketaan nyt uudelleen ottelun siirroista. Lukutavan korjaus ei muuta mitään jo kirjoitetuissa riveissä; tämä komento tekee ne uudelleen.

Crawford-vaihe puolestaan koskee asemia itseään. Pistetilanne 1 tarkoittaa ”yksi piste jäljellä, ja tämä peli ON Crawford-peli”; 0 tarkoittaa ”yksi piste jäljellä, Crawford on takanapäin”. Niin kauan kuin tuojat eivät kirjoittaneet tätä eroa, jokainen Crawfordin jälkeinen asema tallennettiin Crawford-asemana ja luettiin siis kuollein tuplauskuutioin — juuri siellä, missä perässä oleva tosiasiassa tuplaa ensimmäisellä tilaisuudella. Pistetilanteen korjaaminen muuttaa aseman tiivisteen: rivi tiivistetään siis uudelleen ja sulautetaan oikeaan kaksoseensa, jos tietokannassa on jo sellainen — analyysi, kommentit, kokoelmat, Anki-kortit ja niiden kertaushistoria, ottelun siirrot sekä roskakorin merkinnät, jotka viittaavat siihen, seuraavat eloon jäänyttä riviä. Asema, johon mikään ottelu ei osoita, korjataan vain sen XGID:n sanan perusteella, jonka se toi toisesta ohjelmasta (XG, BGBlitz…): kun tuon XGID:n Crawford-kenttä sanoo, ettei peli ole Crawford-peli, ja XGID todella kuvaa tämän aseman. Toiseen suuntaan asema ilman ottelua, joka on tallennettu kummallekin puolelle arvolla 0, muuttuu arvoon 1, kun sen tuoma XGID on 1 pisteen ottelun XGID ja kuvaa sen: 1 pisteen ottelun ainoa peli alkaa yhden pisteen päästä tavoitteesta, joten se on Crawford-peli, kuten tuojat sen kirjoittavat. Pidemmän ottelun Crawfordin jälkeinen DMP pysyy arvossa 0: sen XGID kertoo tuon ottelun pituuden. XGID, jonka blunderDB on itse kirjoittanut uudelleen, vain toistaa tallennetun pistetilanteen eikä todista mitään. Jokainen muu asema ilman ottelua jätetään ennalleen: mikään ei ole ristiriidassa sen kanssa, mitä sen pistetilanne ilmoittaa.

Mikään ei käynnistä sitä automaattisesti, ja se on tarkoituksellista: kaikkien analyysisarakkeiden uudelleenkirjoittaminen tai asemien uudelleen tiivistäminen pelkästä tietokannan avaamisesta ei ole jotain, mitä työkalun tulisi tehdä käyttäjänsä selän takana.

Esimerkki:

./blunderdb repair --db base.db

# 42 analyses repaired.
# 7 positions reclassified.
# 3 positions rehashed onto the right Crawford sentinel.

delete — Poista tietoja

Poista ottelu ja kaikki siihen liittyvät tiedot (pelit, siirrot, analyysit).

./blunderdb delete --db <path> --type match --id <id> [--confirm]

Valitsimet:

  • --db — Tietokanta (pakollinen).

  • --type — Poistotyyppi: match (pakollinen).

  • --id — Poistettavan kohteen tunnus (pakollinen).

  • --confirm — Poista pyytämättä vahvistusta.

  • --format — Tulostusmuoto: text (oletus) tai json ({"match_id": N, "deleted": true}).

Esimerkkejä:

# Confirmation interactive, puis sans confirmation (scripts)
./blunderdb delete --db base.db --type match --id 1
./blunderdb delete --db base.db --type match --id 1 --confirm

healthcheck — Taustaprosessin tarkistus

Kysyy käynnissä olevalta serve-taustaprosessilta (ks. Headless-tila (palvelin)), onko se valmis: yksi GET /readyz-pyyntö, paluukoodi 0, jos taustaprosessi vastaa 200 (tallennus tavoitettavissa, skeema odotetussa versiossa), muuten 1 — tallennus ei tavoitettavissa, vanhentunut skeema tai osoitteessa ei kuuntele mikään. Tietokantatiedostoa ei avata.

./blunderdb healthcheck [--addr host:port] [--timeout 2s]

Valitsimet:

  • --addr — Osoite, jota taustaprosessi kuuntelee (oletus BLUNDERDB_ADDR, muuten :8080). Osoite ilman isäntää (:8080) tai yleisisännällä (0.0.0.0, [::]) tarkistetaan loopback-liitännän kautta.

  • --timeout — Aika, jonka jälkeen tarkistus luovuttaa (oletuksena 2s).

Tämä on komento, jonka konttikuvan HEALTHCHECK suorittaa (distroless-kuva, ilman curl-ohjelmaa); myös cmd/serve-hakemistosta käännetty serve-binääri ymmärtää sen. Se sopii yhtä hyvin skriptiin tai systemd-yksikköön.

Esimerkki:

./blunderdb serve --db base.db --addr 127.0.0.1:8080 &
./blunderdb healthcheck --addr 127.0.0.1:8080 && echo "démon disponible"

# ready

Epäonnistuessa syy tulostetaan, ja docker inspect näyttää sen unhealthy-tilassa olevalle kontille:

Error: healthcheck: http://127.0.0.1:8080/readyz answered 503 Service Unavailable (version_mismatch)

mcp — Tietokannan tarjoaminen tekoälyavustajalle

Tarjoaa tietokannan työkalut tekoälyavustajalle Model Context Protocol -protokollan kautta vakiosyötteen ja -tulosteen yli: avustaja käynnistää komennon. Työkalut hakevat asemia komentorivin kieliopilla, lukevat aseman ja sen analyysin, selittävät virheen, laskevat pelaajan tilastot, luettelevat ottelut, turnaukset ja kokoelmat sekä esittävät tietovisan kysymyksen. Ne vain lukevat, paitsi valitsimella --write. Täydellinen luettelo ja demonin HTTP-vastine: Työkalut tekoälyavustajalle (MCP).

./blunderdb mcp --db base.db [--write]

Valitsimet:

  • --db — Tietokantatiedosto (pakollinen).

  • --write — Tarjoaa myös kirjoittavat työkalut: aseman tallennus, sen kommentointi, kokoelman luonti ja täyttö. Mitään ei poisteta.

Kuten call, komento siirtää vanhemman tietokannan skeeman avattaessa, myös ilman --write-valitsinta.

Esimerkki: tietokannan ilmoittaminen Claude Codelle.

claude mcp add blunderdb -- blunderdb mcp --db /chemin/vers/base.db

completion — Shell-täydennys

Tulostaa vakiotulosteeseen täydennysskriptin alikomentojen nimille. Jokaiseen skriptiin sisällytetty komentoluettelo generoidaan samasta taulukosta, jota myös blunderdb help ja main.go:n reititys (handlers()) lukevat: uusi alikomento tarjotaan siis täydennyksessä heti, kun se on kytketty, eikä mitään tarvitse ylläpitää käsin.

./blunderdb completion <bash|zsh|fish>

Esimerkkejä:

# bash
source <(blunderdb completion bash)
blunderdb completion bash | sudo tee /etc/bash_completion.d/blunderdb > /dev/null

# zsh : un répertoire déjà sur $fpath
blunderdb completion zsh > "${fpath[1]}/_blunderdb"

# fish
blunderdb completion fish | source

Paketit asentavat tämän automaattisesti: .deb/.rpm (nfpm) ja AUR-paketti tuottavat kolme skriptiä paketoidusta binääristä käännöshetkellä, ja Homebrew-cask suorittaa blunderdb completion <shell> kerran asennuksen yhteydessä komennolla generate_completions_from_executable. Mitään ei tallenneta arkistoon, joten täydennys ei voi koskaan poiketa alikomentotaulukosta.

version — Näytä versio

Näyttää blunderDB:n version ja tämän binäärin kirjoittaman tietokantaskeeman version; se on ensimmäinen asia, joka liitetään virheraporttiin.

./blunderdb version
# blunderDB version 0.36.0 (database schema 2.20.0)

Työnkulkuesimerkkejä

Turnaushakemiston tuonti

./blunderdb create --db tournoi_paris.db --user "Jean" --description "Open de Paris 2025"
./blunderdb import --db tournoi_paris.db --type batch --dir ./matchs_open_paris/
./blunderdb list --db tournoi_paris.db --type stats

Säännöllinen varmuuskopiointi

./blunderdb export --db production.db --type database --file sauvegarde-$(date +%Y%m%d).db

Virheiden analysointi

# Les positions délicates, puis celles de videau
./blunderdb search --db production.db --error-min 0.1 --export blunders.db
./blunderdb search --db production.db --decision cube --error-min 0.05 --export cube_errors.db

# Les coups réellement fautifs : au moins 100 millièmes d'équité perdus
./blunderdb search --db production.db --move-error-min 100 --format json

Paluukoodit

  • 0 — Onnistui.

  • 1 — Virhe.

Tämä tekee CLI:stä sopivan käytettäväksi skripteissä virheenkäsittelyn kanssa:

if ./blunderdb import --db base.db --type match --file match.xg; then
    echo "OK"
else
    echo "KO"
    exit 1
fi