Skip to content

Releases: cb12438/Operator

v0.2.0: Log panel, client commands, custom themes

Choose a tag to compare

@cb12438 cb12438 released this 31 Aug 01:59

The first release after 0.1.0's initial cut. Everything here is additive. Existing setups keep working, and every path documented at 0.1.0 still resolves.

Install: download Operator.rbxm below and drag it into ServerStorage. See the Installation guide.

Added

Log panel. logs now opens a GUI panel rather than only printing lines. General command activity and moderation actions sit in separate streams, with search, day filters and paging.

Client commands. :runClient() declares a command that executes on the executor's own machine with no server round trip. Their audit records are marked source = "client", and the docs are explicit about what that does and does not prove.

Confirmation dialog. :destructive() commands now prompt in the console before running.

Custom themes. Client.Theme accepts a table of colour overrides as well as a built-in name. Overrides merge over the default, so a partial theme can never leave a token unset. All twelve tokens are overridable; layout and spacing are not.

Topbar icon. On keyboardless devices the console opens from a topbar icon drawn by TopbarPlus, which handles placement around Roblox chrome and safe areas. It falls back to the previous floating button if the game already runs an older copy.

Api.toggle(). Open, close or flip the console from your own code: a topbar icon, a settings menu, or your own keybind.

A real public API surface. Everything is reachable from the root require:

local Operator = require(ServerStorage.Operator)
local Command, Types = Operator.Command, Operator.Types

Editor support. Start returns a typed Handle instead of any, and Context is a real type rather than an alias for any, so context: and args. autocomplete and a typo is caught. Doc comments show on hover.

Changed

The Discord audit sink now sends embeds. One per record, batched ten to a message, coloured by outcome, with the executor's display name and headshot and arguments as readable key: value lines. Client-reported records are amber and carry a callout saying what is not verified. Audit.DiscordSend = "failures" forwards only what did not succeed.

Audit.Record gained executorDisplayName.

Documentation restructured. Fifteen guide pages in reading order, twenty API pages, and a new Introduction covering why you shouldn't use it.

Fixed

  • The log panel showed usernames in the display-name column.
  • :destructive() commands could not be confirmed from the console.
  • Command.Builder and friends resolved to nothing when required through Server/Command.
  • The log panel gated on a hardcoded role name rather than asking whether the player could run logs.

Notes

TopbarPlus is vendored unmodified under MPL-2.0. It adds 21 modules and 182 KB to the delivered bundle, taking it to 109 modules / 440 KB per authorised player, up from 86 / 235 KB. Client.UI = false still delivers only 21 modules / 75 KB, and Client.Icon = false skips the icon. Its licence text ships with the package, and LICENSE records what is vendored and under what terms.

309 Lune tests pass and the Luau type surface is clean under both the v1 and v2 solvers.

Full changelog: https://github.com/cb12438/Operator/blob/main/CHANGELOG.md

v0.1.0

Choose a tag to compare

@cb12438 cb12438 released this 30 Aug 05:00

First public release.

Operator is a command console and permission system for Roblox, in pure Luau — for developers who would rather define commands than build an admin panel.

Documentation →

Install

Download Operator.rbxm below. In Studio, right-click ServerStorageInsertImport Roblox Model and pick it.

Then one Script in ServerScriptService:

local Operator = require(game:GetService("ServerStorage").Operator)

Operator.Start({ DefaultCommands = { "debug", "moderation" } })

Press F2 in game. With no Roles configured the console reaches the place owner and nobody else, and says so in the output.

What's in it

  • Nothing reaches an unauthorised client. No modules, no remote, no interface — a player who is allowed nothing cannot tell the package is installed.
  • Roles are built in. Declare them by group rank or user ID, inherit between them, and permissions resolve themselves.
  • Typed argument tables. Arguments arrive as a checked table, not positional strings.
  • Nine built-in argument types, extensible and composable.
  • Audit log with an in-memory ring buffer on by default and pluggable sinks.
  • Three default command packsdebug, moderation, fun — opted into by name.

Compatibility

Pre-1.0. The public surface is what require(Operator) returns; it may still change in a minor release. Anything reached through an internal path (Operator.Server.*, Operator.Shared.*) is not public.

MIT licensed. Console UI ported from Centurion; setup ergonomics from Cmdr; built with Vide.