id = "tinyfugue" name = "TinyFugue" homepage = "https://github.com/ingwarsw/tinyfugue" description = "A rebirth of the TinyFugue MUD client: a programmable, screen-oriented client for text-based multi-user games." # The binary TinyFugue installs is `tf`. executables = ["tf"] platforms = ["macos", "linux"] [dotfiles] # src/main.c, the startup path, tries the personal config file in this order: # do_file_load("~/.tfrc", TRUE, &main_configfile) >= 0 || # do_file_load("~/tfrc", TRUE, &main_configfile) >= 0 || # do_file_load("./.tfrc", ...) || do_file_load("./tfrc", ...) # and the usage text calls it "-f don't load personal config file (.tfrc)". # The two home-directory spellings are listed; the two ./ ones are per-project # files in whatever directory tf was started from, not user config. paths = [ "~/.tfrc", "~/tfrc", ] exclude = [] # Nothing here is a credential end to end — a .tfrc is macros, triggers, key # bindings and world definitions together. The passwords inside it are named # below instead. secret = [] # tf reads the file once at startup and holds nothing open on it afterwards. side_effect = false # A world definition carries the character's password for that MUD. TinyFugue # stores it as the world's `pass` field, and /saveworld writes the world list # back out through the same formatter /listworlds uses, which builds each line # as `/test addworld(` followed by the quoted name, type, host, port, # character, pass, macro file and flags (src/world.c, listworld_body: # Stringcpy(buf, "/test addworld("); … Sappendf(buf, ", \"%q\"", '"', p->pass)). # So the whole call is held back: the password is the sixth argument of a line # this syntax can only match whole. Both home-directory spellings are named, # because a rule bound to only one of them would not run for a user who has # the other. [[dotfiles.secret_paths]] file = ["~/.tfrc", "~/tfrc"] match = { prefix = ["/test addworld("] } # No machine_lines: macros, triggers, hooks and key bindings are the point of # carrying a .tfrc, and a world's host and port belong to the MUD rather than # to one of the user's computers. [commands] format = 1 label = "Connect to a MUD" description = "Start TinyFugue and connect to a world or host. Library directory and startup command are left out." quality = "ai-draft" parser = { end_of_options = "--", interleave = "permute", long_equals = false, short_attached = true, short_bundles = true } [[commands.source]] id = "usage" kind = "help" url = "https://github.com/ingwarsw/tinyfugue/blob/HEAD/src/main.c" revision = "2026-10-27" evidence = """ Usage: tf [-L] [-f[]] [-c] [-vnlq] [] tf [-L] [-f[]] [-c] [-vlq] -f don't load personal config file (.tfrc) -f load instead of config file -n no automatic first connection -l no automatic login/password -q quiet login -v no automatic visual mode hostname or IP address port number or name connect to defined by addworld() """ [[commands.field]] id = "world" label = "World or host" description = "A world defined by addworld(), or a hostname/IP when a port follows." type = "string" position = 0 sources = ["usage"] [[commands.field]] id = "port" label = "Port" description = "Only with a hostname instead of a world." type = "string" position = 1 sources = ["usage"] [[commands.field]] id = "config_file" label = "Config file" description = "Load this file instead of ~/.tfrc." type = "path" option = ["-f"] path = { kind = "file", role = "input" } sources = ["usage"] [[commands.field]] id = "no_connect" label = "No automatic first connection" type = "boolean" option = ["-n"] sources = ["usage"] [[commands.field]] id = "no_login" label = "No automatic login" type = "boolean" option = ["-l"] sources = ["usage"] [[commands.field]] id = "quiet" label = "Quiet login" type = "boolean" option = ["-q"] sources = ["usage"] [[commands.field]] id = "no_visual" label = "No automatic visual mode" type = "boolean" option = ["-v"] sources = ["usage"] [[commands.task]] id = "connect_world" label = "Connect to a world" fields = ["world"] required = ["world"] [[commands.task]] id = "connect_host" label = "Connect to host and port" fields = ["world", "port"] required = ["world", "port"] [[commands.group]] id = "basic" label = "Basic" fields = ["world", "port", "config_file"] [[commands.group]] id = "advanced" label = "Advanced" fields = ["no_connect", "no_login", "quiet", "no_visual"]