A rubbs verziótörténete a legújabbal kezdve, az
engines/rubbsgit-történetéből és abbs.gemspecverzióemeléseiből. Minden bejegyzés arra a kézikönyv-oldalra mutat, amely az adott funkciót leírja. A boardok taggel vagy git-revízióval rögzítik a rubbs-t aGemfile.lock-jukban; az alábbi verzió a gemspecs.versionértéke az adott commitnál.
| Verzió | Dátum | Egy sorban |
|---|---|---|
| 1.1.0 | 2026-11-02 | Editor/Screen#edit autosave: másodperc és blokk (alapból kikapcsolva, a tétlenségi korlátot maga tartja); a Selector item_exits: és a Screen#pick item_commands: a kijelölt elemre hat |
| 1.0.0 | 2026-11-02 | A nagytakarítás: a TUI, a BBS::Color, a használatlan widgetek és Flow-lépések kikerültek; egy paletta, egy Selector, say(…, color:), edit, BBS.log, BBS.background, BBS::Wikipedia, a gateway csak nyilvános címet hív |
| 0.34.0 | 2026-11-02 | Gateway.new(translate: true): egy C64 ASCII/ANSI boardot is felhívhat |
| 0.33.0 | 2026-11-01 | Megerősítés (címenkénti korlát, vezérlőkarakter-mentes szöveg, korlátos telnet, korlátos AI-hívások), BBS::SQLite és rá épülve a BBS::Store, BBS::HTTP, Cache, RateLimit, Text, Address |
| 0.32.0 | 2026-11-01 | A BBS::Selector fill: megtartja a menü magasságát, ha kevesebb a tétel |
| 0.31.0 | 2026-11-01 | BBS::Gateway::Report minden hívásról, connect_timeout: |
| 0.30.0 | 2026-11-01 | Rajzok és grafikus képernyők: Petscii::Canvas, Art, Petscii::CanvasMenu, Widgets::Scene, Season, art-preview |
| 0.20.0 | 2026-10-29 | Terminal.flow(petscii:) a c64: helyett, az arc neve :petscii |
| 0.19.0 | 2026-10-28 | működik a config.theme, az on_idle, a sessionönkénti idle_seconds és a Panel elrendezése |
| 0.18.2 | 2026-10-28 | Teljes RDoc, tag-alapú kiadás, API-referencia a wikin |
| 0.18.1 | 2026-10-28 | (csak tag; az RDoc-feltöltése elbukott, lásd 0.18.2) |
| 0.18.0 | 2026-10-28 | BBS_MAX_SESSIONS, naplósor az elutasított hívóról |
| 0.17.1 | 2026-10-27 | A kézikönyv írása közben talált hibák javítása |
| 0.17.0 | 2026-10-27 | BBS::Gateway: telnet-gateway door egy másik boardhoz |
| 0.16.1 | 2026-10-27 | a Terminal.flow csak config.mouse mellett kapcsolja be az egeret |
| 0.16.0 | 2026-10-27 | BBS::Terminal: a modern-vagy-C64 kérdés |
| 0.15.0 | 2026-10-25 | PETSCII: Commodore 64 a vonalon |
| 0.14.0 | 2026-10-22 | Váltható ablakok |
| 0.13.0 | 2026-10-22 | on_tick, on_door, rejtett státuszsor-hintek |
| 0.12.0 | 2026-10-22 | Ablakok mozgatása és méretezése |
| 0.11.0 | 2026-10-22 | AnsiArt.view |
| 0.10.0 | 2026-10-22 | Teljes képernyőre tehető ablakok |
| 0.9.0 | 2026-10-22 | ZMODEM-letöltés, with_line; audit |
| 0.8.0 | 2026-10-21 | AI: tények, visszaesés, deflect |
| 0.7.0 | 2026-10-21 | Flow-doorok, a flow saját képernyői, SAUCE |
| 0.6.0 | 2026-10-20 | BBS::Door |
| 0.5.0 | 2026-10-20 | BBS::AI |
| 0.4.0 | 2026-05-12 | Az Application-réteg (és minden 2026-10-20-ig) |
| 0.3.0 | 2026-05-11 | TUI-oldalnavigáció |
| 0.2.0 | 2026-05-11 | Oldalalapú TUI DSL |
| 0.1.0 | 2026-04-28 | Flow, Telnet, Store, az Impostor BBS-ből kiemelve |
A nagytakarítás: mindenre egyetlen út. A legtöbb boardnak csak három dolgon kell változtatnia (az első három alább); a repó UPGRADING.md-je minden eltávolított vagy átnevezett API-t felsorol a helyettesítőjével és egy greppel, amely megtalálja.
Petscii::Screen#say és #rule kulcsszóként kapja a színt: say(text, color: GN), rule(color: DG).Screen#editor megszűnt: helyette edit(title:, max:), amely nil-t ad, ha a hívó kilép. A Petscii::Screen::MENU megszűnt: a BBS::Selector::COLORS az alapértelmezés.host.docker.internal, egy konténer), public_only: false-t ad meg; az elutasított hívás BBS::Gateway::Refused-dal végződik (Doorok).BBS::TUI és a Flow tui lépése, a BBS::Color, a ProgressBar, Spinner, HBox, VBox, Panel és AnsiArt widget (helyette Art + Widgets::Scene), a set, line, section, rows, table, wait_enter, fetch, pick, body, output, os Flow-lépés (helyette call), a színekről elnevezett Flow-stílusok, a Menubar#add_menu, a nyilvános Terminal.choose (helyette Terminal.flow), a Petscii::Screen.plain (BBS::Petscii.plain), a Dialogs.wrap (FrameBuffer.wrap_ansi).BBS::Ansi; a Petscii::Colors ennek C64-es nevei), egy kurzoros menü (a Flow menu-je most BBS::Selector), egy sortörés, egy PETSCII-jeltábla, egy telnet-értelmező (BBS::Telnet::Parser). A Flow-lépések objektumok; egy call blokk runnere tudja a context-et, az ask-ot, a select-et és a line-t (Flow).Theme::PRESETS, Theme.fetch(name), fagyasztott témák, az ismeretlen szerep hibát dob (Rajzolás).BBS.log és config.log_tag (a könyvtár minden naplósora a board nevével kezdődik), BBS.background (háttérszál újrapróbálással), BBS::Wikipedia, RateLimit.allow_all?, room?/record és SQLite-ban tárolt számlálók, Text.line, HTTP.get(to: io) és HTTP::TooLarge, Cache#refresh, az importkor félretett hibás CSV-sorok, Store#open!, és a hibaszabály: a repository dob, a service dönt (Adat és hálózat).Text.clean(keep_newlines: false) a sorvégből szóközt csinál ahelyett, hogy összeragasztaná a szavakat; a Telnet#settle a sessiont vagy nil-t ad vissza.BBS::Gateway.new(translate: true): egy Commodore 64 ASCII- és ANSI-terminálokra készült boardot is felhívhat; a board szövege PETSCII-ként ér hozzá, a billentyűi pedig úgy jutnak a boardhoz, ahogy egy ANSI-terminál küldené őket (Doorok).Megerősítés, és az építőelemek, amelyeket eddig minden tartalmas board maga írt meg (Adat és hálózat).
max_sessions_per_ip (6) nyilvános címenként; a NAWS legfeljebb 255×100; a bevitel és a frame buffer nem tart vezérlőkaraktert; egy szövegmező legfeljebb 64 KiB; a gateway alegyeztetései és a ZMODEM újrakezdései korlátosak; a SIGTERM úgy állítja le a szervert, mint a Ctrl-C.ai_concurrency (2) kérés, BBS::AI::Busy és a persona tartalékválasza, ha a modell foglalt (AI-karakterek).BBS::SQLite migrációkkal, és rá épülve a BBS::Store: a .csv útvonal a mellette lévő .sqlite3-at jelenti, a régi CSV egyszer beimportálódik (Telnet és a store).BBS::HTTP, BBS::Cache, BBS::RateLimit, BBS::Text, BBS::Address. Ruby 3.2 vagy újabb kell; a sqlite3 függőség lett.BBS::Selector fill:-lel megtartja a magasságát, ha a tételek kevesebb sort foglalnak, így az állapotsor a képernyő alján marad.BBS::Gateway a blokkjának átadja a hívás Report-ját (sikerült-e, a hiba, a cím, a kapcsolódás ideje, a kapott bájtok, ki bontott), és elfogadja a connect_timeout:-ot (Doorok).A TTG Klubház külsejének közös építőkövei: szövegként rajzolt képek mindkét arcra. Minden új; semmi meglévő nem változik. (A 0.20.0 és a 0.30.0 közti verziók az engines/rubbs git-történetében vannak.)
BBS::Petscii::Canvas: a C64 képernyője cellákként a nagybetűs/grafikus készletben, nyers PETSCII ki (teljes kép, szakaszok, foltok, update), a TTG Gate BBS-ből ideköltöztetve, ugyanazokkal a bájtokkal; a feed tesztekhez visszajátssza a PETSCII-t.BBS::Art: rajzok YAML-ben (karakterek, színek, reverse, cp437-hátterek, hotspotok, rétegek), ki ANSI-ra, FrameBufferre vagy Canvasra, a cellát megnevező hibákkal.BBS::Petscii::CanvasMenu: a BBS::Selector Canvasra rajzolva, a megváltozott cellák foltjaival, üresjárati hookkal az animációhoz.BBS::Widgets::Scene, BBS::Season és az art-preview eszköz. Lásd Rajzok és grafikus képernyők.A PETSCII-arc a vonal nyelvéről kapja a nevét, nem egy gépről, amelyik beszéli. Ez minden kétarcú board hívását eltöri; a mieink vele együtt változtak.
BBS::Terminal.flow(title:, modern:, petscii:) a PETSCII-arc Flow-ját a petscii: kulcson kapja (eddig c64:), a Terminal.guess / Terminal.choose pedig :modern-t vagy :petscii-t ad (eddig :c64); a Terminal::FACES kulcsai ugyanezek (Commodore).UI::Modern és UI::Petscii (lib/ui/petscii), az Impostor flow-ja Impostor::Modern / Impostor::Petscii.Négy dolog, ami le volt írva, de nem csinált semmit, most működik. Egyik boardunk sem használta őket, így egyiknek sem változik a viselkedése.
config.theme minden olyan Application témája, amelynek nincs saját theme hívása, és az alap nélküli theme do … end blokk kiindulópontja (Első lépések).on_idle { … } akkor fut, amikor a hívó eléri a tétlenségi limitet; :keep esetén vonalban marad, egyébként bont a vonal (Application).Session#idle_seconds az a limit, amit az Application-hurok és a TUI olvas, és az állítása a socket timeoutját is átírja: egy hívó több időt kaphat (Telnet, session és store).Widgets::Panel#layout a kereten belüli területet adja a gyerekeinek (Widgetek).rdoc -C lib: 100%), és az RDoc a wikin van: API-referencia, minden verzió az RDoc oldalon. A CI 100% alatt elbukik, és a repó CLAUDE.md-je szabállyá teszi.vX.Y.Z, a gemspec verziójával egyezően; a korábbi verziók utólag kaptak taget (v0.1.0 … v0.18.0).AnsiArt opciói (fill_parent, nem width) és a SAUCE levágása (az első \x1A-tól minden), az öt téma-preset, és három beállítás, amit egyelőre semmi sem olvas: Config#theme, Application.new(on_idle:) és Session#idle_seconds.max_sessions környezeti változóból is állítható: BBS_MAX_SESSIONS (alapból 100), így a telepítés a konténer memóriájához méretezheti a board kódjának módosítása nélkül (Telnet, session és store).BBS busy: N callers on, turned one away.Javítások, amelyek a kézikönyv írása közben kerültek elő.
open_door bármelyik kezelőből működik: maga állítja le az eseményciklust, így egy window-gomb (Info, Form, MasterDetail-actionök) vagy egy MasterDetail on_activate utána írt stop! nélkül is kilép a dooron át. Az Application#line_lost? jelzi, ha a futás azért ért véget, mert a vonal megszűnt (bontás, idle-limit); ilyenkor a Builder#run nem nyit doort, korábban a bontás előtt épp kiválasztott door megnyílt. Lásd Application és Doorok.app lépése a Builder#run-on át futtatja az applicationt, így ott is működnek a doorjai (Flow).theme :name az adott presetet veszi (korábban magát a Symbolt tárolta, és az első újrarajzolás elszállt), az argumentum nélküli theme pedig az eddig beállított témát adja vissza, nem állítja vissza (Rajzolás és témák).ask ... validate: Procot vagy Methodot is elfogad; a falsy válasz ugyanúgy bukik, mint a :non_empty (Flow).enabled:-je lehet lambda, amelyet a menü minden rajzolásakor és használatakor megkérdez az applicationön; a választ a Menubar::MenuItem#enabled? adja (Application).Store#upsert frissítéskor is figyelmen kívül hagyja a fejlécben nem szereplő mezőket; korábban extra oszlopként a sor végére írta őket (Telnet, session és store).Session#resize!(cols, rows): a gateway a hívó átméretezését ennek a boardnak a sessionjébe is beírja, így az átkelés után a board már az új méretet ismeri (Doorok, Telnet, session és store).BBS::Gateway.new(host:, port:, name:): door egy másik telnetes boardhoz, a régi BBS-ek telnet gatewayje. A hívó vonala változatlanul átmegy arra a boardra, és visszajön, amikor az bont, így egy board a kódja futtatása nélkül kínálhat egy másikat. Lásd Doorok.session.line kiadja a hívó socketjét egy doornak, amely továbbadja a vonalat (Telnet, session és store).shutdown-nal ébreszti a másik oldalt, sosem close-zal: egy IO#close közben megölt szál nyitva hagyja a leírót.A Teletype BBS ezen át éri el az Alexandria BBS-t és a Feediát.
Terminal.flow modern választás után csak akkor hívja az enable_mouse-t, ha a boardon be van kapcsolva a config.mouse. Korábban egy egér nélküli kétarcú board (Impostor BBS) modern hívónál is bekapcsolta a jelentést. Lásd Commodore 64.BBS::Terminal: a modern és C64-es arcú boardok első kérdése, a gembe költöztetve abból a három boardból, amelyek mindegyike saját példányt hordozott belőle. Lásd Commodore 64.
Terminal.guess(session) a telnet-válaszokból tippel: 40 oszlopnál szélesebb ablak modern, a 40 oszlop vagy a hiányzó ablakméret C64.Terminal.choose(session, title:) sima ASCII nagybetűkkel kérdez, és megnevezi a protokollokat: 1 - MODERN (ANSI/XTERM, 256 COLORS), 2 - COMMODORE 64 (PETSCII, 40 COLUMNS). Egy billentyű kijelöl, a RETURN véglegesít (a WikiProxy bevitele), és 60 másodperc csend után a választás vagy a tipp érvényes.Terminal.flow(title:, modern:, c64:) kérdez, átkapcsolja a vonalat (petscii! vagy egérjelentés), és lefuttatja a választott arc Flow-ját.A Teletype BBS, az Impostor BBS, a TTG WIKI BBS, az Alexandria BBS és a Feedia használja.
session.petscii! C64-esre állítja a sessiont: 40×25, kisbetűs karakterkészlet, nincs egér. Lásd Commodore 64.BBS::Petscii::Encoder-en megy át, így a board továbbra is UTF-8-at ír ANSI-színekkel és kurzormozgással: a betűk PETSCII-módra cserélődnek, a keretrajzoló és blokk-karakterek a C64 karaktereivé, az ANSI-színek a C64 színeivé válnak, a CR LF egy RETURN, és a pontosan 40 karakteres sor után nem jön üres sor.readkey és a readline a C64 billentyűit olvassa; a RUN/STOP és a ← :escape.session.settle(timeout:) megvárja a telnet-válaszokat és eldobja az előre begépelt bemenetet, így a board kérdés előtt tippelhet a terminálra (Telnet, session és store).config.mouse_on_connect (alapból true) hagyja, hogy a flow később kapcsolja be az egérjelentést, egy olyan kérdés után, amely előtt a C64 nem láthat escape-szekvenciát.Dialogs) elöl maradnak, amíg be nem zárják őket; a BBS::Windows típusok már nem modálisak.app.raise_window, a cycle_windows és a switchable_windows teszi ugyanezt (Application).on_tick { … }-ja másodpercenként lefut, amíg a hívó nem nyom semmit (óra az állapotsoron). Az on_door { |door, context| … } közvetlenül azelőtt fut, hogy a vonal egy doorhoz kerül. Lásd Application.status_hint(key, label, hidden: true) úgy köt be egy billentyűt, hogy nem foglal helyet az állapotsoron.Dialogs.input mezőjében az Enter megnyomja az OK-t; a kivételt dobó door visszaviszi a hívót a boardra, ahelyett hogy bontaná a hívást; a Markdown-listaelem alatti behúzott sor folytatja az elemet.┘) kell húzni; billentyűzetről a Ctrl-F5 vagy az F6 indítja, a nyilak mozgatnak, a Shift+nyilak méreteznek, a Tab vált, az Enter vagy az Esc befejezi. A movable: false kikapcsolja; kódból a move_to(x, y, w, h). Lásd Ablakok.:shift_up, :ctrl_f5, :alt_home, :ctrl_shift_right (Telnet, session és store). Egy ablak a senki által el nem vett módosított nyilat sima billentyűként adja tovább a widgetjének.AnsiArt.view(session, lines, title:): kép a teljes képernyőn, középre igazítva, a képernyőnél magasabbat a nyilakkal, a PgUp/PgDn-nel és a Home/End-del lehet görgetni; állapotsor a címmel; bármely más billentyű visszalép. Egy Application#with_line blokkon belül fut. Lásd Widgetek.maximizable: true (a window DSL-ben w.maximizable true) zoom gombot ad az ablaknak: a [↑] kitölti az asztalt a menüsor és az állapotsor között, a [↕] visszaállítja; ugyanezt teszi az F5, az Alt-Enter és a dupla kattintás a címsoron. Alapból ki van kapcsolva. Lásd Ablakok.resizable?-t mondanak, és megvalósítják a normal_rect-et és a place(x, y, w, h)-t: a MasterDetail, a Stream, a Form és a görgethető Info ilyen. A Stream, a Form és az Info mostantól követi a terminál átméretezését.Application#desktop_rect; az ESC CR :alt_enter-ként olvasódik.BBS::Zmodem.send_files fájlokat küld a hívó termináljára (SyncTERM, NetRunner, Qodem, telnet mögötti rz, zmodem.js egy webes terminálban). A vezérlőkarakterek ZDLE-escape-pel, a 0xFF duplázott telnet-IAC-ként megy. Lásd Doorok.Application#with_line { |session| … } átadja a nyers vonalat egy blokknak, és utána újrarajzol; a Telnet#read_raw_byte olvas neki.MasterDetail kap on_activate-et (Enter egy elemen) és replace_items-et, így egy ablak helyben böngészhet mappákat (Ablakok).max_sessions), az EMFILE már nem pörgeti az accept-ciklust;readline UTF-8-at ad, a Backspace egy teljes karaktert töröl, a readkey UTF-8 karaktereket olvas;TextInput-on; a gombok gyorsbillentyűi működnek; az on_close egyszer fut le;A korlátokról lásd Telnet, session és store.
Chat#reply(text, ctx, facts:, fallback:): a tények egy kérés erejéig a system promptba kerülnek, a fallback pedig a persona beégetett válaszát helyettesíti, ha a modell hiányzik vagy hibázik. A persona deflect szabályaira a kód válaszol, mielőtt a modellt megkérdezné. Lásd AI.TextInput#value= az új érték végére teszi a kurzort: a Stream ablakba gépelt második sor korábban IndexError-t dobott és bontotta a hívást.BBS::Flow is. A hívó contextjének egy másolatán fut, és ENTER-t kér, mielőtt visszaadja a vonalat. Lásd Doorok.Flow.define(screens_dir:) a flow mellett tartja az ERB-képernyőit, így egy gemben szállított flow bármelyik boardon kirajzolódik; a FlowRunner context:-et kap a flow contextjének előtöltéséhez (Flow).base szín: minden reset ehhez tér vissza, és a cls ezzel tölti ki a képernyőt, így a színes háttér (egy C64 kékje) megmarad a promptok és az új sorok alatt is.AnsiArt.sauce(path) beolvassa egy art-fájl SAUCE-rekordját (Widgetek).BBS::Door: a vonal átadása egy programnak és visszavétele. door :name, program, label:-lel deklarálható, egy menüben a doors sorolja fel, bármelyik handlerből az open_door nyitja meg. A Builder#run lefuttatja azt a doort, amelyen át a hívó elhagyta az alkalmazást, majd ugyanazzal a contexttel újraépíti az alkalmazást. A program egy FakeOS-definíció vagy egy callable(session, context). Lásd Doorok.BBS::AI: karakterek, akikkel a hívó beszélgethet. YAML-fájlból olvasott persona (system prompt, példakörök, kérésbeállítások, beégetett válaszok), streamelő kliens bármilyen OpenAI-kompatibilis chat-végponthoz, a rövid előzményt a hívó contextjében tartó, a beégetett válaszokra visszaeső chat, és egy typewriter, amely a streamelt választ szavanként tördelve írja egy FakeOS-konzolra. Lásd AI.A 0.4.0 hozta a harmadik réteget, a widget frameworköt (a „new framework” commit):
BBS::Application eseményciklussal, Event, FocusManager, menüsor, állapotsor, Dialogs, Window, Container és a widgetek (Label, Button, TextInput, TextArea, Checkbox, ListBox, ScrollView, ProgressBar, Spinner). Lásd Application és Widgetek.BBS::Theme presetek; xterm-egérjelentés (1000 + SGR 1006) és a billentyűdekóder a telnet-olvasóban.BBS::Store megkapta a memóriabeli cache-t és a Mutexet: az új sorok hozzáfűződnek, a frissítések újraírják a fájlt (Telnet, session és store).A verzió 2026-10-20-ig 0.4.0 maradt, miközben ezek bekerültek:
Widgets::AnsiArt (CP437-es art), a téma-DSL és újabb presetek, a Markdown-renderelő, a kész ablaktípusok (Info, Form, MasterDetail, Stream, ButtonBar) és a window DSL (window :name, type:). Lásd Ablakok és Rajzolás.ScrollView-ban. BBS::FakeOS, karakteres OS-szimulátor konfigurációként (Doorok).Store túléli az érvénytelen UTF-8-at a CSV-ben, és írás előtt megtisztítja az értékeket.readline(mask:) jelszavakhoz, és a naws_reported?.nav DSL a TUI::Page-ben; a helpers hívásokon át gyűlik. (Az 1.0.0-ban kikerült.)BBS::TUI.define, oldalak, router), az aznap bekerült TUI-futtatóra építve, NAWS-alapú terminálméret-egyeztetéssel és az azt követő méretekkel. (Az 1.0.0-ban kikerült.)FrameBuffer (Rajzolás).gems/bbs-éből kiemelve: BBS::Flow és FlowRunner (screen, banner, ask, say, menu, persist, …), ERB-képernyők (Renderer), Banner, BBS::Store, a szálanként kiszolgáló Server, a Session és a telnet-réteg. Lásd Első lépések és Flow.call lépés és a config.on_session_end; a Flow line, section, text, rows, table, wait_enter, fetch, pick, body, output primitívjei; BBS::Color a c() segédfüggvénnyel.