@quonfig/cli 0.4.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +229 -77
- package/dist/agent/skill-bundle.generated.d.ts +1 -1
- package/dist/agent/skill-bundle.generated.js +4 -4
- package/dist/codegen/code-generators/base-typescript-generator.d.ts +1 -1
- package/dist/codegen/schema-extractor.d.ts +1 -1
- package/dist/commands/config-schema.js +9 -2
- package/dist/commands/create.d.ts +3 -1
- package/dist/commands/create.js +93 -20
- package/dist/commands/environments.d.ts +8 -0
- package/dist/commands/environments.js +32 -0
- package/dist/commands/get.d.ts +1 -0
- package/dist/commands/get.js +40 -3
- package/dist/commands/info.d.ts +1 -0
- package/dist/commands/info.js +69 -32
- package/dist/commands/set-default.d.ts +2 -0
- package/dist/commands/set-default.js +98 -35
- package/dist/commands/set-rollout.js +2 -2
- package/dist/index.d.ts +6 -0
- package/dist/index.js +35 -3
- package/dist/interactive-prompt.d.ts +18 -0
- package/dist/interactive-prompt.js +11 -2
- package/dist/migrate/quonfig-target/operators.js +4 -2
- package/dist/migrate/quonfig-target/ruleset.d.ts +48 -0
- package/dist/migrate/quonfig-target/ruleset.js +132 -8
- package/dist/migrate/sources/flagsmith/translate.js +11 -0
- package/dist/migrate/sources/launchdarkly/translate.js +19 -16
- package/dist/push/git-pack.d.ts +12 -0
- package/dist/push/git-pack.js +27 -3
- package/dist/push/run-push.d.ts +2 -1
- package/dist/push/run-push.js +1 -2
- package/dist/ui/get-confirmation.d.ts +10 -1
- package/dist/ui/get-confirmation.js +13 -4
- package/dist/ui/get-string.d.ts +18 -1
- package/dist/ui/get-string.js +20 -5
- package/dist/ui/get-value.d.ts +3 -1
- package/dist/ui/get-value.js +7 -7
- package/dist/util/clone-and-stack-push.js +8 -3
- package/dist/util/encryption.js +11 -20
- package/dist/util/git-ops.d.ts +4 -2
- package/dist/util/git-ops.js +4 -2
- package/dist/util/redact.d.ts +56 -0
- package/dist/util/redact.js +98 -0
- package/dist/util/value-source.d.ts +30 -0
- package/dist/util/value-source.js +81 -0
- package/dist/verify/regex-dialect.d.ts +39 -0
- package/dist/verify/regex-dialect.js +278 -0
- package/dist/verify/standalone.d.ts +3 -1
- package/dist/verify/standalone.js +4 -19
- package/dist/verify/validate.js +20 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/oclif.manifest.json +218 -97
- package/package.json +18 -16
package/oclif.manifest.json
CHANGED
|
@@ -292,12 +292,16 @@
|
|
|
292
292
|
"required": true
|
|
293
293
|
}
|
|
294
294
|
},
|
|
295
|
-
"description": "Create a new feature flag, config value, or other item.\n\nUse --type to specify the kind of item:\n boolean-flag On/off feature flag (sendToClientSdk defaults to true; best for gradual rollouts)\n string A string configuration value\n int An integer configuration value\n double A floating-point configuration value\n string-list A comma-separated list of strings\n json An arbitrary JSON blob\n boolean A plain boolean (not a feature flag)\n duration An ISO 8601 duration string, e.g. PT30S, PT5M, PT1H30M (SDK returns milliseconds)\n log_level A dynamic log level (value must be one of TRACE/DEBUG/INFO/WARN/ERROR/FATAL)\n\nThis sets the global default value. Override per-environment with:\n qfg set-default my.flag --environment production --value true\n\nFor a percentage rollout (gradual rollout / A/B test / canary deploy), use:\n qfg set-rollout my.flag --environment production --true-percent 20\n\nOr edit the JSON config file directly for complex targeting rules:\n qfg config-schema # full operator reference + examples\n qfg pull --dir ./config # clone workspace, then edit JSON and git push\n\nLog levels:\n qfg create log-level.my-app --type log_level --value WARN\n # Log-level keys must start with \"log-level.\".\n # For per-logger targeting, create ONE log-level config per service and add\n # rules on the \"quonfig-sdk-logging.key\" context property (e.g.\n # PROP_STARTS_WITH_ONE_OF MyPackage.) rather than one config per logger.\n\nWhen this flag has done its job, mark readyForCleanup: true in the UI and run `qfg cleanup list` to retire it.",
|
|
295
|
+
"description": "Create a new feature flag, config value, or other item.\n\nUse --type to specify the kind of item:\n boolean-flag On/off feature flag (sendToClientSdk defaults to true; best for gradual rollouts)\n string A string configuration value\n int An integer configuration value\n double A floating-point configuration value\n string-list A comma-separated list of strings\n json An arbitrary JSON blob\n boolean A plain boolean (not a feature flag)\n duration An ISO 8601 duration string, e.g. PT30S, PT5M, PT1H30M (SDK returns milliseconds)\n log_level A dynamic log level (value must be one of TRACE/DEBUG/INFO/WARN/ERROR/FATAL)\n\nSecrets (--secret) are encrypted client-side and are STRING-ONLY: --secret\nimplies --type string, so you can leave --type off. To store a JSON secret, store the JSON as a string secret and\nJSON.parse it in your app. The CLI never prints a secret's plaintext: it shows\na redacted fingerprint like [encrypted *****3fa9c, 51 chars, ends …a1b2].\n\nKeep the value out of argv / shell history / agent transcripts with:\n --value-stdin read the value from stdin\n --value-from-env=VAR read the value from a local env var, now\nThese are different from --env-var, which stores NO value: it tells the SDK to\nread the value from that env var at runtime.\n\nThis sets the global default value. Override per-environment with:\n qfg set-default my.flag --environment production --value true\n\nFor a percentage rollout (gradual rollout / A/B test / canary deploy), use:\n qfg set-rollout my.flag --environment production --true-percent 20\n\nOr edit the JSON config file directly for complex targeting rules:\n qfg config-schema # full operator reference + examples\n qfg pull --dir ./config # clone workspace, then edit JSON and git push\n\nLog levels:\n qfg create log-level.my-app --type log_level --value WARN\n # Log-level keys must start with \"log-level.\".\n # For per-logger targeting, create ONE log-level config per service and add\n # rules on the \"quonfig-sdk-logging.key\" context property (e.g.\n # PROP_STARTS_WITH_ONE_OF MyPackage.) rather than one config per logger.\n\nWhen this flag has done its job, mark readyForCleanup: true in the UI and run `qfg cleanup list` to retire it.",
|
|
296
296
|
"examples": [
|
|
297
297
|
"<%= config.bin %> <%= command.id %> my.new.flag --type boolean-flag",
|
|
298
298
|
"<%= config.bin %> <%= command.id %> my.new.flag --type boolean-flag --value=true",
|
|
299
299
|
"<%= config.bin %> <%= command.id %> my.new.string --type string --value=\"hello world\"",
|
|
300
|
-
"
|
|
300
|
+
"# Create a secret without the value ever appearing in argv (--secret implies --type string):",
|
|
301
|
+
"pbpaste | <%= config.bin %> <%= command.id %> stripe.api-key --secret --value-stdin",
|
|
302
|
+
"<%= config.bin %> <%= command.id %> stripe.api-key --secret --value-from-env STRIPE_API_KEY",
|
|
303
|
+
"# A JSON secret is a string secret holding JSON (JSON.parse it in your app):",
|
|
304
|
+
"<%= config.bin %> <%= command.id %> gcp.service-account --secret --value-stdin < sa.json",
|
|
301
305
|
"<%= config.bin %> <%= command.id %> my.new.string --type string --env-var=MY_ENV_VAR_NAME",
|
|
302
306
|
"<%= config.bin %> <%= command.id %> my.new.string --type json --value=\"{\\\"key\\\": \\\"value\\\"}\"",
|
|
303
307
|
"<%= config.bin %> <%= command.id %> my.timeout --type duration --value PT90S",
|
|
@@ -363,15 +367,15 @@
|
|
|
363
367
|
"type": "boolean"
|
|
364
368
|
},
|
|
365
369
|
"env-var": {
|
|
366
|
-
"description": "
|
|
370
|
+
"description": "store no value: the SDK reads it from this env var at RUNTIME. To read a value from a local env var NOW, use --value-from-env",
|
|
367
371
|
"name": "env-var",
|
|
368
372
|
"hasDynamicHelp": false,
|
|
369
373
|
"multiple": false,
|
|
370
374
|
"type": "option"
|
|
371
375
|
},
|
|
372
376
|
"type": {
|
|
377
|
+
"description": "kind of item to create (required, except with --secret, which implies string)",
|
|
373
378
|
"name": "type",
|
|
374
|
-
"required": true,
|
|
375
379
|
"hasDynamicHelp": false,
|
|
376
380
|
"multiple": false,
|
|
377
381
|
"options": [
|
|
@@ -388,15 +392,29 @@
|
|
|
388
392
|
"type": "option"
|
|
389
393
|
},
|
|
390
394
|
"value": {
|
|
391
|
-
"description": "default value for your new item",
|
|
395
|
+
"description": "default value for your new item (for secrets prefer --value-stdin / --value-from-env)",
|
|
392
396
|
"name": "value",
|
|
393
397
|
"required": false,
|
|
394
398
|
"hasDynamicHelp": false,
|
|
395
399
|
"multiple": false,
|
|
396
400
|
"type": "option"
|
|
397
401
|
},
|
|
402
|
+
"value-from-env": {
|
|
403
|
+
"description": "read the value to store from this LOCAL env var now (keeps it out of argv/shell history). Not the same as --env-var",
|
|
404
|
+
"name": "value-from-env",
|
|
405
|
+
"hasDynamicHelp": false,
|
|
406
|
+
"helpValue": "VAR",
|
|
407
|
+
"multiple": false,
|
|
408
|
+
"type": "option"
|
|
409
|
+
},
|
|
410
|
+
"value-stdin": {
|
|
411
|
+
"description": "read the value to store from stdin (one trailing newline is stripped). Keeps it out of argv",
|
|
412
|
+
"name": "value-stdin",
|
|
413
|
+
"allowNo": false,
|
|
414
|
+
"type": "boolean"
|
|
415
|
+
},
|
|
398
416
|
"secret": {
|
|
399
|
-
"description": "encrypt the value of this item",
|
|
417
|
+
"description": "encrypt the value of this item (string-only; the CLI never prints the plaintext)",
|
|
400
418
|
"name": "secret",
|
|
401
419
|
"allowNo": false,
|
|
402
420
|
"type": "boolean"
|
|
@@ -512,6 +530,83 @@
|
|
|
512
530
|
"delete.js"
|
|
513
531
|
]
|
|
514
532
|
},
|
|
533
|
+
"environments": {
|
|
534
|
+
"aliases": [
|
|
535
|
+
"envs"
|
|
536
|
+
],
|
|
537
|
+
"args": {},
|
|
538
|
+
"description": "List the environments in your workspace.\n\nUse these names with --environment (set-default, set-rollout, get, run, ...).\n\"[Default]\" is not an environment: it names the default rules that every\nenvironment without rules of its own inherits. Protected environments may\nrequire extra permissions to change.",
|
|
539
|
+
"examples": [
|
|
540
|
+
"<%= config.bin %> <%= command.id %>",
|
|
541
|
+
"<%= config.bin %> <%= command.id %> --json"
|
|
542
|
+
],
|
|
543
|
+
"flags": {
|
|
544
|
+
"json": {
|
|
545
|
+
"description": "Format output as json.",
|
|
546
|
+
"helpGroup": "GLOBAL",
|
|
547
|
+
"name": "json",
|
|
548
|
+
"allowNo": false,
|
|
549
|
+
"type": "boolean"
|
|
550
|
+
},
|
|
551
|
+
"interactive": {
|
|
552
|
+
"description": "Force interactive mode",
|
|
553
|
+
"helpGroup": "GLOBAL",
|
|
554
|
+
"name": "interactive",
|
|
555
|
+
"allowNo": true,
|
|
556
|
+
"type": "boolean"
|
|
557
|
+
},
|
|
558
|
+
"no-color": {
|
|
559
|
+
"description": "Do not colorize output",
|
|
560
|
+
"env": "NO_COLOR",
|
|
561
|
+
"helpGroup": "GLOBAL",
|
|
562
|
+
"name": "no-color",
|
|
563
|
+
"allowNo": false,
|
|
564
|
+
"type": "boolean"
|
|
565
|
+
},
|
|
566
|
+
"verbose": {
|
|
567
|
+
"description": "Verbose output",
|
|
568
|
+
"helpGroup": "GLOBAL",
|
|
569
|
+
"name": "verbose",
|
|
570
|
+
"allowNo": false,
|
|
571
|
+
"type": "boolean"
|
|
572
|
+
},
|
|
573
|
+
"workspace": {
|
|
574
|
+
"char": "w",
|
|
575
|
+
"description": "Workspace slug to use (overrides QUONFIG_WORKSPACE env var and saved default)",
|
|
576
|
+
"helpGroup": "GLOBAL",
|
|
577
|
+
"name": "workspace",
|
|
578
|
+
"required": false,
|
|
579
|
+
"hasDynamicHelp": false,
|
|
580
|
+
"multiple": false,
|
|
581
|
+
"type": "option"
|
|
582
|
+
},
|
|
583
|
+
"profile": {
|
|
584
|
+
"char": "p",
|
|
585
|
+
"description": "Deprecated: use --workspace instead",
|
|
586
|
+
"helpGroup": "GLOBAL",
|
|
587
|
+
"hidden": true,
|
|
588
|
+
"name": "profile",
|
|
589
|
+
"required": false,
|
|
590
|
+
"hasDynamicHelp": false,
|
|
591
|
+
"multiple": false,
|
|
592
|
+
"type": "option"
|
|
593
|
+
}
|
|
594
|
+
},
|
|
595
|
+
"hasDynamicHelp": false,
|
|
596
|
+
"hiddenAliases": [],
|
|
597
|
+
"id": "environments",
|
|
598
|
+
"pluginAlias": "@quonfig/cli",
|
|
599
|
+
"pluginName": "@quonfig/cli",
|
|
600
|
+
"pluginType": "core",
|
|
601
|
+
"strict": true,
|
|
602
|
+
"enableJsonFlag": true,
|
|
603
|
+
"isESM": true,
|
|
604
|
+
"relativePath": [
|
|
605
|
+
"dist",
|
|
606
|
+
"commands",
|
|
607
|
+
"environments.js"
|
|
608
|
+
]
|
|
609
|
+
},
|
|
515
610
|
"generate-new-hex-key": {
|
|
516
611
|
"aliases": [],
|
|
517
612
|
"args": {},
|
|
@@ -663,10 +758,12 @@
|
|
|
663
758
|
"name": "name"
|
|
664
759
|
}
|
|
665
760
|
},
|
|
666
|
-
"description": "Get the value of a config/feature-flag/etc.",
|
|
761
|
+
"description": "Get the value of a config/feature-flag/etc.\n\nSecrets (encrypted) and confidential values print REDACTED by default, as a\nfingerprint plus length (and the last 4 characters for values of 12+ chars):\n [encrypted *****3fa9c, 51 chars, ends …a1b2]\nThe fingerprint is the same one SDK telemetry and the Quonfig UI show, so you\ncan confirm a rotation landed without printing the secret. Pass --reveal to\nprint the plaintext. To inject secrets into a process, prefer `qfg run`.",
|
|
667
762
|
"examples": [
|
|
668
763
|
"<%= config.bin %> <%= command.id %> my.config.name",
|
|
669
|
-
"<%= config.bin %> <%= command.id %> my.config.name --environment=production"
|
|
764
|
+
"<%= config.bin %> <%= command.id %> my.config.name --environment=production",
|
|
765
|
+
"<%= config.bin %> <%= command.id %> stripe.api-key --environment=production # redacted fingerprint",
|
|
766
|
+
"<%= config.bin %> <%= command.id %> stripe.api-key --environment=production --reveal # plaintext"
|
|
670
767
|
],
|
|
671
768
|
"flags": {
|
|
672
769
|
"json": {
|
|
@@ -725,6 +822,12 @@
|
|
|
725
822
|
"hasDynamicHelp": false,
|
|
726
823
|
"multiple": false,
|
|
727
824
|
"type": "option"
|
|
825
|
+
},
|
|
826
|
+
"reveal": {
|
|
827
|
+
"description": "print the plaintext of a secret/confidential value (it is redacted by default)",
|
|
828
|
+
"name": "reveal",
|
|
829
|
+
"allowNo": false,
|
|
830
|
+
"type": "boolean"
|
|
728
831
|
}
|
|
729
832
|
},
|
|
730
833
|
"hasDynamicHelp": false,
|
|
@@ -2308,12 +2411,16 @@
|
|
|
2308
2411
|
"name": "name"
|
|
2309
2412
|
}
|
|
2310
2413
|
},
|
|
2311
|
-
"description": "Set the fallback value for a flag or config in one environment.\n\nThe fallback is the unconditional rule at the end of the environment's rule\nlist: what users receive when no targeting rule matches. Targeting rules and\npercentage rollouts above it are kept, and the command tells you how many.\nIf the environment has no rules of its own yet, they are copied from the\nflag's default rules first, so inherited targeting is kept too.\n\nTo turn a flag on or off for EVERYONE, including users matched by targeting\nrules, add --replace-targeting. This deletes the environment's targeting\nrules (they stay in git history).\n\nTo set a percentage rollout (gradual rollout / A/B test / canary deploy) instead:\n qfg set-rollout my.flag --environment production --true-percent 20\n\nTo see all current values and rules for a flag:\n qfg info my.flag\n\nTo target specific organizations or users, write rules on their KEY\n(organization.key, user.key), not a slug or email; find a key from a name with:\n qfg contexts search organization formhealth",
|
|
2414
|
+
"description": "Set the fallback value for a flag or config in one environment.\n\nThe fallback is the unconditional rule at the end of the environment's rule\nlist: what users receive when no targeting rule matches. Targeting rules and\npercentage rollouts above it are kept, and the command tells you how many.\nIf the environment has no rules of its own yet, they are copied from the\nflag's default rules first, so inherited targeting is kept too.\n\nTo turn a flag on or off for EVERYONE, including users matched by targeting\nrules, add --replace-targeting. This deletes the environment's targeting\nrules (they stay in git history).\n\nTo set a percentage rollout (gradual rollout / A/B test / canary deploy) instead:\n qfg set-rollout my.flag --environment production --true-percent 20\n\nSecrets (--secret, or any config whose value is already encrypted) are\nSTRING-ONLY. To store a JSON secret, make it a string secret holding the JSON\nand JSON.parse it in your app. The CLI never prints a secret's plaintext; it\nshows a redacted fingerprint like [encrypted *****3fa9c, 51 chars, ends …a1b2].\nRotate a secret without the value entering argv / shell history:\n pbpaste | qfg set-default stripe.api-key --environment production --secret --value-stdin --confirm\n qfg set-default stripe.api-key --environment production --secret --value-from-env STRIPE_API_KEY --confirm\n(--env-var is different: it stores NO value and tells the SDK to read one from\nthat env var at runtime.)\n\nTo see all current values and rules for a flag:\n qfg info my.flag\n\nTo target specific organizations or users, write rules on their KEY\n(organization.key, user.key), not a slug or email; find a key from a name with:\n qfg contexts search organization formhealth",
|
|
2312
2415
|
"examples": [
|
|
2313
2416
|
"<%= config.bin %> <%= command.id %> my.flag.name # prompts for value and env",
|
|
2314
2417
|
"<%= config.bin %> <%= command.id %> my.flag.name --value=true --environment=staging",
|
|
2315
2418
|
"<%= config.bin %> <%= command.id %> my.flag.name --value=false --environment=production --replace-targeting # kill-switch: off for everyone",
|
|
2316
|
-
"
|
|
2419
|
+
"# Rotate a secret without the value entering argv:",
|
|
2420
|
+
"pbpaste | <%= config.bin %> <%= command.id %> my.secret --environment=production --secret --value-stdin --confirm",
|
|
2421
|
+
"<%= config.bin %> <%= command.id %> my.secret --environment=production --secret --value-from-env=MY_SECRET --confirm",
|
|
2422
|
+
"# Write the [Default] rules (inherited by every environment without its own):",
|
|
2423
|
+
"<%= config.bin %> <%= command.id %> my.secret --environment=\"[Default]\" --secret --value-from-env=MY_SECRET --confirm",
|
|
2317
2424
|
"<%= config.bin %> <%= command.id %> my.config.name --env-var=MY_ENV_VAR_NAME --environment=production",
|
|
2318
2425
|
"# For a percentage rollout, use set-rollout instead:",
|
|
2319
2426
|
"<%= config.bin %> set-rollout my.flag.name --environment production --true-percent 20",
|
|
@@ -2372,20 +2479,20 @@
|
|
|
2372
2479
|
"type": "option"
|
|
2373
2480
|
},
|
|
2374
2481
|
"confidential": {
|
|
2375
|
-
"description": "mark the value as confidential",
|
|
2482
|
+
"description": "mark the value as confidential. Auto-detected when the key already holds a confidential value; pass --no-confidential to store it in the clear",
|
|
2376
2483
|
"name": "confidential",
|
|
2377
|
-
"allowNo":
|
|
2484
|
+
"allowNo": true,
|
|
2378
2485
|
"type": "boolean"
|
|
2379
2486
|
},
|
|
2380
2487
|
"env-var": {
|
|
2381
|
-
"description": "
|
|
2488
|
+
"description": "store no value: the SDK reads it from this env var at RUNTIME. To read a value from a local env var NOW, use --value-from-env",
|
|
2382
2489
|
"name": "env-var",
|
|
2383
2490
|
"hasDynamicHelp": false,
|
|
2384
2491
|
"multiple": false,
|
|
2385
2492
|
"type": "option"
|
|
2386
2493
|
},
|
|
2387
2494
|
"environment": {
|
|
2388
|
-
"description": "environment to change",
|
|
2495
|
+
"description": "environment to change, e.g. production. Use \"[Default]\" for the default rules that every environment without its own rules inherits",
|
|
2389
2496
|
"name": "environment",
|
|
2390
2497
|
"hasDynamicHelp": false,
|
|
2391
2498
|
"multiple": false,
|
|
@@ -2398,12 +2505,26 @@
|
|
|
2398
2505
|
"type": "boolean"
|
|
2399
2506
|
},
|
|
2400
2507
|
"value": {
|
|
2401
|
-
"description": "new default value",
|
|
2508
|
+
"description": "new default value (for secrets prefer --value-stdin / --value-from-env)",
|
|
2402
2509
|
"name": "value",
|
|
2403
2510
|
"hasDynamicHelp": false,
|
|
2404
2511
|
"multiple": false,
|
|
2405
2512
|
"type": "option"
|
|
2406
2513
|
},
|
|
2514
|
+
"value-from-env": {
|
|
2515
|
+
"description": "read the value to store from this LOCAL env var now (keeps it out of argv/shell history). Not the same as --env-var",
|
|
2516
|
+
"name": "value-from-env",
|
|
2517
|
+
"hasDynamicHelp": false,
|
|
2518
|
+
"helpValue": "VAR",
|
|
2519
|
+
"multiple": false,
|
|
2520
|
+
"type": "option"
|
|
2521
|
+
},
|
|
2522
|
+
"value-stdin": {
|
|
2523
|
+
"description": "read the value to store from stdin (one trailing newline is stripped). Keeps it out of argv",
|
|
2524
|
+
"name": "value-stdin",
|
|
2525
|
+
"allowNo": false,
|
|
2526
|
+
"type": "boolean"
|
|
2527
|
+
},
|
|
2407
2528
|
"confirm": {
|
|
2408
2529
|
"description": "confirm without prompt",
|
|
2409
2530
|
"name": "confirm",
|
|
@@ -2411,7 +2532,7 @@
|
|
|
2411
2532
|
"type": "boolean"
|
|
2412
2533
|
},
|
|
2413
2534
|
"secret": {
|
|
2414
|
-
"description": "encrypt the value of this item",
|
|
2535
|
+
"description": "encrypt the value of this item (string-only; the CLI never prints the plaintext)",
|
|
2415
2536
|
"name": "secret",
|
|
2416
2537
|
"allowNo": false,
|
|
2417
2538
|
"type": "boolean"
|
|
@@ -3238,17 +3359,30 @@
|
|
|
3238
3359
|
"install-skill.js"
|
|
3239
3360
|
]
|
|
3240
3361
|
},
|
|
3241
|
-
"
|
|
3362
|
+
"contexts:search": {
|
|
3242
3363
|
"aliases": [],
|
|
3243
|
-
"args": {
|
|
3244
|
-
|
|
3364
|
+
"args": {
|
|
3365
|
+
"contextType": {
|
|
3366
|
+
"description": "Context type to search, e.g. organization or user (the part before \".key\" in a rule)",
|
|
3367
|
+
"name": "contextType",
|
|
3368
|
+
"required": true
|
|
3369
|
+
},
|
|
3370
|
+
"query": {
|
|
3371
|
+
"description": "Case-insensitive text matched against each context key and its reported properties (e.g. a name)",
|
|
3372
|
+
"name": "query",
|
|
3373
|
+
"required": true
|
|
3374
|
+
}
|
|
3375
|
+
},
|
|
3376
|
+
"description": "Find a context's key from a name, to target it in a rule.\n\nTargeting rules should match a context by its KEY (<contextType>.key, e.g.\norganization.key or user.key), not by a slug, email or name. This searches the\ncontexts your SDKs have reported through telemetry, matching the query against\neach context's key and properties, and prints each match's key, its name and\nits email (blank when the context reported none), most recently seen first.\n\nOnly contexts your SDKs have reported are searchable. If nothing matches, the key\nis unknown: get it from whoever owns that customer rather than targeting a slug\nor email instead.\n\nPass a key as the query to see its name and email.\n\n--json prints {contexts: [{key, name, email?}]}: name is null when the context\nreported no name, and email is present only when it reported one.",
|
|
3245
3377
|
"examples": [
|
|
3246
|
-
"<%= config.bin %> <%= command.id %>",
|
|
3247
|
-
"<%= config.bin %> <%= command.id %> --
|
|
3378
|
+
"<%= config.bin %> <%= command.id %> organization formhealth",
|
|
3379
|
+
"<%= config.bin %> <%= command.id %> user barry@example.com --environment production",
|
|
3380
|
+
"<%= config.bin %> <%= command.id %> organization formhealth --json"
|
|
3248
3381
|
],
|
|
3249
3382
|
"flags": {
|
|
3250
3383
|
"json": {
|
|
3251
|
-
"description": "
|
|
3384
|
+
"description": "Format output as json.",
|
|
3385
|
+
"helpGroup": "GLOBAL",
|
|
3252
3386
|
"name": "json",
|
|
3253
3387
|
"allowNo": false,
|
|
3254
3388
|
"type": "boolean"
|
|
@@ -3295,11 +3429,26 @@
|
|
|
3295
3429
|
"hasDynamicHelp": false,
|
|
3296
3430
|
"multiple": false,
|
|
3297
3431
|
"type": "option"
|
|
3432
|
+
},
|
|
3433
|
+
"environment": {
|
|
3434
|
+
"description": "Only contexts reported from this environment (default: every environment)",
|
|
3435
|
+
"name": "environment",
|
|
3436
|
+
"hasDynamicHelp": false,
|
|
3437
|
+
"multiple": false,
|
|
3438
|
+
"type": "option"
|
|
3439
|
+
},
|
|
3440
|
+
"limit": {
|
|
3441
|
+
"description": "Maximum number of matches (1-100)",
|
|
3442
|
+
"name": "limit",
|
|
3443
|
+
"default": 20,
|
|
3444
|
+
"hasDynamicHelp": false,
|
|
3445
|
+
"multiple": false,
|
|
3446
|
+
"type": "option"
|
|
3298
3447
|
}
|
|
3299
3448
|
},
|
|
3300
3449
|
"hasDynamicHelp": false,
|
|
3301
3450
|
"hiddenAliases": [],
|
|
3302
|
-
"id": "
|
|
3451
|
+
"id": "contexts:search",
|
|
3303
3452
|
"pluginAlias": "@quonfig/cli",
|
|
3304
3453
|
"pluginName": "@quonfig/cli",
|
|
3305
3454
|
"pluginType": "core",
|
|
@@ -3309,28 +3458,21 @@
|
|
|
3309
3458
|
"relativePath": [
|
|
3310
3459
|
"dist",
|
|
3311
3460
|
"commands",
|
|
3312
|
-
"
|
|
3313
|
-
"
|
|
3461
|
+
"contexts",
|
|
3462
|
+
"search.js"
|
|
3314
3463
|
]
|
|
3315
3464
|
},
|
|
3316
|
-
"cleanup:
|
|
3465
|
+
"cleanup:list": {
|
|
3317
3466
|
"aliases": [],
|
|
3318
|
-
"args": {
|
|
3319
|
-
|
|
3320
|
-
"description": "config/feature-flag/etc. name",
|
|
3321
|
-
"name": "name"
|
|
3322
|
-
}
|
|
3323
|
-
},
|
|
3324
|
-
"description": "Write a cleanup payload for a ready-for-cleanup flag and hand off to the Quonfig agent skill.\n\nModeled on `qfg migrate my-code` — this command never edits source files\nitself. It validates that the flag is marked readyForCleanup=true, refuses to\nproceed if there are still evals_2d > 0 (use --force to override), writes\n`.qf/cleanup/<key>.json` describing the flag's current rule shape +\ntelemetry, and prints how to have your coding agent remove the call sites with\nthe quonfig agent skill (its references/retire-a-flag.md), which asks the\nengineer which value should \"win\" and applies the inlining. Install the skill\nwith `qfg agent install-skill` or `claude plugin install quonfig@quonfig`.\n\nThe payload deliberately does NOT suggest a winning value; that's the\nengineer's call. Run `qfg cleanup status <key>` first if you want to inspect\ntelemetry before retiring.",
|
|
3467
|
+
"args": {},
|
|
3468
|
+
"description": "List feature flags marked readyForCleanup=true, with eval volume per window.\n\nColumns:\n KEY the flag key\n TYPE the flag's valueType (bool, string, int, etc.)\n EVALS_24H evals counted in today's bucket (latest day)\n EVALS_2D evals in the last 2 calendar days\n EVALS_7D evals in the last 7 calendar days\n EVALS_30D evals in the last 30 calendar days\n LAST_EVAL most recent calendar day with any evals (UTC), blank if none\n CLASS quiet (zero evals in last 2 days) or active\n\nDefault sort: quiet first, oldest LAST_EVAL at top.\n\nPass --json for the structured object (rows[]). Each row carries the columns\nabove plus the raw eval counts your agent can reason about itself.\n\nOnce you've picked a candidate, run `qfg cleanup status <key>` for the\ndrill-in, or `qfg cleanup remove <key>` to hand the removal to your coding agent\nwith the Quonfig agent skill.",
|
|
3325
3469
|
"examples": [
|
|
3326
|
-
"<%= config.bin %> <%= command.id %>
|
|
3327
|
-
"<%= config.bin %> <%= command.id %>
|
|
3328
|
-
"<%= config.bin %> <%= command.id %> my.flag.key --json"
|
|
3470
|
+
"<%= config.bin %> <%= command.id %>",
|
|
3471
|
+
"<%= config.bin %> <%= command.id %> --json"
|
|
3329
3472
|
],
|
|
3330
3473
|
"flags": {
|
|
3331
3474
|
"json": {
|
|
3332
|
-
"description": "
|
|
3333
|
-
"helpGroup": "GLOBAL",
|
|
3475
|
+
"description": "Return structured rows for agent consumption",
|
|
3334
3476
|
"name": "json",
|
|
3335
3477
|
"allowNo": false,
|
|
3336
3478
|
"type": "boolean"
|
|
@@ -3377,17 +3519,11 @@
|
|
|
3377
3519
|
"hasDynamicHelp": false,
|
|
3378
3520
|
"multiple": false,
|
|
3379
3521
|
"type": "option"
|
|
3380
|
-
},
|
|
3381
|
-
"force": {
|
|
3382
|
-
"description": "Skip the evals_2d > 0 safety gate (useful when telemetry is delayed but you know the flag is dead)",
|
|
3383
|
-
"name": "force",
|
|
3384
|
-
"allowNo": false,
|
|
3385
|
-
"type": "boolean"
|
|
3386
3522
|
}
|
|
3387
3523
|
},
|
|
3388
3524
|
"hasDynamicHelp": false,
|
|
3389
3525
|
"hiddenAliases": [],
|
|
3390
|
-
"id": "cleanup:
|
|
3526
|
+
"id": "cleanup:list",
|
|
3391
3527
|
"pluginAlias": "@quonfig/cli",
|
|
3392
3528
|
"pluginName": "@quonfig/cli",
|
|
3393
3529
|
"pluginType": "core",
|
|
@@ -3398,10 +3534,10 @@
|
|
|
3398
3534
|
"dist",
|
|
3399
3535
|
"commands",
|
|
3400
3536
|
"cleanup",
|
|
3401
|
-
"
|
|
3537
|
+
"list.js"
|
|
3402
3538
|
]
|
|
3403
3539
|
},
|
|
3404
|
-
"cleanup:
|
|
3540
|
+
"cleanup:remove": {
|
|
3405
3541
|
"aliases": [],
|
|
3406
3542
|
"args": {
|
|
3407
3543
|
"name": {
|
|
@@ -3409,14 +3545,16 @@
|
|
|
3409
3545
|
"name": "name"
|
|
3410
3546
|
}
|
|
3411
3547
|
},
|
|
3412
|
-
"description": "
|
|
3548
|
+
"description": "Write a cleanup payload for a ready-for-cleanup flag and hand off to the Quonfig agent skill.\n\nModeled on `qfg migrate my-code` — this command never edits source files\nitself. It validates that the flag is marked readyForCleanup=true, refuses to\nproceed if there are still evals_2d > 0 (use --force to override), writes\n`.qf/cleanup/<key>.json` describing the flag's current rule shape +\ntelemetry, and prints how to have your coding agent remove the call sites with\nthe quonfig agent skill (its references/retire-a-flag.md), which asks the\nengineer which value should \"win\" and applies the inlining. Install the skill\nwith `qfg agent install-skill` or `claude plugin install quonfig@quonfig`.\n\nThe payload deliberately does NOT suggest a winning value; that's the\nengineer's call. Run `qfg cleanup status <key>` first if you want to inspect\ntelemetry before retiring.",
|
|
3413
3549
|
"examples": [
|
|
3414
3550
|
"<%= config.bin %> <%= command.id %> my.flag.key",
|
|
3551
|
+
"<%= config.bin %> <%= command.id %> my.flag.key --force",
|
|
3415
3552
|
"<%= config.bin %> <%= command.id %> my.flag.key --json"
|
|
3416
3553
|
],
|
|
3417
3554
|
"flags": {
|
|
3418
3555
|
"json": {
|
|
3419
|
-
"description": "
|
|
3556
|
+
"description": "Format output as json.",
|
|
3557
|
+
"helpGroup": "GLOBAL",
|
|
3420
3558
|
"name": "json",
|
|
3421
3559
|
"allowNo": false,
|
|
3422
3560
|
"type": "boolean"
|
|
@@ -3463,11 +3601,17 @@
|
|
|
3463
3601
|
"hasDynamicHelp": false,
|
|
3464
3602
|
"multiple": false,
|
|
3465
3603
|
"type": "option"
|
|
3604
|
+
},
|
|
3605
|
+
"force": {
|
|
3606
|
+
"description": "Skip the evals_2d > 0 safety gate (useful when telemetry is delayed but you know the flag is dead)",
|
|
3607
|
+
"name": "force",
|
|
3608
|
+
"allowNo": false,
|
|
3609
|
+
"type": "boolean"
|
|
3466
3610
|
}
|
|
3467
3611
|
},
|
|
3468
3612
|
"hasDynamicHelp": false,
|
|
3469
3613
|
"hiddenAliases": [],
|
|
3470
|
-
"id": "cleanup:
|
|
3614
|
+
"id": "cleanup:remove",
|
|
3471
3615
|
"pluginAlias": "@quonfig/cli",
|
|
3472
3616
|
"pluginName": "@quonfig/cli",
|
|
3473
3617
|
"pluginType": "core",
|
|
@@ -3478,10 +3622,10 @@
|
|
|
3478
3622
|
"dist",
|
|
3479
3623
|
"commands",
|
|
3480
3624
|
"cleanup",
|
|
3481
|
-
"
|
|
3625
|
+
"remove.js"
|
|
3482
3626
|
]
|
|
3483
3627
|
},
|
|
3484
|
-
"cleanup:
|
|
3628
|
+
"cleanup:status": {
|
|
3485
3629
|
"aliases": [],
|
|
3486
3630
|
"args": {
|
|
3487
3631
|
"name": {
|
|
@@ -3489,12 +3633,10 @@
|
|
|
3489
3633
|
"name": "name"
|
|
3490
3634
|
}
|
|
3491
3635
|
},
|
|
3492
|
-
"description": "
|
|
3636
|
+
"description": "Drill into one ready-for-cleanup flag — show telemetry across all environments and the current rule shape.\n\nUse this after `qfg cleanup list` to inspect a specific flag before handing\nremoval off to the Quonfig agent skill. The eval counts come from\nanalytics.configSparklines (the same backing data the per-flag sparklines on\nthe flag detail page use), summed into 24h/2d/7d/30d windows so you can decide\nwhether it's safe to retire.\n\nPass --json for the structured object including the full rule shape per\nenvironment — the agent skill consumes this directly.",
|
|
3493
3637
|
"examples": [
|
|
3494
3638
|
"<%= config.bin %> <%= command.id %> my.flag.key",
|
|
3495
|
-
"<%= config.bin %> <%= command.id %> my.flag.key --
|
|
3496
|
-
"<%= config.bin %> <%= command.id %> my.flag.key --json",
|
|
3497
|
-
"<%= config.bin %> <%= command.id %> my.flag.key && <%= config.bin %> delete my.flag.key"
|
|
3639
|
+
"<%= config.bin %> <%= command.id %> my.flag.key --json"
|
|
3498
3640
|
],
|
|
3499
3641
|
"flags": {
|
|
3500
3642
|
"json": {
|
|
@@ -3545,19 +3687,11 @@
|
|
|
3545
3687
|
"hasDynamicHelp": false,
|
|
3546
3688
|
"multiple": false,
|
|
3547
3689
|
"type": "option"
|
|
3548
|
-
},
|
|
3549
|
-
"days": {
|
|
3550
|
-
"description": "Number of trailing calendar days that must have zero evals",
|
|
3551
|
-
"name": "days",
|
|
3552
|
-
"default": 7,
|
|
3553
|
-
"hasDynamicHelp": false,
|
|
3554
|
-
"multiple": false,
|
|
3555
|
-
"type": "option"
|
|
3556
3690
|
}
|
|
3557
3691
|
},
|
|
3558
3692
|
"hasDynamicHelp": false,
|
|
3559
3693
|
"hiddenAliases": [],
|
|
3560
|
-
"id": "cleanup:
|
|
3694
|
+
"id": "cleanup:status",
|
|
3561
3695
|
"pluginAlias": "@quonfig/cli",
|
|
3562
3696
|
"pluginName": "@quonfig/cli",
|
|
3563
3697
|
"pluginType": "core",
|
|
@@ -3568,33 +3702,27 @@
|
|
|
3568
3702
|
"dist",
|
|
3569
3703
|
"commands",
|
|
3570
3704
|
"cleanup",
|
|
3571
|
-
"
|
|
3705
|
+
"status.js"
|
|
3572
3706
|
]
|
|
3573
3707
|
},
|
|
3574
|
-
"
|
|
3708
|
+
"cleanup:verify": {
|
|
3575
3709
|
"aliases": [],
|
|
3576
3710
|
"args": {
|
|
3577
|
-
"
|
|
3578
|
-
"description": "
|
|
3579
|
-
"name": "
|
|
3580
|
-
"required": true
|
|
3581
|
-
},
|
|
3582
|
-
"query": {
|
|
3583
|
-
"description": "Case-insensitive text matched against each context key and its reported properties (e.g. a name)",
|
|
3584
|
-
"name": "query",
|
|
3585
|
-
"required": true
|
|
3711
|
+
"name": {
|
|
3712
|
+
"description": "config/feature-flag/etc. name",
|
|
3713
|
+
"name": "name"
|
|
3586
3714
|
}
|
|
3587
3715
|
},
|
|
3588
|
-
"description": "
|
|
3716
|
+
"description": "Confirm zero evals for a flag in the trailing N days (default 7). Exits 0 if safe to delete, non-zero otherwise.\n\nRead-only gate intended for chaining with `qfg delete` after a cleanup PR\nhas merged and the SDK has redeployed:\n\n qfg cleanup verify my.flag.key && qfg delete my.flag.key\n\nThe trailing window is stricter than the `qfg cleanup remove` 2-day gate on\npurpose — `remove` only writes a payload describing the flag, but `delete`\npermanently removes the flag definition, so we want a longer quiet period\nbefore chaining. Bump --days N if you want a more conservative window.",
|
|
3589
3717
|
"examples": [
|
|
3590
|
-
"<%= config.bin %> <%= command.id %>
|
|
3591
|
-
"<%= config.bin %> <%= command.id %>
|
|
3592
|
-
"<%= config.bin %> <%= command.id %>
|
|
3718
|
+
"<%= config.bin %> <%= command.id %> my.flag.key",
|
|
3719
|
+
"<%= config.bin %> <%= command.id %> my.flag.key --days 14",
|
|
3720
|
+
"<%= config.bin %> <%= command.id %> my.flag.key --json",
|
|
3721
|
+
"<%= config.bin %> <%= command.id %> my.flag.key && <%= config.bin %> delete my.flag.key"
|
|
3593
3722
|
],
|
|
3594
3723
|
"flags": {
|
|
3595
3724
|
"json": {
|
|
3596
|
-
"description": "
|
|
3597
|
-
"helpGroup": "GLOBAL",
|
|
3725
|
+
"description": "Return structured object for agent consumption",
|
|
3598
3726
|
"name": "json",
|
|
3599
3727
|
"allowNo": false,
|
|
3600
3728
|
"type": "boolean"
|
|
@@ -3642,17 +3770,10 @@
|
|
|
3642
3770
|
"multiple": false,
|
|
3643
3771
|
"type": "option"
|
|
3644
3772
|
},
|
|
3645
|
-
"
|
|
3646
|
-
"description": "
|
|
3647
|
-
"name": "
|
|
3648
|
-
"
|
|
3649
|
-
"multiple": false,
|
|
3650
|
-
"type": "option"
|
|
3651
|
-
},
|
|
3652
|
-
"limit": {
|
|
3653
|
-
"description": "Maximum number of matches (1-100)",
|
|
3654
|
-
"name": "limit",
|
|
3655
|
-
"default": 20,
|
|
3773
|
+
"days": {
|
|
3774
|
+
"description": "Number of trailing calendar days that must have zero evals",
|
|
3775
|
+
"name": "days",
|
|
3776
|
+
"default": 7,
|
|
3656
3777
|
"hasDynamicHelp": false,
|
|
3657
3778
|
"multiple": false,
|
|
3658
3779
|
"type": "option"
|
|
@@ -3660,7 +3781,7 @@
|
|
|
3660
3781
|
},
|
|
3661
3782
|
"hasDynamicHelp": false,
|
|
3662
3783
|
"hiddenAliases": [],
|
|
3663
|
-
"id": "
|
|
3784
|
+
"id": "cleanup:verify",
|
|
3664
3785
|
"pluginAlias": "@quonfig/cli",
|
|
3665
3786
|
"pluginName": "@quonfig/cli",
|
|
3666
3787
|
"pluginType": "core",
|
|
@@ -3670,8 +3791,8 @@
|
|
|
3670
3791
|
"relativePath": [
|
|
3671
3792
|
"dist",
|
|
3672
3793
|
"commands",
|
|
3673
|
-
"
|
|
3674
|
-
"
|
|
3794
|
+
"cleanup",
|
|
3795
|
+
"verify.js"
|
|
3675
3796
|
]
|
|
3676
3797
|
},
|
|
3677
3798
|
"migrate:doctor": {
|
|
@@ -4383,5 +4504,5 @@
|
|
|
4383
4504
|
]
|
|
4384
4505
|
}
|
|
4385
4506
|
},
|
|
4386
|
-
"version": "0.
|
|
4507
|
+
"version": "0.6.0"
|
|
4387
4508
|
}
|