Command Line Tools
System & Secrets
wheels system, wheels secrets, and wheels daemon are three LuCLI-level infrastructure commands grouped together here because you touch them occasionally rather than daily. They all sit below the Wheels module — the wheels binary inherits them directly from LuCLI whether you installed LuCLI standalone or through the Wheels distribution.
You’ll use this for:
- Inspecting where LuCLI stores state on disk and cleaning caches or backups.
- Storing API keys, database passwords, and other credentials in an encrypted local vault.
- Running LuCLI as a long-lived daemon for IDE integration or Language Server Protocol endpoints.
Overview
Section titled “Overview”All three surfaces are utilities rather than inner-loop tools. system answers “where does LuCLI put things and how do I reset that state safely?” secrets answers “how do I hand my scripts an API key without committing it to source control?” daemon answers “how do I keep a Lucee runtime hot across many tool invocations?” You can ignore them completely for day-to-day Wheels work and return when the specific need arises.
wheels system
Section titled “wheels system”State introspection and maintenance for LuCLI’s home directory (~/.lucli by default).
Synopsis
Section titled “Synopsis”wheels system <subcommand> [flags]Calling wheels system without a subcommand prints the help summary and exits.
inspect
Section titled “inspect”Inspect LuCLI-managed state artifacts. Currently supports printing the resolved Lucee CFConfig.json in a readable format.
Synopsis
Section titled “Synopsis”wheels system inspect [flags]| Flag | Description |
|---|---|
--lucee | Print Lucee CFConfig.json in a readable (pretty-printed) format. |
--path=<path> | Optional path to .CFConfig.json (defaults to the LuCLI home location, ~/.lucli/lucee-server/context/.CFConfig.json). |
Without --lucee, inspect prints its own usage and exits zero.
Example
Section titled “Example”wheels system inspect --luceePrint the set of directories and files LuCLI resolves under your home directory. This is the first thing to run when you’re unsure where LuCLI put something.
Synopsis
Section titled “Synopsis”wheels system paths [flags]| Flag | Description |
|---|---|
--json | Output as pretty-printed JSON. |
Example
Section titled “Example”wheels system pathsSample output:
LuCLI resolved paths: home: /Users/you/.lucli homeSource: default serversDir: /Users/you/.lucli/servers expressDir: /Users/you/.lucli/express depsDir: /Users/you/.lucli/deps depsGitCacheDir: /Users/you/.lucli/deps/git-cache modulesDir: /Users/you/.lucli/modules backupsDir: /Users/you/.lucli/backups secretsDir: /Users/you/.lucli/secrets secretsStoreFile: /Users/you/.lucli/secrets/local.json aiDir: /Users/you/.lucli/ai aiSettingsFile: /Users/you/.lucli/ai/settings.json aiEndpointsFile: /Users/you/.lucli/ai/settings.json aiSkillsFile: /Users/you/.lucli/ai/skills.json aiSkillPathsFile: /Users/you/.lucli/ai/skill-paths.json settingsFile: /Users/you/.lucli/settings.jsonPrune cache and backup artifacts. Runs in dry-run mode by default — no files are deleted unless you pass --force.
Synopsis
Section titled “Synopsis”wheels system clean [flags]| Flag | Description |
|---|---|
--caches | Clean cache targets. |
--backups | Clean backup targets. |
--all | Clean every known safe target (caches and backups). |
-f, --force | Apply deletions (without this, clean only previews). |
--older-than=<duration> | Backup retention window when cleaning backups. Accepts 30d, 12h, 90m. Default: 30d. |
When you pass no target flags, clean defaults to both caches and backups.
Example
Section titled “Example”# Preview what would be removedwheels system clean --all
# Apply itwheels system clean --all --forcebackup
Section titled “backup”Create, list, verify, prune, and restore archives of LuCLI home. Each backup is a .zip plus an adjacent .sha256 checksum file under backupsDir.
Synopsis
Section titled “Synopsis”wheels system backup <subcommand> [flags]backup create
Section titled “backup create”Create a new backup archive.
wheels system backup create [flags]| Flag | Description |
|---|---|
--name=<name> | Optional archive name (.zip appended if missing). |
--exclude-caches | Skip cache directories in the archive. |
--include-backups | Include the existing backups directory contents (off by default, avoids recursion). |
--progress | Print each file as it is added (verbose). Without this flag, a compact progress bar is shown. |
backup list
Section titled “backup list”List available backup archives.
wheels system backup list [flags]| Flag | Description |
|---|---|
--json | Output as pretty-printed JSON. |
backup verify
Section titled “backup verify”Verify a backup’s SHA-256 checksum.
wheels system backup verify [BACKUP] [flags]| Flag | Description |
|---|---|
[BACKUP] | Backup name or path (defaults to the latest backup). |
--all | Verify every backup archive. |
backup prune
Section titled “backup prune”Delete old backups by age and retention count. Dry-run by default — pass --force to apply.
wheels system backup prune [flags]| Flag | Description |
|---|---|
--older-than=<duration> | Age threshold (e.g. 30d, 12h, 90m). Default: 30d. |
--keep=<count> | Keep at least this many newest backups regardless of age. Default: 10. |
-f, --force | Apply deletions (without this, prune only previews). |
backup restore
Section titled “backup restore”Restore a backup archive to a destination directory. Dry-run by default and verifies the checksum unless you override.
wheels system backup restore [BACKUP] [flags]| Flag | Description |
|---|---|
[BACKUP] | Backup name or path (defaults to the latest backup). |
-t, --to=<dir> | Restore destination directory. Default: LuCLI home. |
-f, --force | Apply the restore (without this, restore only previews). |
--skip-verify | Skip the pre-restore checksum verification. |
Example
Section titled “Example”# Create a backup excluding cacheswheels system backup create --name=before-upgrade --exclude-caches
# Verify every backup on diskwheels system backup verify --all
# Preview a prune runwheels system backup prune --older-than=14d --keep=5
# Apply the prunewheels system backup prune --older-than=14d --keep=5 --forcewheels secrets
Section titled “wheels secrets”Manage secrets (API keys, database passwords, service tokens) for LuCLI projects. The default provider is a local, passphrase-encrypted JSON store at ~/.lucli/secrets/local.json. Other providers resolved through Lucee’s SecretProviderGet surface are also supported — set them with secrets provider use.
Synopsis
Section titled “Synopsis”wheels secrets <subcommand> [flags]Initialize the local encrypted secret store. Prompts twice for a passphrase and persists the empty store.
Synopsis
Section titled “Synopsis”wheels secrets init [flags]| Flag | Description |
|---|---|
--reset | Re-initialize the store. DANGEROUS — deletes all existing secrets. |
Store or update a secret under a logical name. The value is read from the terminal without echoing.
Synopsis
Section titled “Synopsis”wheels secrets set NAME [flags]| Flag | Description |
|---|---|
--description=<text> | Human-readable description stored alongside the secret. |
Only the local provider supports writes from wheels secrets set; other providers return an error telling you to switch with secrets provider use local.
Retrieve a secret value. By default, get refuses to print the raw value — you must opt in with --show.
Synopsis
Section titled “Synopsis”wheels secrets get NAME [flags]| Flag | Description |
|---|---|
--show | Print the secret value to stdout. Use with care — shells and terminals may log it. |
When the selected provider is not local, get --show resolves the value via Lucee’s SecretProviderGet.
List stored secrets (names and descriptions only — values are never printed).
Synopsis
Section titled “Synopsis”wheels secrets listOnly supported for the local provider.
Remove a stored secret. Prompts for confirmation unless -f is given.
Synopsis
Section titled “Synopsis”wheels secrets rm NAME [flags]| Flag | Description |
|---|---|
-f | Skip the confirmation prompt. |
Only supported for the local provider.
provider list / provider use / provider current
Section titled “provider list / provider use / provider current”Inspect or switch the active secret provider. The selection is persisted in ~/.lucli/settings.json.
Synopsis
Section titled “Synopsis”wheels secrets provider listwheels secrets provider use NAMEwheels secrets provider currentSecurity notes
Section titled “Security notes”Example
Section titled “Example”# First-time setupwheels secrets init
# Store a secretwheels secrets set STRIPE_API_KEY --description="Production Stripe key"
# List stored secrets (names only)wheels secrets list
# Fetch it when you really mean to see itwheels secrets get STRIPE_API_KEY --showwheels daemon
Section titled “wheels daemon”Run LuCLI as a long-lived background process. Useful when something external — an IDE, a test harness, an editor plugin — wants to hand LuCLI a stream of commands without paying JVM startup on every call. Two server modes plus an interactive client mode are supported.
Synopsis
Section titled “Synopsis”wheels daemon [flags]| Flag | Description |
|---|---|
--port=<port> | TCP port to listen on (server modes) or connect to (client mode). Default: 10000. |
--lsp | Run in Language Server Protocol mode instead of the default JSON line mode. |
--module=<name> | CFML module to dispatch LSP messages to. Default: LuceeLSP. Must exist under ~/.lucli/modules. |
--client | Connect to a running daemon as an interactive client instead of starting a server. |
--raw | In client mode, print the raw JSON response packet from the daemon instead of just the output field. |
The daemon binds to 127.0.0.1 only — it is not reachable from other hosts.
JSON mode (default). One JSON request per connection. The client sends {"argv":["modules","list"],"id":"<uuid>"}, the daemon runs the equivalent of lucli modules list through its Picocli pipeline, captures stdout/stderr, and replies with {"id":"<uuid>","exitCode":0,"output":"..."}. Single-threaded: one connection at a time.
LSP mode (--lsp). Speaks the Language Server Protocol framing (Content-Length header + JSON body) and dispatches each message to the named CFML module’s main(string message) entry point. Returning a non-empty string from the module sends a reply; returning null (e.g. for LSP notifications) sends nothing. The module must already exist under ~/.lucli/modules — use lucli modules init <name> to scaffold one.
Client mode (--client). Connects to a running daemon on the given port and gives you a lucli> prompt. Each line is tokenized on whitespace into argv and sent as a JSON request. Type exit or quit to disconnect.
Examples
Section titled “Examples”Start the default JSON daemon on the default port:
wheels daemonStart it on a specific port:
wheels daemon --port=12345Start an LSP daemon backed by a CFML module:
wheels daemon --lsp --module=LuceeLSP --port=10001Drive a running daemon interactively from another terminal:
wheels daemon --client --port=12345Use cases
Section titled “Use cases”- IDE integration — an editor plugin hands LuCLI commands to the JSON daemon and parses structured responses instead of shelling out per command.
- Custom Language Server — ship a CFML module that implements LSP methods (
initialize,textDocument/didOpen, etc.) and expose it over TCP with--lsp. - Long-running orchestration — test runners or build scripts that invoke many LuCLI commands back-to-back avoid JVM warmup on every call.
When to use each
Section titled “When to use each”| Command | Reach for it when… |
|---|---|
wheels system | You need to know where LuCLI put a file, free disk space, or roll back a bad upgrade with backup restore. |
wheels secrets | You want to store API keys or DB passwords outside of source control and have scripts or Lucee code look them up. |
wheels daemon | An IDE, editor plugin, or long-running tool wants to drive LuCLI without paying JVM startup per call. |