@quonfig/cli
v0.0.60
Published
Quonfig CLI. Inject configs/secrets as env vars (preferred for scripts and CI): qfg run --env DATABASE_URL=db.url --env API_KEY=stripe.key -- ./bin/migrate Other common usage: qfg get <key> --environment <env> read a single value qfg
Readme
Quonfig CLI
- Quonfig CLI
- Usage
- Running commands with injected env
- .qfg.env
- blank lines and # comments are skipped
- Commands
Usage
$ npm install -g @quonfig/cli
$ qfg COMMAND
running command...
$ qfg (--version)
@quonfig/cli/0.0.60 linux-x64 node-v24.4.1
$ qfg --help [COMMAND]
USAGE
$ qfg COMMAND
...Running commands with injected env
Some workflows need Quonfig values to land in process.env before application
code runs — Drizzle migrations read DATABASE_URL at module import, next-auth
reads AUTH_SECRET automatically, and arbitrary build steps / one-shot scripts
can't always go through instrumentation.ts. Use qfg run to resolve configs
and exec the child with those vars merged into its environment.
The flag separator -- is required between qfg run flags and the child
command — without it, oclif tries to parse the child's flags as its own.
Inline form
qfg run \
--env DATABASE_URL=db.url \
--env AUTH_SECRET=auth.secret \
--environment=staging \
-- \
npm run migrateThe grammar is VAR=key.path (uses =, not :, to match docker -e VAR=value
muscle memory). --env is repeatable.
File form
# .qfg.env
DATABASE_URL=db.url
AUTH_SECRET=auth.secret
# blank lines and # comments are skippedqfg run --env-file=.qfg.env --environment=staging -- npm run migrateAuth / environment is binary
qfg run enforces a strict either/or rule, never a precedence chain. This is
intentional — a "match-only" exception drifts silently in CI and masks
misconfiguration.
| Mode | When | Provides |
|-------|-----------------------------------------|-----------------------------------------------------------|
| A | QUONFIG_BACKEND_SDK_KEY is set | env + workspace from the SDK key |
| B | No SDK key — uses qfg login user auth | --environment or QUONFIG_ENVIRONMENT (exactly one) |
Mixing the two is an error:
- Mode A +
--environment(orQUONFIG_ENVIRONMENT) → exits non-zero before spawning, even if they would agree. - Mode B with neither → exits non-zero.
- Mode B with both
--environmentandQUONFIG_ENVIRONMENT→ exits non-zero.
There is no interactive prompt. qfg run is meant for scripts and CI;
prompting mid-&&-chain would be worse UX than failing loud.
Override vs preserve
By default qfg run overrides any value already set in the parent env —
the whole point is "make these vars come from Quonfig." Pass --preserve-env
to flip that: vars already set in the parent are kept, and only unset vars
are filled in.
qfg run --env DATABASE_URL=db.url --preserve-env --environment=staging -- npm testMissing keys fail before the child spawns
If any requested config key is missing from the workspace, qfg run exits
non-zero with a list of the missing keys and never spawns the child. This
avoids the trap where the child blows up later with an empty value and the
real cause is buried under unrelated stack traces.
package.json example
{
"scripts": {
"migrate": "qfg run --env-file=.qfg.env --environment=staging -- drizzle-kit migrate",
"migrate:prod": "qfg run --env-file=.qfg.env -- drizzle-kit migrate"
}
}The first uses Mode B (--environment=staging flag). The second relies on
QUONFIG_BACKEND_SDK_KEY being set in the prod environment (Mode A) so the
script doesn't need to know which env it's running in.
Commands
qfg activityqfg activity deletedqfg activity feedqfg activity history [NAME]qfg activity restore [NAME]qfg audit-log [NAME]qfg cleanupqfg cleanup listqfg cleanup remove [NAME]qfg cleanup status [NAME]qfg cleanup verify [NAME]qfg config-schemaqfg create NAMEqfg delete NAMEqfg flag info [NAME]qfg flag listqfg flag show [NAME]qfg generateqfg generate-new-hex-keyqfg get [NAME]qfg history NAMEqfg info [NAME]qfg init [DIRECTORY]qfg interactiveqfg listqfg logqfg log-level NAMEqfg loginqfg logoutqfg migrateqfg migrate doctorqfg migrate my-codeqfg migrate statusqfg override [NAME] [VALUE]qfg pullqfg pushqfg run [COMMAND]qfg schema NAMEqfg sdk-keyqfg sdk-key createqfg sdk-key listqfg sdk-key revoke KEYIDqfg serveqfg set-default [NAME]qfg set-rollout [NAME]qfg syncqfg toggle [NAME]qfg verify [PATH]qfg whoamiqfg workspaceqfg workspace bootstrapqfg workspace create SLUGqfg workspace switch [SLUG]
qfg activity
Inspect what changed in the workspace (recent commits, per-config history, deletions).
USAGE
$ qfg activity [--json] [--interactive] [--no-color] [--verbose]
GLOBAL FLAGS
--[no-]interactive Force interactive mode
--json Format output as json.
--no-color Do not colorize output
--verbose Verbose output
DESCRIPTION
Inspect what changed in the workspace (recent commits, per-config history, deletions).
EXAMPLES
$ qfg activity feed
$ qfg activity history my.flag
$ qfg activity deleted
$ qfg activity restore my.flag --yesSee code: src/commands/activity.ts
qfg activity deleted
List configs that were deleted from the workspace and have not been restored.
USAGE
$ qfg activity deleted [--json] [--interactive] [--no-color] [--verbose] [-w <value>]
GLOBAL FLAGS
-w, --workspace=<value> Workspace slug to use (overrides QUONFIG_WORKSPACE env var and saved default)
--[no-]interactive Force interactive mode
--json Format output as json.
--no-color Do not colorize output
--verbose Verbose output
DESCRIPTION
List configs that were deleted from the workspace and have not been restored.
Useful for "did somebody delete X?" — pair with `qfg activity restore NAME`
to undelete a tombstoned config.
EXAMPLES
$ qfg activity deleted
$ qfg activity deleted --jsonSee code: src/commands/activity/deleted.ts
qfg activity feed
Recent activity across the workspace, newest first.
USAGE
$ qfg activity feed [--json] [--interactive] [--no-color] [--verbose] [-w <value>] [--limit <value>]
FLAGS
--limit=<value> [default: 30] Maximum number of feed entries (1-100)
GLOBAL FLAGS
-w, --workspace=<value> Workspace slug to use (overrides QUONFIG_WORKSPACE env var and saved default)
--[no-]interactive Force interactive mode
--json Format output as json.
--no-color Do not colorize output
--verbose Verbose output
DESCRIPTION
Recent activity across the workspace, newest first.
Each entry shows who changed which config, the action (created/updated/deleted/restored),
and the human-readable audit message produced by the server. The server already
translates JSON diffs into messages — this command does not re-translate.
EXAMPLES
$ qfg activity feed
$ qfg activity feed --limit 5
$ qfg activity feed --jsonSee code: src/commands/activity/feed.ts
qfg activity history [NAME]
Per-config audit trail for a flag, config, log-level, segment, or schema.
USAGE
$ qfg activity history [NAME] [--json] [--interactive] [--no-color] [--verbose] [-w <value>]
ARGUMENTS
NAME config/feature-flag/etc. name
GLOBAL FLAGS
-w, --workspace=<value> Workspace slug to use (overrides QUONFIG_WORKSPACE env var and saved default)
--[no-]interactive Force interactive mode
--json Format output as json.
--no-color Do not colorize output
--verbose Verbose output
DESCRIPTION
Per-config audit trail for a flag, config, log-level, segment, or schema.
Resolves NAME against the workspace metadata (no need to specify type) and
returns the full commit history for that file with audit messages translated
by the server. Restored entries are rendered distinctly so a recovery doesn't
look like a fresh create.
EXAMPLES
$ qfg activity history my.flag
$ qfg activity history request.timeout --jsonSee code: src/commands/activity/history.ts
qfg activity restore [NAME]
Undelete a config that was previously removed.
USAGE
$ qfg activity restore [NAME] [--json] [--interactive] [--no-color] [--verbose] [-w <value>] [--type
feature_flag|config|log_level|segment|flag|log-level] [--yes]
ARGUMENTS
NAME config/feature-flag/etc. name
FLAGS
--type=<option> Config type. Optional — inferred from history when omitted.
<options: feature_flag|config|log_level|segment|flag|log-level>
--yes Skip the confirmation prompt
GLOBAL FLAGS
-w, --workspace=<value> Workspace slug to use (overrides QUONFIG_WORKSPACE env var and saved default)
--[no-]interactive Force interactive mode
--json Format output as json.
--no-color Do not colorize output
--verbose Verbose output
DESCRIPTION
Undelete a config that was previously removed.
Looks up the most recent deletion for the key (so you see who deleted it and when),
then asks for confirmation before re-creating the file from the prior content.
Schemas cannot be restored — use git history instead.
EXAMPLES
$ qfg activity restore my.flag --yes
$ qfg activity restore request.timeout --type config --yesSee code: src/commands/activity/restore.ts
qfg audit-log [NAME]
Alias: qfg audit-log → qfg activity feed; qfg audit-log NAME → qfg activity history NAME.
USAGE
$ qfg audit-log [NAME...] [--json] [--interactive] [--no-color] [--verbose]
ARGUMENTS
NAME... Optional config key. If present, dispatches to `activity history NAME`; otherwise `activity feed`.
GLOBAL FLAGS
--[no-]interactive Force interactive mode
--json Format output as json.
--no-color Do not colorize output
--verbose Verbose output
DESCRIPTION
Alias: `qfg audit-log` → `qfg activity feed`; `qfg audit-log NAME` → `qfg activity history NAME`.
EXAMPLES
$ qfg audit-log
$ qfg audit-log my.flagSee code: src/commands/audit-log.ts
qfg cleanup
Retire feature flags that have done their job.
USAGE
$ qfg cleanup [--json] [--interactive] [--no-color] [--verbose]
GLOBAL FLAGS
--[no-]interactive Force interactive mode
--json Format output as json.
--no-color Do not colorize output
--verbose Verbose output
DESCRIPTION
Retire feature flags that have done their job.
The cleanup workflow turns a flag's "Ready for cleanup" marker into an end-to-end
removal flow: surface the flags that are safe to retire, hand the actual code
removal to the qfg-flag-cleanup Claude skill, then delete the flag definition
once the call sites are gone.
Lifecycle (high-level):
1. Owner flips readyForCleanup=true in the UI (already exists)
2. qfg cleanup list see candidates + telemetry
3. qfg cleanup status <key> drill into one flag
4. qfg cleanup remove <key> handoff to the cleanup skill
5. PR merges, SDK redeploys, telemetry confirms 0 evals
6. qfg cleanup verify <key> (optional) confirm safe
7. qfg delete <key> remove the flag definition
EXAMPLES
$ qfg cleanup list
$ qfg cleanup list --json
$ qfg cleanup status my.flag.keySee code: src/commands/cleanup.ts
qfg cleanup list
List feature flags marked readyForCleanup=true, with eval volume per window.
USAGE
$ qfg cleanup list [--json] [--interactive] [--no-color] [--verbose] [-w <value>]
FLAGS
--json Return structured rows for agent consumption
GLOBAL FLAGS
-w, --workspace=<value> Workspace slug to use (overrides QUONFIG_WORKSPACE env var and saved default)
--[no-]interactive Force interactive mode
--no-color Do not colorize output
--verbose Verbose output
DESCRIPTION
List feature flags marked readyForCleanup=true, with eval volume per window.
Columns:
KEY the flag key
TYPE the flag's valueType (bool, string, int, etc.)
EVALS_24H evals counted in today's bucket (latest day)
EVALS_2D evals in the last 2 calendar days
EVALS_7D evals in the last 7 calendar days
EVALS_30D evals in the last 30 calendar days
LAST_EVAL most recent calendar day with any evals (UTC), blank if none
CLASS quiet (zero evals in last 2 days) or active
Default sort: quiet first, oldest LAST_EVAL at top.
Pass --json for the structured object (rows[]). Each row carries the columns
above plus the raw eval counts your agent can reason about itself.
Once you've picked a candidate, run `qfg cleanup status <key>` for the
drill-in or hand off the removal to the qfg-flag-cleanup Claude skill.
EXAMPLES
$ qfg cleanup list
$ qfg cleanup list --jsonSee code: src/commands/cleanup/list.ts
qfg cleanup remove [NAME]
Write a cleanup payload for a ready-for-cleanup flag and hand off to the qfg-flag-cleanup Claude skill.
USAGE
$ qfg cleanup remove [NAME] [--json] [--interactive] [--no-color] [--verbose] [-w <value>] [--force]
ARGUMENTS
NAME config/feature-flag/etc. name
FLAGS
--force Skip the evals_2d > 0 safety gate (useful when telemetry is delayed but you know the flag is dead)
GLOBAL FLAGS
-w, --workspace=<value> Workspace slug to use (overrides QUONFIG_WORKSPACE env var and saved default)
--[no-]interactive Force interactive mode
--json Format output as json.
--no-color Do not colorize output
--verbose Verbose output
DESCRIPTION
Write a cleanup payload for a ready-for-cleanup flag and hand off to the qfg-flag-cleanup Claude skill.
Modeled on `qfg migrate my-code` — this command never edits source files
itself. It validates that the flag is marked readyForCleanup=true, refuses to
proceed if there are still evals_2d > 0 (use --force to override), writes
`.qf/cleanup/<key>.json` describing the flag's current rule shape +
telemetry, and prints instructions to invoke the qfg-flag-cleanup skill which
asks the engineer which value should "win" and applies the inlining.
The payload deliberately does NOT suggest a winning value; that's the
engineer's call. Run `qfg cleanup status <key>` first if you want to inspect
telemetry before retiring.
EXAMPLES
$ qfg cleanup remove my.flag.key
$ qfg cleanup remove my.flag.key --force
$ qfg cleanup remove my.flag.key --jsonSee code: src/commands/cleanup/remove.ts
qfg cleanup status [NAME]
Drill into one ready-for-cleanup flag — show telemetry across all environments and the current rule shape.
USAGE
$ qfg cleanup status [NAME] [--json] [--interactive] [--no-color] [--verbose] [-w <value>]
ARGUMENTS
NAME config/feature-flag/etc. name
FLAGS
--json Return structured object for agent consumption
GLOBAL FLAGS
-w, --workspace=<value> Workspace slug to use (overrides QUONFIG_WORKSPACE env var and saved default)
--[no-]interactive Force interactive mode
--no-color Do not colorize output
--verbose Verbose output
DESCRIPTION
Drill into one ready-for-cleanup flag — show telemetry across all environments and the current rule shape.
Use this after `qfg cleanup list` to inspect a specific flag before handing
removal off to the qfg-flag-cleanup Claude skill. The eval counts come from
analytics.configSparklines (the same backing data the per-flag sparklines on
the flag detail page use), summed into 24h/2d/7d/30d windows so you can decide
whether it's safe to retire.
Pass --json for the structured object including the full rule shape per
environment — the cleanup skill consumes this directly.
EXAMPLES
$ qfg cleanup status my.flag.key
$ qfg cleanup status my.flag.key --jsonSee code: src/commands/cleanup/status.ts
qfg cleanup verify [NAME]
Confirm zero evals for a flag in the trailing N days (default 7). Exits 0 if safe to delete, non-zero otherwise.
USAGE
$ qfg cleanup verify [NAME] [--json] [--interactive] [--no-color] [--verbose] [-w <value>] [--days <value>]
ARGUMENTS
NAME config/feature-flag/etc. name
FLAGS
--days=<value> [default: 7] Number of trailing calendar days that must have zero evals
--json Return structured object for agent consumption
GLOBAL FLAGS
-w, --workspace=<value> Workspace slug to use (overrides QUONFIG_WORKSPACE env var and saved default)
--[no-]interactive Force interactive mode
--no-color Do not colorize output
--verbose Verbose output
DESCRIPTION
Confirm zero evals for a flag in the trailing N days (default 7). Exits 0 if safe to delete, non-zero otherwise.
Read-only gate intended for chaining with `qfg delete` after a cleanup PR
has merged and the SDK has redeployed:
qfg cleanup verify my.flag.key && qfg delete my.flag.key
The trailing window is stricter than the `qfg cleanup remove` 2-day gate on
purpose — `remove` only writes a payload describing the flag, but `delete`
permanently removes the flag definition, so we want a longer quiet period
before chaining. Bump --days N if you want a more conservative window.
EXAMPLES
$ qfg cleanup verify my.flag.key
$ qfg cleanup verify my.flag.key --days 14
$ qfg cleanup verify my.flag.key --json
$ qfg cleanup verify my.flag.key && qfg delete my.flag.keySee code: src/commands/cleanup/verify.ts
qfg config-schema
Print the config file format reference: rules engine, operators, targeting criteria, segments, and weighted rollouts. Use --json-schema for the machine-readable JSON Schema document.
USAGE
$ qfg config-schema [--json] [--interactive] [--no-color] [--verbose] [--json-schema]
FLAGS
--json-schema Output the full JSON Schema document for config files instead of the human-readable reference
GLOBAL FLAGS
--[no-]interactive Force interactive mode
--json Format output as json.
--no-color Do not colorize output
--verbose Verbose output
DESCRIPTION
Print the config file format reference: rules engine, operators, targeting criteria, segments, and weighted rollouts.
Use --json-schema for the machine-readable JSON Schema document.
EXAMPLES
$ qfg config-schema # human-readable operator reference + examples
$ qfg config-schema --json-schema # full JSON Schema document (copy into your editor)See code: src/commands/config-schema.ts
qfg create NAME
Create a new feature flag, config value, or other item.
USAGE
$ qfg create NAME --type boolean-flag|boolean|string|double|int|string-list|json|duration|log_level
[--json] [--interactive] [--no-color] [--verbose] [-w <value>] [--confidential] [--env-var <value>] [--value
<value>] [--secret] [--secret-key-name <value>]
ARGUMENTS
NAME name for your new item (e.g. my.new.flag)
FLAGS
--confidential mark the value as confidential
--env-var=<value> environment variable to get value from
--secret encrypt the value of this item
--secret-key-name=<value> [default: quonfig.secrets.encryption.key] name of the secret key to use for
encryption/decryption
--type=<option> (required)
<options: boolean-flag|boolean|string|double|int|string-list|json|duration|log_level>
--value=<value> default value for your new item
GLOBAL FLAGS
-w, --workspace=<value> Workspace slug to use (overrides QUONFIG_WORKSPACE env var and saved default)
--[no-]interactive Force interactive mode
--json Format output as json.
--no-color Do not colorize output
--verbose Verbose output
DESCRIPTION
Create a new feature flag, config value, or other item.
Use --type to specify the kind of item:
boolean-flag On/off feature flag (sendToClientSdk defaults to true; best for gradual rollouts)
string A string configuration value
int An integer configuration value
double A floating-point configuration value
string-list A comma-separated list of strings
json An arbitrary JSON blob
boolean A plain boolean (not a feature flag)
duration An ISO 8601 duration string, e.g. PT30S, PT5M, PT1H30M (SDK returns milliseconds)
log_level A dynamic log level (value must be one of TRACE/DEBUG/INFO/WARN/ERROR/FATAL)
This sets the global default value. Override per-environment with:
qfg set-default my.flag --environment production --value true
For a percentage rollout (gradual rollout / A/B test / canary deploy), use:
qfg set-rollout my.flag --environment production --true-percent 20
Or edit the JSON config file directly for complex targeting rules:
qfg config-schema # full operator reference + examples
qfg pull --dir ./config # clone workspace, then edit JSON and git push
Log levels:
qfg create log-level.my-app --type log_level --value WARN
# Log-level keys must start with "log-level.".
# For per-logger targeting, create ONE log-level config per service and add
# rules on the "quonfig-sdk-logging.key" context property (e.g.
# PROP_STARTS_WITH_ONE_OF MyPackage.) rather than one config per logger.
When this flag has done its job, mark readyForCleanup: true in the UI and run `qfg cleanup list` to retire it.
EXAMPLES
$ qfg create my.new.flag --type boolean-flag
$ qfg create my.new.flag --type boolean-flag --value=true
$ qfg create my.new.string --type string --value="hello world"
$ qfg create my.new.string --type string --value="hello world" --secret
$ qfg create my.new.string --type string --env-var=MY_ENV_VAR_NAME
$ qfg create my.new.string --type json --value="{\"key\": \"value\"}"
$ qfg create my.timeout --type duration --value PT90S
$ qfg create log-level.my-app --type log_level --value WARN
# After creating a flag, set a 20% rollout in production:
$ qfg set-rollout my.new.flag --environment production --true-percent 20See code: src/commands/create.ts
qfg delete NAME
Delete a flag, config, or log-level from the workspace.
USAGE
$ qfg delete NAME [--json] [--interactive] [--no-color] [--verbose] [-w <value>] [--yes]
ARGUMENTS
NAME flag/config/log-level key to delete
FLAGS
--yes skip confirmation prompt
GLOBAL FLAGS
-w, --workspace=<value> Workspace slug to use (overrides QUONFIG_WORKSPACE env var and saved default)
--[no-]interactive Force interactive mode
--json Format output as json.
--no-color Do not colorize output
--verbose Verbose output
DESCRIPTION
Delete a flag, config, or log-level from the workspace.
DESTRUCTIVE — removes the underlying JSON file from the workspace git repo
and commits with the actor's identity. The commit history preserves the
prior content; this is a hard-delete on the file but a soft-delete on
history.
Confirmation is required:
--yes skip the prompt (for scripts and CI)
interactive (default) you'll be asked to type the key name back
Examples
qfg delete my.flag --yes
qfg delete my.flag # interactive: type the key back to confirm
qfg delete my.config --yes
EXAMPLES
$ qfg delete my.flag --yes
$ qfg delete my.config --yesSee code: src/commands/delete.ts
qfg flag info [NAME]
Show current values, rules, and evaluation stats for a flag or config.
USAGE
$ qfg flag info [NAME] [--json] [--interactive] [--no-color] [--verbose] [-w <value>] [--exclude-evaluations]
ARGUMENTS
NAME config/feature-flag/etc. name
FLAGS
--exclude-evaluations Exclude evaluation data
GLOBAL FLAGS
-w, --workspace=<value> Workspace slug to use (overrides QUONFIG_WORKSPACE env var and saved default)
--[no-]interactive Force interactive mode
--json Format output as json.
--no-color Do not colorize output
--verbose Verbose output
DESCRIPTION
Show current values, rules, and evaluation stats for a flag or config.
Output shows the value for each environment:
- A simple value (true / false / "hello") means a single unconditional rule.
- "[see rules]" means the environment has targeting rules or a percentage rollout.
- "[inherit]" means the environment falls back to the Default value.
Percentage rollouts are displayed as "20.0% true, 80.0% false".
Evaluation counts for the past 24 hours are included by default.
Related commands:
qfg set-default my.flag --environment production --value true # set a scalar fallback
qfg set-rollout my.flag --environment production --true-percent 20 # set a % rollout
ALIASES
$ qfg flag show
$ qfg flag info
EXAMPLES
$ qfg flag info my.config.name
$ qfg flag info my.config.name --exclude-evaluations # skip 24h statsqfg flag list
Show keys for your config/feature flags/etc.
USAGE
$ qfg flag list [--json] [--interactive] [--no-color] [--verbose] [-w <value>] [--configs] [--feature-flags]
[--log-levels] [--schemas] [--segments]
FLAGS
--configs include configs
--feature-flags include flags
--log-levels include log levels
--schemas include schemas
--segments include segments
GLOBAL FLAGS
-w, --workspace=<value> Workspace slug to use (overrides QUONFIG_WORKSPACE env var and saved default)
--[no-]interactive Force interactive mode
--json Format output as json.
--no-color Do not colorize output
--verbose Verbose output
DESCRIPTION
Show keys for your config/feature flags/etc.
All types are returned by default. If you pass one or more type flags (e.g. --configs), only those types will be
returned
ALIASES
$ qfg flag list
EXAMPLES
$ qfg flag list
$ qfg flag list --feature-flagsqfg flag show [NAME]
Show current values, rules, and evaluation stats for a flag or config.
USAGE
$ qfg flag show [NAME] [--json] [--interactive] [--no-color] [--verbose] [-w <value>] [--exclude-evaluations]
ARGUMENTS
NAME config/feature-flag/etc. name
FLAGS
--exclude-evaluations Exclude evaluation data
GLOBAL FLAGS
-w, --workspace=<value> Workspace slug to use (overrides QUONFIG_WORKSPACE env var and saved default)
--[no-]interactive Force interactive mode
--json Format output as json.
--no-color Do not colorize output
--verbose Verbose output
DESCRIPTION
Show current values, rules, and evaluation stats for a flag or config.
Output shows the value for each environment:
- A simple value (true / false / "hello") means a single unconditional rule.
- "[see rules]" means the environment has targeting rules or a percentage rollout.
- "[inherit]" means the environment falls back to the Default value.
Percentage rollouts are displayed as "20.0% true, 80.0% false".
Evaluation counts for the past 24 hours are included by default.
Related commands:
qfg set-default my.flag --environment production --value true # set a scalar fallback
qfg set-rollout my.flag --environment production --true-percent 20 # set a % rollout
ALIASES
$ qfg flag show
$ qfg flag info
EXAMPLES
$ qfg flag show my.config.name
$ qfg flag show my.config.name --exclude-evaluations # skip 24h statsqfg generate
Generate type definitions for your Quonfig configuration
USAGE
$ qfg generate [--json] [--interactive] [--no-color] [--verbose] [--dir <value>] [-o <value>] [--targets
<value>] [-w <value>]
FLAGS
-o, --output-directory=<value> Override the output directory for generated files
-w, --workspace=<value> Workspace slug or UUID for the remote-fetch path (defaults to QUONFIG_WORKSPACE env
var or active profile). Only used when --dir is omitted.
--dir=<value> Path to local QUONFIG_DIR (defaults to QUONFIG_DIR env var). When omitted,
auto-detects a quonfig.json in the current directory; if none, fetches the workspace
from the server.
--targets=<value> [default: react-ts] Determines for language/framework to generate code for (node-ts,
react-ts)
GLOBAL FLAGS
--[no-]interactive Force interactive mode
--json Format output as json.
--no-color Do not colorize output
--verbose Verbose output
DESCRIPTION
Generate type definitions for your Quonfig configuration
You can use the default type-generation configuration, or by provide your own via a quonfig.config.json file:
Format:
{
outputDirectory?: string;
targets?: {
<language key>?: {
outputDirectory?: string;
outputFileName?: string;
}
}
};
Example quonfig.config.json:
```json
{
"outputDirectory": "path/to/your/directory",
"targets": {
"react-ts": {
"outputDirectory": "diff/path/to/your/directory",
"declarationFileName": "quonfig-client-types.d.ts",
"clientFileName": "quonfig-client.ts",
},
"node-ts": {
"declarationFileName": "quonfig-server-types.d.ts",
"clientFileName": "quonfig-server.ts",
}
}
}EXAMPLES $ qfg generate # react-ts only by default
$ qfg generate --targets node-ts # node-ts only
$ qfg generate --targets react-ts,node-ts # both node + react-ts
$ qfg generate -o ./src/generated # specify output directory
$ qfg generate --targets node-ts -o ./dist # combine with targets
_See code: [src/commands/generate.ts](https://github.com/quonfig/cli/blob/v0.0.60/src/commands/generate.ts)_
## `qfg generate-new-hex-key`
Generate a new hex key suitable for secrets
USAGE $ qfg generate-new-hex-key [--json] [--interactive] [--no-color] [--verbose]
GLOBAL FLAGS --[no-]interactive Force interactive mode --json Format output as json. --no-color Do not colorize output --verbose Verbose output
DESCRIPTION Generate a new hex key suitable for secrets
EXAMPLES $ qfg generate-new-hex-key
_See code: [src/commands/generate-new-hex-key.ts](https://github.com/quonfig/cli/blob/v0.0.60/src/commands/generate-new-hex-key.ts)_
## `qfg get [NAME]`
Get the value of a config/feature-flag/etc.
USAGE $ qfg get [NAME] [--json] [--interactive] [--no-color] [--verbose] [-w ] [--environment ]
ARGUMENTS NAME config/feature-flag/etc. name
FLAGS --environment= environment to evaluate in
GLOBAL FLAGS -w, --workspace= Workspace slug to use (overrides QUONFIG_WORKSPACE env var and saved default) --[no-]interactive Force interactive mode --json Format output as json. --no-color Do not colorize output --verbose Verbose output
DESCRIPTION Get the value of a config/feature-flag/etc.
EXAMPLES $ qfg get my.config.name
$ qfg get my.config.name --environment=production
_See code: [src/commands/get.ts](https://github.com/quonfig/cli/blob/v0.0.60/src/commands/get.ts)_
## `qfg history NAME`
Alias: `qfg history NAME` → `qfg activity history NAME`.
USAGE $ qfg history NAME... [--json] [--interactive] [--no-color] [--verbose]
ARGUMENTS NAME... Config key to inspect
GLOBAL FLAGS --[no-]interactive Force interactive mode --json Format output as json. --no-color Do not colorize output --verbose Verbose output
DESCRIPTION
Alias: qfg history NAME → qfg activity history NAME.
EXAMPLES $ qfg history my.flag
_See code: [src/commands/history.ts](https://github.com/quonfig/cli/blob/v0.0.60/src/commands/history.ts)_
## `qfg info [NAME]`
Show current values, rules, and evaluation stats for a flag or config.
USAGE $ qfg info [NAME] [--json] [--interactive] [--no-color] [--verbose] [-w ] [--exclude-evaluations]
ARGUMENTS NAME config/feature-flag/etc. name
FLAGS --exclude-evaluations Exclude evaluation data
GLOBAL FLAGS -w, --workspace= Workspace slug to use (overrides QUONFIG_WORKSPACE env var and saved default) --[no-]interactive Force interactive mode --json Format output as json. --no-color Do not colorize output --verbose Verbose output
DESCRIPTION Show current values, rules, and evaluation stats for a flag or config.
Output shows the value for each environment:
- A simple value (true / false / "hello") means a single unconditional rule.
- "[see rules]" means the environment has targeting rules or a percentage rollout.
- "[inherit]" means the environment falls back to the Default value.
Percentage rollouts are displayed as "20.0% true, 80.0% false". Evaluation counts for the past 24 hours are included by default.
Related commands: qfg set-default my.flag --environment production --value true # set a scalar fallback qfg set-rollout my.flag --environment production --true-percent 20 # set a % rollout
ALIASES $ qfg flag show $ qfg flag info
EXAMPLES $ qfg info my.config.name
$ qfg info my.config.name --exclude-evaluations # skip 24h stats
_See code: [src/commands/info.ts](https://github.com/quonfig/cli/blob/v0.0.60/src/commands/info.ts)_
## `qfg init [DIRECTORY]`
Initialize or update a Quonfig workspace
USAGE $ qfg init [DIRECTORY] [--json] [--interactive] [--no-color] [--verbose] [--dry-run] [--samples] [--workspace ]
ARGUMENTS DIRECTORY [default: .] Target directory (default: current directory)
FLAGS --dry-run Show what would be done without writing anything --[no-]samples Include sample configs (default: yes on first init, no on update) --workspace= Workspace pin in / form (Guard 1). If omitted, no pin is written.
GLOBAL FLAGS --[no-]interactive Force interactive mode --json Format output as json. --no-color Do not colorize output --verbose Verbose output
DESCRIPTION Initialize or update a Quonfig workspace
EXAMPLES $ qfg init
$ qfg init ./my-workspace
$ qfg init --no-samples
$ qfg init --samples
$ qfg init --dry-run
_See code: [src/commands/init.ts](https://github.com/quonfig/cli/blob/v0.0.60/src/commands/init.ts)_
## `qfg interactive`
Launch an interactive menu to browse and manage your workspace.
USAGE $ qfg interactive [--json] [--interactive] [--no-color] [--verbose]
GLOBAL FLAGS --[no-]interactive Force interactive mode --json Format output as json. --no-color Do not colorize output --verbose Verbose output
DESCRIPTION Launch an interactive menu to browse and manage your workspace.
Common shortcuts: qfg set-default my.flag --environment production --value false # catch-all fallback qfg set-rollout my.flag --environment production --true-percent 20 # % rollout
For arbitrary targeting rules (e.g. user.email, plan, segment, custom property), run 'qfg config-schema' then 'qfg pull' and edit the JSON config directly.
EXAMPLES $ qfg
_See code: [src/commands/interactive.ts](https://github.com/quonfig/cli/blob/v0.0.60/src/commands/interactive.ts)_
## `qfg list`
Show keys for your config/feature flags/etc.
USAGE $ qfg list [--json] [--interactive] [--no-color] [--verbose] [-w ] [--configs] [--feature-flags] [--log-levels] [--schemas] [--segments]
FLAGS --configs include configs --feature-flags include flags --log-levels include log levels --schemas include schemas --segments include segments
GLOBAL FLAGS -w, --workspace= Workspace slug to use (overrides QUONFIG_WORKSPACE env var and saved default) --[no-]interactive Force interactive mode --json Format output as json. --no-color Do not colorize output --verbose Verbose output
DESCRIPTION Show keys for your config/feature flags/etc.
All types are returned by default. If you pass one or more type flags (e.g. --configs), only those types will be returned
ALIASES $ qfg flag list
EXAMPLES $ qfg list
$ qfg list --feature-flags
_See code: [src/commands/list.ts](https://github.com/quonfig/cli/blob/v0.0.60/src/commands/list.ts)_
## `qfg log`
Alias: `qfg log` → `qfg activity feed`.
USAGE $ qfg log [--json] [--interactive] [--no-color] [--verbose]
GLOBAL FLAGS --[no-]interactive Force interactive mode --json Format output as json. --no-color Do not colorize output --verbose Verbose output
DESCRIPTION
Alias: qfg log → qfg activity feed.
EXAMPLES $ qfg log
$ qfg log --limit 5
_See code: [src/commands/log.ts](https://github.com/quonfig/cli/blob/v0.0.60/src/commands/log.ts)_
## `qfg log-level NAME`
Create or add targeting rules to a log-level config.
USAGE $ qfg log-level NAME [--json] [--interactive] [--no-color] [--verbose] [-w ] [--environment ] [--target ...] [--value TRACE|DEBUG|INFO|WARN|ERROR|FATAL]
ARGUMENTS NAME log-level key (must start with "log-level.", e.g. log-level.my-app)
FLAGS --environment= when used with --target, scope the rule to this environment instead of the default --target=... logger path prefix (matched via PROP_STARTS_WITH_ONE_OF on "quonfig-sdk-logging.key"); repeatable --value= log level — either the new default (create mode) or the level for the targeted loggers <options: TRACE|DEBUG|INFO|WARN|ERROR|FATAL>
GLOBAL FLAGS -w, --workspace= Workspace slug to use (overrides QUONFIG_WORKSPACE env var and saved default) --[no-]interactive Force interactive mode --json Format output as json. --no-color Do not colorize output --verbose Verbose output
DESCRIPTION Create or add targeting rules to a log-level config.
Log-level keys must start with "log-level." (e.g. log-level.my-app). The default value applies to every logger in that service unless a targeting rule matches first.
Two modes:
Create a new log-level config with a default value: qfg log-level log-level.my-app --value=WARN
Add a per-logger targeting rule to an existing config. SDKs populate the "quonfig-sdk-logging.key" context automatically from the logger path, so this rule fires for any logger whose name starts with --target: qfg log-level log-level.my-app --target=MyPackage.Noisy --value=ERROR
Pass --target multiple times to match any of several prefixes (OR). Pass --environment= to scope the rule to a single environment.
To update the catch-all default for an existing log level, use set-default: qfg set-default log-level.my-app --value=DEBUG --environment=production
For more complex rules (regex, multi-criterion, exact match) edit the JSON: qfg pull && $EDITOR log-levels/log-level.my-app.json qfg config-schema # full operator reference
EXAMPLES $ qfg log-level log-level.my-app --value=WARN
$ qfg log-level log-level.my-app --target=MyPackage.Noisy --value=ERROR
$ qfg log-level log-level.my-app --target=A --target=B --value=DEBUG
$ qfg log-level log-level.my-app --target=Chatty --value=INFO --environment=production
_See code: [src/commands/log-level.ts](https://github.com/quonfig/cli/blob/v0.0.60/src/commands/log-level.ts)_
## `qfg login`
Log in to Quonfig via WorkOS device authorization (mints one token per org)
USAGE $ qfg login [--json] [--interactive] [--no-color] [--verbose]
GLOBAL FLAGS --[no-]interactive Force interactive mode --json Format output as json. --no-color Do not colorize output --verbose Verbose output
DESCRIPTION Log in to Quonfig via WorkOS device authorization (mints one token per org)
EXAMPLES $ qfg login
$ qfg login --profile myprofile
_See code: [src/commands/login.ts](https://github.com/quonfig/cli/blob/v0.0.60/src/commands/login.ts)_
## `qfg logout`
Log out and clear stored authentication tokens
USAGE $ qfg logout [--json] [--interactive] [--no-color] [--verbose]
GLOBAL FLAGS --[no-]interactive Force interactive mode --json Format output as json. --no-color Do not colorize output --verbose Verbose output
DESCRIPTION Log out and clear stored authentication tokens
EXAMPLES $ qfg logout
_See code: [src/commands/logout.ts](https://github.com/quonfig/cli/blob/v0.0.60/src/commands/logout.ts)_
## `qfg migrate`
Migrate flags and configs from a legacy feature-flag system into a Quonfig workspace.
USAGE $ qfg migrate --from launch|launchdarkly|flagsmith [--json] [--interactive] [--no-color] [--verbose] [--api-key ] [--dir ] [--dry-run] [--full-summary] [--project ] [--push] [--recent ] [--reset] [--since ] [--source-api-key ] [--staging] [--workspace ]
FLAGS
--api-key= Deprecated alias for --source-api-key, kept for the launch source (or set LAUNCH_API_KEY).
Prefer --source-api-key.
--dir= Target local workspace directory. Defaults to cwd if it looks like a Quonfig workspace,
otherwise ./quonfig-repo.
--dry-run Fetch and summarize changes without writing anything
--from= (required) Legacy source to migrate from
<options: launch|launchdarkly|flagsmith>
--full-summary Reify the full source-side audit log into per-change git commits (author = original user,
date = original timestamp, message = change summary). Only valid on first-run imports — pass
--reset to re-import everything from scratch with this flag.
--project= Source-system project identifier. For --from launchdarkly this is the project KEY (default:
"default"; env: LAUNCHDARKLY_PROJECT_KEY). For --from flagsmith this is the numeric project
ID (env: FLAGSMITH_PROJECT_ID). Ignored by --from launch.
--push After migrating to a local dir, also push to the given --workspace on Quonfig cloud
--recent= Import only the last N changes (useful for tire-kicking)
--reset Ignore the delta cursor and re-import everything from scratch
--since= Override the delta cursor (epoch milliseconds or ISO-8601 timestamp)
--source-api-key= API key for the legacy source. Set this, QUONFIG_MIGRATE_API_KEY, or the per-provider env
var (LAUNCHDARKLY_API_KEY, LAUNCH_API_KEY, FLAGSMITH_API_KEY).
--staging Hit the staging API for the source (dev-only)
--workspace= Quonfig cloud workspace slug to push to. Requires qfg login and is typically combined with
--push.
GLOBAL FLAGS --[no-]interactive Force interactive mode --json Format output as json. --no-color Do not colorize output --verbose Verbose output
DESCRIPTION Migrate flags and configs from a legacy feature-flag system into a Quonfig workspace.
Currently supported sources: launch — Reforge Launch (ported from launch-migrator)
See https://docs.quonfig.com/docs/migrating/from-launch for the step-by-step guide, and https://docs.quonfig.com/docs/migrating/troubleshooting when something goes sideways.
EXAMPLES $ qfg migrate --from launchdarkly --source-api-key $LAUNCHDARKLY_API_KEY --dir ./quonfig-repo
$ qfg migrate --from launch --source-api-key $LAUNCH_API_KEY --workspace acme-prod --push
$ qfg migrate --from launch --api-key $LAUNCH_API_KEY --dir ./quonfig-repo --reset
$ qfg migrate --from launch --source-api-key $LAUNCH_API_KEY --dir ./quonfig-repo --dry-run
$ qfg migrate --from launch --source-api-key $LAUNCH_API_KEY --dir ./quonfig-repo --staging
_See code: [src/commands/migrate.ts](https://github.com/quonfig/cli/blob/v0.0.60/src/commands/migrate.ts)_
## `qfg migrate doctor`
Preflight health checks for `qfg migrate`. Verifies auth, workspace provisioning, working tree, and identifier collisions.
USAGE $ qfg migrate doctor [--json] [--interactive] [--no-color] [--verbose] [--api-key ] [--dir ] [--from launch] [--language ]
FLAGS --api-key= Legacy SDK API key to validate against the source --dir= [default: .] Workspace directory to check (git clean / identifier map) --from= [default: launch] Legacy SDK to migrate from <options: launch> --language= Customer SDK language — used to warn when datadir mode is unavailable (e.g. javascript-browser)
GLOBAL FLAGS --[no-]interactive Force interactive mode --json Format output as json. --no-color Do not colorize output --verbose Verbose output
DESCRIPTION
Preflight health checks for qfg migrate. Verifies auth, workspace provisioning, working tree, and identifier
collisions.
EXAMPLES $ qfg migrate doctor
$ qfg migrate doctor --from launch --api-key $LAUNCH_API_KEY
$ qfg migrate doctor --dir ./my-workspace --language node
$ qfg migrate doctor --json
_See code: [src/commands/migrate/doctor.ts](https://github.com/quonfig/cli/blob/v0.0.60/src/commands/migrate/doctor.ts)_
## `qfg migrate my-code`
Migrate Launch SDK call sites in your codebase to Quonfig SDK call sites (invokes the qfg-migrate-code Claude skill)
USAGE $ qfg migrate my-code [--json] [--interactive] [--no-color] [--verbose] [--dry-run] [--from launch]
FLAGS --dry-run Show what would be migrated without editing any files --from= [default: launch] Legacy SDK to migrate from <options: launch>
GLOBAL FLAGS --[no-]interactive Force interactive mode --json Format output as json. --no-color Do not colorize output --verbose Verbose output
DESCRIPTION Migrate Launch SDK call sites in your codebase to Quonfig SDK call sites (invokes the qfg-migrate-code Claude skill)
EXAMPLES $ qfg migrate my-code
$ qfg migrate my-code --from launch
$ qfg migrate my-code --dry-run
_See code: [src/commands/migrate/my-code.ts](https://github.com/quonfig/cli/blob/v0.0.60/src/commands/migrate/my-code.ts)_
## `qfg migrate status`
Show the status of a workspace migrated with `qfg migrate`. Reads .qf/import-state.json and summarizes source, counts, and next steps.
USAGE $ qfg migrate status [--json] [--interactive] [--no-color] [--verbose] [--dir ]
FLAGS --dir= [default: .] Workspace directory to inspect
GLOBAL FLAGS --[no-]interactive Force interactive mode --json Format output as json. --no-color Do not colorize output --verbose Verbose output
DESCRIPTION
Show the status of a workspace migrated with qfg migrate. Reads .qf/import-state.json and summarizes source, counts,
and next steps.
EXAMPLES $ qfg migrate status
$ qfg migrate status --dir ./my-workspace
$ qfg migrate status --json
_See code: [src/commands/migrate/status.ts](https://github.com/quonfig/cli/blob/v0.0.60/src/commands/migrate/status.ts)_
## `qfg override [NAME] [VALUE]`
Override a flag value for your dev user.
USAGE $ qfg override [NAME] [VALUE] [--json] [--interactive] [--no-color] [--verbose] [-w ] [--clear] [--env ] [--remove]
ARGUMENTS NAME flag/config key to override VALUE new value (type inferred: bool/int/double/json/string)
FLAGS --clear remove ALL of your overrides in this env --env= environment to operate in (default: $QUONFIG_ENVIRONMENT) --remove remove your override on this key
GLOBAL FLAGS -w, --workspace= Workspace slug to use (overrides QUONFIG_WORKSPACE env var and saved default) --[no-]interactive Force interactive mode --json Format output as json. --no-color Do not colorize output --verbose Verbose output
DESCRIPTION Override a flag value for your dev user.
Writes a top-priority rule keyed on the dev-only quonfig-user.email property, so the override only fires for SDK clients that set quonfig-user.email in their context. Production SDKs typically don't set this property, which makes overrides effectively inert in production.
Examples qfg override # list flags where you have an override qfg override my.flag true # set bool override qfg override my.flag 42 # set int override qfg override my.flag '{"a":1}' # set json override qfg override my.flag --remove # remove your override on my.flag qfg override --clear # remove ALL of your overrides in this env
EXAMPLES $ qfg override
$ qfg override my.flag true
$ qfg override my.flag --remove
$ qfg override --clear
$ qfg override my.flag true --env=staging
_See code: [src/commands/override.ts](https://github.com/quonfig/cli/blob/v0.0.60/src/commands/override.ts)_
## `qfg pull`
Clone or update a local copy of your workspace config files.
USAGE $ qfg pull [--json] [--interactive] [--no-color] [--verbose] [--dir ] [--rebase] [--workspace ]
FLAGS
--dir= Local directory to clone/update (defaults to cwd / nearest ancestor with quonfig.json /
QUONFIG_DIR env var)
--rebase Replay local commits on top of origin/main when the two have diverged. Conflicts are surfaced via
standard git markers; resolve with git rebase --continue.
--workspace= Workspace ID (defaults to active profile)
GLOBAL FLAGS --[no-]interactive Force interactive mode --json Format output as json. --no-color Do not colorize output --verbose Verbose output
DESCRIPTION Clone or update a local copy of your workspace config files.
Use this when you need to edit flag JSON directly — for complex targeting rules, multi-rule configs, or anything beyond a single scalar value.
For the config file format, operator reference, and examples: qfg config-schema # human-readable reference qfg config-schema --json-schema # machine-readable JSON Schema
After editing files: qfg verify # validate JSON before pushing git -C add -A && git -C commit -m "feat: ..." && git -C push
CLI shortcuts (no JSON editing needed for simple cases): qfg set-rollout my.flag --environment production --true-percent 20 qfg set-default my.flag --environment production --value true
EXAMPLES $ qfg pull --dir ./our-config
$ qfg pull # uses QUONFIG_DIR env var
_See code: [src/commands/pull.ts](https://github.com/quonfig/cli/blob/v0.0.60/src/commands/pull.ts)_
## `qfg push`
Push local config changes up to your workspace on Quonfig cloud.
USAGE $ qfg push [--json] [--interactive] [--no-color] [--verbose] [--dir ] [--workspace ] [--yes] [--skip-validate] [--no-pin-write] [-m ]
FLAGS
-m, --message= Commit message for bare-path pushes (ignored on clone-path; push what is already committed)
--dir= Local directory to push (defaults to cwd / nearest ancestor with quonfig.json / QUONFIG_DIR
env var)
--no-pin-write Do not offer to write workspace slug into quonfig.json on success
--skip-validate Skip qfg validate preflight
--workspace= Workspace slug or UUID (defaults to active profile)
--yes Skip the standard Y/N confirm. Never skips typed-slug prompts.
GLOBAL FLAGS --[no-]interactive Force interactive mode --json Format output as json. --no-color Do not colorize output --verbose Verbose output
DESCRIPTION Push local config changes up to your workspace on Quonfig cloud.
Enforces three guards before touching the remote:
- The dir's quonfig.json "workspace" pin must match the backend (if set).
- The dir's git origin must match the backend repo URL (if set).
- A diff summary is shown; destructive changes (10+ deletes, >=25% of files, or an unpinned dir) require typing the workspace slug to confirm.
qfg push # resolves dir from cwd, QUONFIG_DIR, or --dir qfg push --dir ./our-config qfg push --dir ./our-config --workspace acme-prod qfg push --dir ./our-config --yes # skip normal Y/N (never skips typed-slug) qfg push --dir ./our-config --skip-validate
EXAMPLES $ qfg push --dir ./our-config
$ qfg push --workspace acme-prod --dir ./our-config
$ qfg push --dir ./our-config --yes
_See code: [src/commands/push.ts](https://github.com/quonfig/cli/blob/v0.0.60/src/commands/push.ts)_
## `qfg run [COMMAND]`
Run a child process with Quonfig configs injected as env vars.
USAGE $ qfg run [COMMAND...] [--json] [--interactive] [--no-color] [--verbose] [-w ] [--env ...] [--env-file ] [--environment ] [--preserve-env]
ARGUMENTS COMMAND... child command (after '--')
FLAGS --env=... [default: ] Inline env mapping in VAR=key.path form. Repeatable. --env-file= Path to a file with one VAR=key.path per line (# comments and blank lines OK). --environment= Quonfig environment to evaluate in (Mode B). Mutually exclusive with QUONFIG_ENVIRONMENT. --preserve-env Skip vars that are already set in the parent env. Default: override.
GLOBAL FLAGS -w, --workspace= Workspace slug to use (overrides QUONFIG_WORKSPACE env var and saved default) --[no-]interactive Force interactive mode --json Format output as json. --no-color Do not colorize output --verbose Verbose output
DESCRIPTION Run a child process with Quonfig configs injected as env vars.
Resolves --env VAR=key.path mappings (and --env-file lines) against your workspace, merges them into the parent env, and exec's the child command. Exits with the child's exit code. Missing keys → fail before spawning.
Auth / environment is BINARY: Mode A — QUONFIG_BACKEND_SDK_KEY set: env is encoded in the key. Setting --environment OR QUONFIG_ENVIRONMENT alongside is an error. Mode B — no SDK key: pass exactly one of --environment or QUONFIG_ENVIRONMENT.
The flag separator '--' is REQUIRED between qfg flags and the child command.
EXAMPLES $ qfg run --env DATABASE_URL=db.url --environment=staging -- env
$ qfg run --env-file=.qfg.env --environment=staging -- npm run migrate
$ qfg run --env DATABASE_URL=db.url -- ./bin/migrate.js # Mode A: relies on QUONFIG_BACKEND_SDK_KEY
$ qfg run --env DATABASE_URL=db.url --preserve-env --environment=staging -- npm test
_See code: [src/commands/run.ts](https://github.com/quonfig/cli/blob/v0.0.60/src/commands/run.ts)_
## `qfg schema NAME`
Get or update first-class schema documents
USAGE $ qfg schema NAME [--json] [--interactive] [--no-color] [--verbose] [-w ] [--get] [--protected] [--set-json-schema ] [--set-zod ]
ARGUMENTS NAME schema key
FLAGS --get get the schema document --protected store the schema in protected storage --set-json-schema= set a plain JSON Schema document (inline JSON or @file path) --set-zod= compatibility alias for --set-json-schema; now expects plain JSON Schema
GLOBAL FLAGS -w, --workspace= Workspace slug to use (overrides QUONFIG_WORKSPACE env var and saved default) --[no-]interactive Force interactive mode --json Format output as json. --no-color Do not colorize output --verbose Verbose output
DESCRIPTION Get or update first-class schema documents
EXAMPLES $ qfg schema my-schema --get
$ qfg schema my-schema --set-json-schema='{"type":"object","properties":{}}'
$ qfg schema my-schema --set-json-schema=@schemas/my-schema.json --protected
_See code: [src/commands/schema.ts](https://github.com/quonfig/cli/blob/v0.0.60/src/commands/schema.ts)_
## `qfg sdk-key`
Manage SDK keys for your workspace
USAGE $ qfg sdk-key [--json] [--interactive] [--no-color] [--verbose]
GLOBAL FLAGS --[no-]interactive Force interactive mode --json Format output as json. --no-color Do not colorize output --verbose Verbose output
DESCRIPTION Manage SDK keys for your workspace
EXAMPLES $ qfg sdk-key list
$ qfg sdk-key create --environment production --type server
$ qfg sdk-key revoke
_See code: [src/commands/sdk-key.ts](https://github.com/quonfig/cli/blob/v0.0.60/src/commands/sdk-key.ts)_
## `qfg sdk-key create`
Create a new SDK key
USAGE $ qfg sdk-key create [--json] [--interactive] [--no-color] [--verbose] [-w ] [-e ] [-t server|browser]
FLAGS -e, --environment= Environment name (e.g. production, staging) -t, --type= Key type: server (backend) or browser (frontend) <options: server|browser>
GLOBAL FLAGS -w, --workspace= Workspace slug to use (overrides QUONFIG_WORKSPACE env var and saved default) --[no-]interactive Force interactive mode --json Format output as json. --no-color Do not colorize output --verbose Verbose output
DESCRIPTION Create a new SDK key
EXAMPLES $ qfg sdk-key create --environment production --type server
$ qfg sdk-key create --environment staging --type browser
_See code: [src/commands/sdk-key/create.ts](https://github.com/quonfig/cli/blob/v0.0.60/src/commands/sdk-key/create.ts)_
## `qfg sdk-key list`
List SDK keys for your workspace
USAGE $ qfg sdk-key list [--json] [--interactive] [--no-color] [--verbose] [-w ] [-e ]
FLAGS -e, --environment= Filter by environment name
GLOBAL FLAGS -w, --workspace= Workspace slug to use (overrides QUONFIG_WORKSPACE env var and saved default) --[no-]interactive Force interactive mode --json Format output as json. --no-color Do not colorize output --verbose Verbose output
DESCRIPTION List SDK keys for your workspace
EXAMPLES $ qfg sdk-key list
$ qfg sdk-key list --environment production
_See code: [src/commands/sdk-key/list.ts](https://github.com/quonfig/cli/blob/v0.0.60/src/commands/sdk-key/list.ts)_
## `qfg sdk-key revoke KEYID`
Revoke an SDK key by its ID
USAGE $ qfg sdk-key revoke KEYID [--json] [--interactive] [--no-color] [--verbose] [-w ]
ARGUMENTS KEYID ID of the SDK key to revoke
GLOBAL FLAGS -w, --workspace= Workspace slug to use (overrides QUONFIG_WORKSPACE env var and saved default) --[no-]interactive Force interactive mode --json Format output as json. --no-color Do not colorize output --verbose Verbose output
DESCRIPTION Revoke an SDK key by its ID
EXAMPLES $ qfg sdk-key revoke a1b2c3d4-e5f6-7890-abcd-ef1234567890
_See code: [src/commands/sdk-key/revoke.ts](https://github.com/quonfig/cli/blob/v0.0.60/src/commands/sdk-key/revoke.ts)_
## `qfg serve`
Serve a local datadir over HTTP to browser/RN SDKs.
USAGE $ qfg serve [--json] [--interactive] [--no-color] [--verbose] [--datadir ] [--environment ] [--port ] [--host ] [--frontend-sdk-key ] [--cors-origin ...] [--watch] [--allow-non-loopback]
FLAGS --allow-non-loopback Confirm a LAN-reachable bind. Required when --host is not loopback. --cors-origin=... [default: *] Allowed CORS origin (repeatable). Default is *; required when binding to a non-loopback host. --datadir= Datadir to serve (defaults to ./our-config, then ./.quonfig, then errors). Honors QUONFIG_DIR. --environment= [default: development] Which environment slug to evaluate. Honors QUONFIG_ENVIRONMENT. --frontend-sdk-key= If set, every request must present Authorization: Basic 1:. If unset, the server is open (matches the "datadir is the source of truth" mental model). --host= [default: 127.0.0.1] Bind address. Loopback by default; non-loopback requires --allow-non-loopback. --port= [default: 6580] TCP port to listen on. Errors on collision; pass --port to retry. --[no-]watch Reload the envelope when the datadir changes. --no-watch disables.
GLOBAL FLAGS --[no-]interactive Force interactive mode --json Format output as json. --no-color Do not colorize output --verbose Verbose output
DESCRIPTION Serve a local datadir over HTTP to browser/RN SDKs.
Reads configs from a local datadir and exposes them at
GET /api/v2/configs/eval-with-context/{base64url(ctx)}. Point your
browser SDK at the resulting URL (http://localhost:6580 by default)
and the same client code that talks to api-delivery in production will
work unmodified.
Telemetry is intentionally not served — qfg serve has no Quonfig backend
behind it. Disable client-side telemetry with
collectEvaluationSummaries: false (and contextUploadMode: "none"),
or point the SDK's telemetryUrl at a real endpoint.
The server is bound to 127.0.0.1 by default; pass --allow-non-loopback to confirm a LAN-reachable bind.
EXAMPLES $ qfg serve
$ qfg serve --datadir ./our-config --environment production
$ qfg serve --port 6581 --frontend-sdk-key PUBLIC_KEY
_See code: [src/commands/serve.ts](https://github.com/quonfig/cli/blob/v0.0.60/src/commands/serve.ts)_
## `qfg set-default [NAME]`
Set the unconditional fallback value for a flag or config