@quonfig/cli 0.3.0 → 0.4.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 +53 -53
- package/dist/commands/config-schema.js +6 -6
- package/dist/verify/validate.js +50 -2
- package/dist/verify/value-grammar.d.ts +7 -0
- package/dist/verify/value-grammar.js +52 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/oclif.manifest.json +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -17,7 +17,7 @@ $ npm install -g @quonfig/cli
|
|
|
17
17
|
$ qfg COMMAND
|
|
18
18
|
running command...
|
|
19
19
|
$ qfg (--version)
|
|
20
|
-
@quonfig/cli/0.
|
|
20
|
+
@quonfig/cli/0.4.0 linux-x64 node-v24.4.1
|
|
21
21
|
$ qfg --help [COMMAND]
|
|
22
22
|
USAGE
|
|
23
23
|
$ qfg COMMAND
|
|
@@ -204,7 +204,7 @@ EXAMPLES
|
|
|
204
204
|
$ qfg activity restore my.flag --yes
|
|
205
205
|
```
|
|
206
206
|
|
|
207
|
-
_See code: [src/commands/activity.ts](https://github.com/quonfig/cli/blob/v0.
|
|
207
|
+
_See code: [src/commands/activity.ts](https://github.com/quonfig/cli/blob/v0.4.0/src/commands/activity.ts)_
|
|
208
208
|
|
|
209
209
|
## `qfg activity deleted`
|
|
210
210
|
|
|
@@ -233,7 +233,7 @@ EXAMPLES
|
|
|
233
233
|
$ qfg activity deleted --json
|
|
234
234
|
```
|
|
235
235
|
|
|
236
|
-
_See code: [src/commands/activity/deleted.ts](https://github.com/quonfig/cli/blob/v0.
|
|
236
|
+
_See code: [src/commands/activity/deleted.ts](https://github.com/quonfig/cli/blob/v0.4.0/src/commands/activity/deleted.ts)_
|
|
237
237
|
|
|
238
238
|
## `qfg activity feed`
|
|
239
239
|
|
|
@@ -268,7 +268,7 @@ EXAMPLES
|
|
|
268
268
|
$ qfg activity feed --json
|
|
269
269
|
```
|
|
270
270
|
|
|
271
|
-
_See code: [src/commands/activity/feed.ts](https://github.com/quonfig/cli/blob/v0.
|
|
271
|
+
_See code: [src/commands/activity/feed.ts](https://github.com/quonfig/cli/blob/v0.4.0/src/commands/activity/feed.ts)_
|
|
272
272
|
|
|
273
273
|
## `qfg activity history [NAME]`
|
|
274
274
|
|
|
@@ -302,7 +302,7 @@ EXAMPLES
|
|
|
302
302
|
$ qfg activity history request.timeout --json
|
|
303
303
|
```
|
|
304
304
|
|
|
305
|
-
_See code: [src/commands/activity/history.ts](https://github.com/quonfig/cli/blob/v0.
|
|
305
|
+
_See code: [src/commands/activity/history.ts](https://github.com/quonfig/cli/blob/v0.4.0/src/commands/activity/history.ts)_
|
|
306
306
|
|
|
307
307
|
## `qfg activity restore [NAME]`
|
|
308
308
|
|
|
@@ -341,7 +341,7 @@ EXAMPLES
|
|
|
341
341
|
$ qfg activity restore request.timeout --type config --yes
|
|
342
342
|
```
|
|
343
343
|
|
|
344
|
-
_See code: [src/commands/activity/restore.ts](https://github.com/quonfig/cli/blob/v0.
|
|
344
|
+
_See code: [src/commands/activity/restore.ts](https://github.com/quonfig/cli/blob/v0.4.0/src/commands/activity/restore.ts)_
|
|
345
345
|
|
|
346
346
|
## `qfg agent install-skill`
|
|
347
347
|
|
|
@@ -386,7 +386,7 @@ EXAMPLES
|
|
|
386
386
|
$ qfg agent install-skill --force
|
|
387
387
|
```
|
|
388
388
|
|
|
389
|
-
_See code: [src/commands/agent/install-skill.ts](https://github.com/quonfig/cli/blob/v0.
|
|
389
|
+
_See code: [src/commands/agent/install-skill.ts](https://github.com/quonfig/cli/blob/v0.4.0/src/commands/agent/install-skill.ts)_
|
|
390
390
|
|
|
391
391
|
## `qfg audit-log [NAME]`
|
|
392
392
|
|
|
@@ -414,7 +414,7 @@ EXAMPLES
|
|
|
414
414
|
$ qfg audit-log my.flag
|
|
415
415
|
```
|
|
416
416
|
|
|
417
|
-
_See code: [src/commands/audit-log.ts](https://github.com/quonfig/cli/blob/v0.
|
|
417
|
+
_See code: [src/commands/audit-log.ts](https://github.com/quonfig/cli/blob/v0.4.0/src/commands/audit-log.ts)_
|
|
418
418
|
|
|
419
419
|
## `qfg cleanup`
|
|
420
420
|
|
|
@@ -456,7 +456,7 @@ EXAMPLES
|
|
|
456
456
|
$ qfg cleanup status my.flag.key
|
|
457
457
|
```
|
|
458
458
|
|
|
459
|
-
_See code: [src/commands/cleanup.ts](https://github.com/quonfig/cli/blob/v0.
|
|
459
|
+
_See code: [src/commands/cleanup.ts](https://github.com/quonfig/cli/blob/v0.4.0/src/commands/cleanup.ts)_
|
|
460
460
|
|
|
461
461
|
## `qfg cleanup list`
|
|
462
462
|
|
|
@@ -503,7 +503,7 @@ EXAMPLES
|
|
|
503
503
|
$ qfg cleanup list --json
|
|
504
504
|
```
|
|
505
505
|
|
|
506
|
-
_See code: [src/commands/cleanup/list.ts](https://github.com/quonfig/cli/blob/v0.
|
|
506
|
+
_See code: [src/commands/cleanup/list.ts](https://github.com/quonfig/cli/blob/v0.4.0/src/commands/cleanup/list.ts)_
|
|
507
507
|
|
|
508
508
|
## `qfg cleanup remove [NAME]`
|
|
509
509
|
|
|
@@ -550,7 +550,7 @@ EXAMPLES
|
|
|
550
550
|
$ qfg cleanup remove my.flag.key --json
|
|
551
551
|
```
|
|
552
552
|
|
|
553
|
-
_See code: [src/commands/cleanup/remove.ts](https://github.com/quonfig/cli/blob/v0.
|
|
553
|
+
_See code: [src/commands/cleanup/remove.ts](https://github.com/quonfig/cli/blob/v0.4.0/src/commands/cleanup/remove.ts)_
|
|
554
554
|
|
|
555
555
|
## `qfg cleanup status [NAME]`
|
|
556
556
|
|
|
@@ -590,7 +590,7 @@ EXAMPLES
|
|
|
590
590
|
$ qfg cleanup status my.flag.key --json
|
|
591
591
|
```
|
|
592
592
|
|
|
593
|
-
_See code: [src/commands/cleanup/status.ts](https://github.com/quonfig/cli/blob/v0.
|
|
593
|
+
_See code: [src/commands/cleanup/status.ts](https://github.com/quonfig/cli/blob/v0.4.0/src/commands/cleanup/status.ts)_
|
|
594
594
|
|
|
595
595
|
## `qfg cleanup verify [NAME]`
|
|
596
596
|
|
|
@@ -636,7 +636,7 @@ EXAMPLES
|
|
|
636
636
|
$ qfg cleanup verify my.flag.key && qfg delete my.flag.key
|
|
637
637
|
```
|
|
638
638
|
|
|
639
|
-
_See code: [src/commands/cleanup/verify.ts](https://github.com/quonfig/cli/blob/v0.
|
|
639
|
+
_See code: [src/commands/cleanup/verify.ts](https://github.com/quonfig/cli/blob/v0.4.0/src/commands/cleanup/verify.ts)_
|
|
640
640
|
|
|
641
641
|
## `qfg config-schema`
|
|
642
642
|
|
|
@@ -665,7 +665,7 @@ EXAMPLES
|
|
|
665
665
|
$ qfg config-schema --json-schema # full JSON Schema document (copy into your editor)
|
|
666
666
|
```
|
|
667
667
|
|
|
668
|
-
_See code: [src/commands/config-schema.ts](https://github.com/quonfig/cli/blob/v0.
|
|
668
|
+
_See code: [src/commands/config-schema.ts](https://github.com/quonfig/cli/blob/v0.4.0/src/commands/config-schema.ts)_
|
|
669
669
|
|
|
670
670
|
## `qfg contexts`
|
|
671
671
|
|
|
@@ -688,7 +688,7 @@ EXAMPLES
|
|
|
688
688
|
$ qfg contexts search organization formhealth
|
|
689
689
|
```
|
|
690
690
|
|
|
691
|
-
_See code: [src/commands/contexts.ts](https://github.com/quonfig/cli/blob/v0.
|
|
691
|
+
_See code: [src/commands/contexts.ts](https://github.com/quonfig/cli/blob/v0.4.0/src/commands/contexts.ts)_
|
|
692
692
|
|
|
693
693
|
## `qfg contexts search CONTEXTTYPE QUERY`
|
|
694
694
|
|
|
@@ -740,7 +740,7 @@ EXAMPLES
|
|
|
740
740
|
$ qfg contexts search organization formhealth --json
|
|
741
741
|
```
|
|
742
742
|
|
|
743
|
-
_See code: [src/commands/contexts/search.ts](https://github.com/quonfig/cli/blob/v0.
|
|
743
|
+
_See code: [src/commands/contexts/search.ts](https://github.com/quonfig/cli/blob/v0.4.0/src/commands/contexts/search.ts)_
|
|
744
744
|
|
|
745
745
|
## `qfg create NAME`
|
|
746
746
|
|
|
@@ -827,7 +827,7 @@ EXAMPLES
|
|
|
827
827
|
$ qfg set-rollout my.new.flag --environment production --true-percent 20
|
|
828
828
|
```
|
|
829
829
|
|
|
830
|
-
_See code: [src/commands/create.ts](https://github.com/quonfig/cli/blob/v0.
|
|
830
|
+
_See code: [src/commands/create.ts](https://github.com/quonfig/cli/blob/v0.4.0/src/commands/create.ts)_
|
|
831
831
|
|
|
832
832
|
## `qfg delete NAME`
|
|
833
833
|
|
|
@@ -873,7 +873,7 @@ EXAMPLES
|
|
|
873
873
|
$ qfg delete my.config --yes
|
|
874
874
|
```
|
|
875
875
|
|
|
876
|
-
_See code: [src/commands/delete.ts](https://github.com/quonfig/cli/blob/v0.
|
|
876
|
+
_See code: [src/commands/delete.ts](https://github.com/quonfig/cli/blob/v0.4.0/src/commands/delete.ts)_
|
|
877
877
|
|
|
878
878
|
## `qfg flag info [NAME]`
|
|
879
879
|
|
|
@@ -1077,7 +1077,7 @@ EXAMPLES
|
|
|
1077
1077
|
$ qfg generate --targets node-ts -o ./dist # combine with targets
|
|
1078
1078
|
```
|
|
1079
1079
|
|
|
1080
|
-
_See code: [src/commands/generate.ts](https://github.com/quonfig/cli/blob/v0.
|
|
1080
|
+
_See code: [src/commands/generate.ts](https://github.com/quonfig/cli/blob/v0.4.0/src/commands/generate.ts)_
|
|
1081
1081
|
|
|
1082
1082
|
## `qfg generate-new-hex-key`
|
|
1083
1083
|
|
|
@@ -1100,7 +1100,7 @@ EXAMPLES
|
|
|
1100
1100
|
$ qfg generate-new-hex-key
|
|
1101
1101
|
```
|
|
1102
1102
|
|
|
1103
|
-
_See code: [src/commands/generate-new-hex-key.ts](https://github.com/quonfig/cli/blob/v0.
|
|
1103
|
+
_See code: [src/commands/generate-new-hex-key.ts](https://github.com/quonfig/cli/blob/v0.4.0/src/commands/generate-new-hex-key.ts)_
|
|
1104
1104
|
|
|
1105
1105
|
## `qfg get [NAME]`
|
|
1106
1106
|
|
|
@@ -1132,7 +1132,7 @@ EXAMPLES
|
|
|
1132
1132
|
$ qfg get my.config.name --environment=production
|
|
1133
1133
|
```
|
|
1134
1134
|
|
|
1135
|
-
_See code: [src/commands/get.ts](https://github.com/quonfig/cli/blob/v0.
|
|
1135
|
+
_See code: [src/commands/get.ts](https://github.com/quonfig/cli/blob/v0.4.0/src/commands/get.ts)_
|
|
1136
1136
|
|
|
1137
1137
|
## `qfg history NAME`
|
|
1138
1138
|
|
|
@@ -1158,7 +1158,7 @@ EXAMPLES
|
|
|
1158
1158
|
$ qfg history my.flag
|
|
1159
1159
|
```
|
|
1160
1160
|
|
|
1161
|
-
_See code: [src/commands/history.ts](https://github.com/quonfig/cli/blob/v0.
|
|
1161
|
+
_See code: [src/commands/history.ts](https://github.com/quonfig/cli/blob/v0.4.0/src/commands/history.ts)_
|
|
1162
1162
|
|
|
1163
1163
|
## `qfg info [NAME]`
|
|
1164
1164
|
|
|
@@ -1206,7 +1206,7 @@ EXAMPLES
|
|
|
1206
1206
|
$ qfg info my.config.name --exclude-evaluations # skip 24h stats
|
|
1207
1207
|
```
|
|
1208
1208
|
|
|
1209
|
-
_See code: [src/commands/info.ts](https://github.com/quonfig/cli/blob/v0.
|
|
1209
|
+
_See code: [src/commands/info.ts](https://github.com/quonfig/cli/blob/v0.4.0/src/commands/info.ts)_
|
|
1210
1210
|
|
|
1211
1211
|
## `qfg init [DIRECTORY]`
|
|
1212
1212
|
|
|
@@ -1246,7 +1246,7 @@ EXAMPLES
|
|
|
1246
1246
|
$ qfg init --dry-run
|
|
1247
1247
|
```
|
|
1248
1248
|
|
|
1249
|
-
_See code: [src/commands/init.ts](https://github.com/quonfig/cli/blob/v0.
|
|
1249
|
+
_See code: [src/commands/init.ts](https://github.com/quonfig/cli/blob/v0.4.0/src/commands/init.ts)_
|
|
1250
1250
|
|
|
1251
1251
|
## `qfg interactive`
|
|
1252
1252
|
|
|
@@ -1276,7 +1276,7 @@ EXAMPLES
|
|
|
1276
1276
|
$ qfg
|
|
1277
1277
|
```
|
|
1278
1278
|
|
|
1279
|
-
_See code: [src/commands/interactive.ts](https://github.com/quonfig/cli/blob/v0.
|
|
1279
|
+
_See code: [src/commands/interactive.ts](https://github.com/quonfig/cli/blob/v0.4.0/src/commands/interactive.ts)_
|
|
1280
1280
|
|
|
1281
1281
|
## `qfg list`
|
|
1282
1282
|
|
|
@@ -1316,7 +1316,7 @@ EXAMPLES
|
|
|
1316
1316
|
$ qfg list --feature-flags
|
|
1317
1317
|
```
|
|
1318
1318
|
|
|
1319
|
-
_See code: [src/commands/list.ts](https://github.com/quonfig/cli/blob/v0.
|
|
1319
|
+
_See code: [src/commands/list.ts](https://github.com/quonfig/cli/blob/v0.4.0/src/commands/list.ts)_
|
|
1320
1320
|
|
|
1321
1321
|
## `qfg log`
|
|
1322
1322
|
|
|
@@ -1341,7 +1341,7 @@ EXAMPLES
|
|
|
1341
1341
|
$ qfg log --limit 5
|
|
1342
1342
|
```
|
|
1343
1343
|
|
|
1344
|
-
_See code: [src/commands/log.ts](https://github.com/quonfig/cli/blob/v0.
|
|
1344
|
+
_See code: [src/commands/log.ts](https://github.com/quonfig/cli/blob/v0.4.0/src/commands/log.ts)_
|
|
1345
1345
|
|
|
1346
1346
|
## `qfg log-level NAME`
|
|
1347
1347
|
|
|
@@ -1406,7 +1406,7 @@ EXAMPLES
|
|
|
1406
1406
|
$ qfg log-level log-level.my-app --target=Chatty --value=INFO --environment=production
|
|
1407
1407
|
```
|
|
1408
1408
|
|
|
1409
|
-
_See code: [src/commands/log-level.ts](https://github.com/quonfig/cli/blob/v0.
|
|
1409
|
+
_See code: [src/commands/log-level.ts](https://github.com/quonfig/cli/blob/v0.4.0/src/commands/log-level.ts)_
|
|
1410
1410
|
|
|
1411
1411
|
## `qfg login`
|
|
1412
1412
|
|
|
@@ -1431,7 +1431,7 @@ EXAMPLES
|
|
|
1431
1431
|
$ qfg login --profile myprofile
|
|
1432
1432
|
```
|
|
1433
1433
|
|
|
1434
|
-
_See code: [src/commands/login.ts](https://github.com/quonfig/cli/blob/v0.
|
|
1434
|
+
_See code: [src/commands/login.ts](https://github.com/quonfig/cli/blob/v0.4.0/src/commands/login.ts)_
|
|
1435
1435
|
|
|
1436
1436
|
## `qfg logout`
|
|
1437
1437
|
|
|
@@ -1454,7 +1454,7 @@ EXAMPLES
|
|
|
1454
1454
|
$ qfg logout
|
|
1455
1455
|
```
|
|
1456
1456
|
|
|
1457
|
-
_See code: [src/commands/logout.ts](https://github.com/quonfig/cli/blob/v0.
|
|
1457
|
+
_See code: [src/commands/logout.ts](https://github.com/quonfig/cli/blob/v0.4.0/src/commands/logout.ts)_
|
|
1458
1458
|
|
|
1459
1459
|
## `qfg migrate`
|
|
1460
1460
|
|
|
@@ -1519,7 +1519,7 @@ EXAMPLES
|
|
|
1519
1519
|
$ qfg migrate --from launch --source-api-key $LAUNCH_API_KEY --dir ./quonfig-repo --staging
|
|
1520
1520
|
```
|
|
1521
1521
|
|
|
1522
|
-
_See code: [src/commands/migrate.ts](https://github.com/quonfig/cli/blob/v0.
|
|
1522
|
+
_See code: [src/commands/migrate.ts](https://github.com/quonfig/cli/blob/v0.4.0/src/commands/migrate.ts)_
|
|
1523
1523
|
|
|
1524
1524
|
## `qfg migrate doctor`
|
|
1525
1525
|
|
|
@@ -1557,7 +1557,7 @@ EXAMPLES
|
|
|
1557
1557
|
$ qfg migrate doctor --json
|
|
1558
1558
|
```
|
|
1559
1559
|
|
|
1560
|
-
_See code: [src/commands/migrate/doctor.ts](https://github.com/quonfig/cli/blob/v0.
|
|
1560
|
+
_See code: [src/commands/migrate/doctor.ts](https://github.com/quonfig/cli/blob/v0.4.0/src/commands/migrate/doctor.ts)_
|
|
1561
1561
|
|
|
1562
1562
|
## `qfg migrate my-code`
|
|
1563
1563
|
|
|
@@ -1589,7 +1589,7 @@ EXAMPLES
|
|
|
1589
1589
|
$ qfg migrate my-code --dry-run
|
|
1590
1590
|
```
|
|
1591
1591
|
|
|
1592
|
-
_See code: [src/commands/migrate/my-code.ts](https://github.com/quonfig/cli/blob/v0.
|
|
1592
|
+
_See code: [src/commands/migrate/my-code.ts](https://github.com/quonfig/cli/blob/v0.4.0/src/commands/migrate/my-code.ts)_
|
|
1593
1593
|
|
|
1594
1594
|
## `qfg migrate status`
|
|
1595
1595
|
|
|
@@ -1620,7 +1620,7 @@ EXAMPLES
|
|
|
1620
1620
|
$ qfg migrate status --json
|
|
1621
1621
|
```
|
|
1622
1622
|
|
|
1623
|
-
_See code: [src/commands/migrate/status.ts](https://github.com/quonfig/cli/blob/v0.
|
|
1623
|
+
_See code: [src/commands/migrate/status.ts](https://github.com/quonfig/cli/blob/v0.4.0/src/commands/migrate/status.ts)_
|
|
1624
1624
|
|
|
1625
1625
|
## `qfg override [NAME] [VALUE]`
|
|
1626
1626
|
|
|
@@ -1675,7 +1675,7 @@ EXAMPLES
|
|
|
1675
1675
|
$ qfg override my.flag true --env=staging
|
|
1676
1676
|
```
|
|
1677
1677
|
|
|
1678
|
-
_See code: [src/commands/override.ts](https://github.com/quonfig/cli/blob/v0.
|
|
1678
|
+
_See code: [src/commands/override.ts](https://github.com/quonfig/cli/blob/v0.4.0/src/commands/override.ts)_
|
|
1679
1679
|
|
|
1680
1680
|
## `qfg pull`
|
|
1681
1681
|
|
|
@@ -1722,7 +1722,7 @@ EXAMPLES
|
|
|
1722
1722
|
$ qfg pull # uses QUONFIG_DIR env var
|
|
1723
1723
|
```
|
|
1724
1724
|
|
|
1725
|
-
_See code: [src/commands/pull.ts](https://github.com/quonfig/cli/blob/v0.
|
|
1725
|
+
_See code: [src/commands/pull.ts](https://github.com/quonfig/cli/blob/v0.4.0/src/commands/pull.ts)_
|
|
1726
1726
|
|
|
1727
1727
|
## `qfg push`
|
|
1728
1728
|
|
|
@@ -1771,7 +1771,7 @@ EXAMPLES
|
|
|
1771
1771
|
$ qfg push --dir ./our-config --yes
|
|
1772
1772
|
```
|
|
1773
1773
|
|
|
1774
|
-
_See code: [src/commands/push.ts](https://github.com/quonfig/cli/blob/v0.
|
|
1774
|
+
_See code: [src/commands/push.ts](https://github.com/quonfig/cli/blob/v0.4.0/src/commands/push.ts)_
|
|
1775
1775
|
|
|
1776
1776
|
## `qfg run [COMMAND]`
|
|
1777
1777
|
|
|
@@ -1822,7 +1822,7 @@ EXAMPLES
|
|
|
1822
1822
|
$ qfg run --env DATABASE_URL=db.url --preserve-env --environment=staging -- npm test
|
|
1823
1823
|
```
|
|
1824
1824
|
|
|
1825
|
-
_See code: [src/commands/run.ts](https://github.com/quonfig/cli/blob/v0.
|
|
1825
|
+
_See code: [src/commands/run.ts](https://github.com/quonfig/cli/blob/v0.4.0/src/commands/run.ts)_
|
|
1826
1826
|
|
|
1827
1827
|
## `qfg schema NAME`
|
|
1828
1828
|
|
|
@@ -1860,7 +1860,7 @@ EXAMPLES
|
|
|
1860
1860
|
$ qfg schema my-schema --set-json-schema=@schemas/my-schema.json --protected
|
|
1861
1861
|
```
|
|
1862
1862
|
|
|
1863
|
-
_See code: [src/commands/schema.ts](https://github.com/quonfig/cli/blob/v0.
|
|
1863
|
+
_See code: [src/commands/schema.ts](https://github.com/quonfig/cli/blob/v0.4.0/src/commands/schema.ts)_
|
|
1864
1864
|
|
|
1865
1865
|
## `qfg sdk-key`
|
|
1866
1866
|
|
|
@@ -1887,7 +1887,7 @@ EXAMPLES
|
|
|
1887
1887
|
$ qfg sdk-key revoke <key-id>
|
|
1888
1888
|
```
|
|
1889
1889
|
|
|
1890
|
-
_See code: [src/commands/sdk-key.ts](https://github.com/quonfig/cli/blob/v0.
|
|
1890
|
+
_See code: [src/commands/sdk-key.ts](https://github.com/quonfig/cli/blob/v0.4.0/src/commands/sdk-key.ts)_
|
|
1891
1891
|
|
|
1892
1892
|
## `qfg sdk-key create`
|
|
1893
1893
|
|
|
@@ -1919,7 +1919,7 @@ EXAMPLES
|
|
|
1919
1919
|
$ qfg sdk-key create --environment staging --type browser
|
|
1920
1920
|
```
|
|
1921
1921
|
|
|
1922
|
-
_See code: [src/commands/sdk-key/create.ts](https://github.com/quonfig/cli/blob/v0.
|
|
1922
|
+
_See code: [src/commands/sdk-key/create.ts](https://github.com/quonfig/cli/blob/v0.4.0/src/commands/sdk-key/create.ts)_
|
|
1923
1923
|
|
|
1924
1924
|
## `qfg sdk-key list`
|
|
1925
1925
|
|
|
@@ -1948,7 +1948,7 @@ EXAMPLES
|
|
|
1948
1948
|
$ qfg sdk-key list --environment production
|
|
1949
1949
|
```
|
|
1950
1950
|
|
|
1951
|
-
_See code: [src/commands/sdk-key/list.ts](https://github.com/quonfig/cli/blob/v0.
|
|
1951
|
+
_See code: [src/commands/sdk-key/list.ts](https://github.com/quonfig/cli/blob/v0.4.0/src/commands/sdk-key/list.ts)_
|
|
1952
1952
|
|
|
1953
1953
|
## `qfg sdk-key revoke KEYID`
|
|
1954
1954
|
|
|
@@ -1975,7 +1975,7 @@ EXAMPLES
|
|
|
1975
1975
|
$ qfg sdk-key revoke a1b2c3d4-e5f6-7890-abcd-ef1234567890
|
|
1976
1976
|
```
|
|
1977
1977
|
|
|
1978
|
-
_See code: [src/commands/sdk-key/revoke.ts](https://github.com/quonfig/cli/blob/v0.
|
|
1978
|
+
_See code: [src/commands/sdk-key/revoke.ts](https://github.com/quonfig/cli/blob/v0.4.0/src/commands/sdk-key/revoke.ts)_
|
|
1979
1979
|
|
|
1980
1980
|
## `qfg serve`
|
|
1981
1981
|
|
|
@@ -2033,7 +2033,7 @@ EXAMPLES
|
|
|
2033
2033
|
$ qfg serve --port 6581 --frontend-sdk-key PUBLIC_KEY
|
|
2034
2034
|
```
|
|
2035
2035
|
|
|
2036
|
-
_See code: [src/commands/serve.ts](https://github.com/quonfig/cli/blob/v0.
|
|
2036
|
+
_See code: [src/commands/serve.ts](https://github.com/quonfig/cli/blob/v0.4.0/src/commands/serve.ts)_
|
|
2037
2037
|
|
|
2038
2038
|
## `qfg set-default [NAME]`
|
|
2039
2039
|
|
|
@@ -2113,7 +2113,7 @@ EXAMPLES
|
|
|
2113
2113
|
$ qfg pull && qfg config-schema
|
|
2114
2114
|
```
|
|
2115
2115
|
|
|
2116
|
-
_See code: [src/commands/set-default.ts](https://github.com/quonfig/cli/blob/v0.
|
|
2116
|
+
_See code: [src/commands/set-default.ts](https://github.com/quonfig/cli/blob/v0.4.0/src/commands/set-default.ts)_
|
|
2117
2117
|
|
|
2118
2118
|
## `qfg set-rollout [NAME]`
|
|
2119
2119
|
|
|
@@ -2204,7 +2204,7 @@ EXAMPLES
|
|
|
2204
2204
|
$ qfg set-rollout my.variant.flag --environment production --weights "a:33,b:33,c:34" --hash-by user.id
|
|
2205
2205
|
```
|
|
2206
2206
|
|
|
2207
|
-
_See code: [src/commands/set-rollout.ts](https://github.com/quonfig/cli/blob/v0.
|
|
2207
|
+
_See code: [src/commands/set-rollout.ts](https://github.com/quonfig/cli/blob/v0.4.0/src/commands/set-rollout.ts)_
|
|
2208
2208
|
|
|
2209
2209
|
## `qfg sync`
|
|
2210
2210
|
|
|
@@ -2236,7 +2236,7 @@ EXAMPLES
|
|
|
2236
2236
|
$ qfg sync --watch --dir ./our-config --interval 30
|
|
2237
2237
|
```
|
|
2238
2238
|
|
|
2239
|
-
_See code: [src/commands/sync.ts](https://github.com/quonfig/cli/blob/v0.
|
|
2239
|
+
_See code: [src/commands/sync.ts](https://github.com/quonfig/cli/blob/v0.4.0/src/commands/sync.ts)_
|
|
2240
2240
|
|
|
2241
2241
|
## `qfg toggle [NAME]`
|
|
2242
2242
|
|
|
@@ -2347,7 +2347,7 @@ EXAMPLES
|
|
|
2347
2347
|
$ qfg verify --json
|
|
2348
2348
|
```
|
|
2349
2349
|
|
|
2350
|
-
_See code: [src/commands/verify.ts](https://github.com/quonfig/cli/blob/v0.
|
|
2350
|
+
_See code: [src/commands/verify.ts](https://github.com/quonfig/cli/blob/v0.4.0/src/commands/verify.ts)_
|
|
2351
2351
|
|
|
2352
2352
|
## `qfg whoami`
|
|
2353
2353
|
|
|
@@ -2370,7 +2370,7 @@ EXAMPLES
|
|
|
2370
2370
|
$ qfg whoami
|
|
2371
2371
|
```
|
|
2372
2372
|
|
|
2373
|
-
_See code: [src/commands/whoami.ts](https://github.com/quonfig/cli/blob/v0.
|
|
2373
|
+
_See code: [src/commands/whoami.ts](https://github.com/quonfig/cli/blob/v0.4.0/src/commands/whoami.ts)_
|
|
2374
2374
|
|
|
2375
2375
|
## `qfg workspace`
|
|
2376
2376
|
|
|
@@ -2393,7 +2393,7 @@ EXAMPLES
|
|
|
2393
2393
|
$ qfg workspace
|
|
2394
2394
|
```
|
|
2395
2395
|
|
|
2396
|
-
_See code: [src/commands/workspace.ts](https://github.com/quonfig/cli/blob/v0.
|
|
2396
|
+
_See code: [src/commands/workspace.ts](https://github.com/quonfig/cli/blob/v0.4.0/src/commands/workspace.ts)_
|
|
2397
2397
|
|
|
2398
2398
|
## `qfg workspace bootstrap`
|
|
2399
2399
|
|
|
@@ -2426,7 +2426,7 @@ EXAMPLES
|
|
|
2426
2426
|
$ qfg workspace bootstrap --dir ./our-config --skip-validate
|
|
2427
2427
|
```
|
|
2428
2428
|
|
|
2429
|
-
_See code: [src/commands/workspace/bootstrap.ts](https://github.com/quonfig/cli/blob/v0.
|
|
2429
|
+
_See code: [src/commands/workspace/bootstrap.ts](https://github.com/quonfig/cli/blob/v0.4.0/src/commands/workspace/bootstrap.ts)_
|
|
2430
2430
|
|
|
2431
2431
|
## `qfg workspace create SLUG`
|
|
2432
2432
|
|
|
@@ -2460,7 +2460,7 @@ EXAMPLES
|
|
|
2460
2460
|
$ qfg workspace create my-team --org 11111111-1111-1111-1111-111111111111
|
|
2461
2461
|
```
|
|
2462
2462
|
|
|
2463
|
-
_See code: [src/commands/workspace/create.ts](https://github.com/quonfig/cli/blob/v0.
|
|
2463
|
+
_See code: [src/commands/workspace/create.ts](https://github.com/quonfig/cli/blob/v0.4.0/src/commands/workspace/create.ts)_
|
|
2464
2464
|
|
|
2465
2465
|
## `qfg workspace switch [SLUG]`
|
|
2466
2466
|
|
|
@@ -2488,7 +2488,7 @@ EXAMPLES
|
|
|
2488
2488
|
$ qfg workspace switch acme/production
|
|
2489
2489
|
```
|
|
2490
2490
|
|
|
2491
|
-
_See code: [src/commands/workspace/switch.ts](https://github.com/quonfig/cli/blob/v0.
|
|
2491
|
+
_See code: [src/commands/workspace/switch.ts](https://github.com/quonfig/cli/blob/v0.4.0/src/commands/workspace/switch.ts)_
|
|
2492
2492
|
<!-- commandsstop -->
|
|
2493
2493
|
|
|
2494
2494
|
## Local Development
|
|
@@ -112,18 +112,18 @@ OPERATOR REFERENCE
|
|
|
112
112
|
PROP_LESS_THAN_OR_EQUAL int or double
|
|
113
113
|
PROP_GREATER_THAN int or double
|
|
114
114
|
PROP_GREATER_THAN_OR_EQUAL int or double
|
|
115
|
-
PROP_SEMVER_LESS_THAN string semver comparison;
|
|
116
|
-
PROP_SEMVER_EQUAL string semver comparison;
|
|
117
|
-
PROP_SEMVER_GREATER_THAN string semver comparison;
|
|
118
|
-
PROP_BEFORE string (
|
|
119
|
-
PROP_AFTER string
|
|
115
|
+
PROP_SEMVER_LESS_THAN string semver comparison; SemVer 2.0 like "4.0.9" or "1.0.0-beta.1"; "4" / "4.1" read as 4.0.0 / 4.1.0; no "v"
|
|
116
|
+
PROP_SEMVER_EQUAL string semver comparison; same version grammar
|
|
117
|
+
PROP_SEMVER_GREATER_THAN string semver comparison; same version grammar
|
|
118
|
+
PROP_BEFORE int or string epoch ms (int) or RFC3339 with Z/offset, e.g. "2025-01-01T00:00:00Z"; no date-only
|
|
119
|
+
PROP_AFTER int or string same timestamp grammar
|
|
120
120
|
PROP_MATCHES string regex match
|
|
121
121
|
PROP_DOES_NOT_MATCH string
|
|
122
122
|
IS_PRESENT (none) propertyName is set on the evaluation context (no valueToMatch)
|
|
123
123
|
IS_NOT_PRESENT (none) propertyName is missing from the evaluation context (no valueToMatch)
|
|
124
124
|
IN_SEG string value = segment key (no propertyName needed)
|
|
125
125
|
NOT_IN_SEG string value = segment key (no propertyName needed)
|
|
126
|
-
IN_INT_RANGE int_range value = {
|
|
126
|
+
IN_INT_RANGE int_range value = {"start": 0, "end": 10}; [start, end); omit a bound for unbounded
|
|
127
127
|
LOOKUP_KEY_IN string_list matches if SDK lookup key is in the list
|
|
128
128
|
LOOKUP_KEY_NOT_IN string_list
|
|
129
129
|
|
package/dist/verify/validate.js
CHANGED
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
import { z } from 'zod';
|
|
29
29
|
import { findMapKeyOrderWarnings, navigate, scanOrderedJson } from './map-key-order.js';
|
|
30
30
|
import { compileSchema, validateAgainstSchema } from './schema-validator.js';
|
|
31
|
-
import { DURATION_FORMAT_HINT, isValidIsoDuration, parseDoubleValue, parseIntValue } from './value-grammar.js';
|
|
31
|
+
import { DURATION_FORMAT_HINT, INT_RANGE_FORMAT_HINT, isValidIntRange, isValidIsoDuration, isValidSemver, isValidTimestamp, parseDoubleValue, parseIntValue, SEMVER_FORMAT_HINT, TIMESTAMP_FORMAT_HINT, } from './value-grammar.js';
|
|
32
32
|
// Inlined to keep this directory self-contained for the standalone bun-compile
|
|
33
33
|
// build that runs as the qfg-verify pre-receive hook in app-gitea — that build
|
|
34
34
|
// only copies cli/src/verify/, so any out-of-tree imports break it. Source of
|
|
@@ -139,10 +139,14 @@ const WeightedValuesSchema = z.object({
|
|
|
139
139
|
}),
|
|
140
140
|
});
|
|
141
141
|
const RuleValueSchema = z.union([ValueSchema, WeightedValuesSchema]);
|
|
142
|
+
// IN_INT_RANGE's valueToMatch (qfg-goi1.5.9). Criterion-only: a config value
|
|
143
|
+
// can never be an int_range. Its shape is checked per operator below.
|
|
144
|
+
const IntRangeValueSchema = z.object({ type: z.literal('int_range'), value: z.unknown() });
|
|
145
|
+
const CriterionValueSchema = z.discriminatedUnion('type', [...ValueSchema.options, IntRangeValueSchema]);
|
|
142
146
|
const CriterionSchema = z.object({
|
|
143
147
|
propertyName: z.string().optional(),
|
|
144
148
|
operator: OperatorSchema,
|
|
145
|
-
valueToMatch:
|
|
149
|
+
valueToMatch: CriterionValueSchema.optional(),
|
|
146
150
|
});
|
|
147
151
|
const ConfigRuleSchema = z.object({
|
|
148
152
|
criteria: z.array(CriterionSchema),
|
|
@@ -1295,6 +1299,50 @@ function validateRules(rules, file, context, expectedValueType, issues, variants
|
|
|
1295
1299
|
severity: 'error',
|
|
1296
1300
|
});
|
|
1297
1301
|
}
|
|
1302
|
+
const shapeIssue = criterionValueShapeIssue(criterion);
|
|
1303
|
+
if (shapeIssue) {
|
|
1304
|
+
issues.push({
|
|
1305
|
+
file,
|
|
1306
|
+
message: `${critCtx}: operator "${criterion.operator}" ${shapeIssue.problem}`,
|
|
1307
|
+
severity: 'error',
|
|
1308
|
+
suggestion: shapeIssue.hint,
|
|
1309
|
+
});
|
|
1310
|
+
}
|
|
1311
|
+
}
|
|
1312
|
+
}
|
|
1313
|
+
}
|
|
1314
|
+
/**
|
|
1315
|
+
* The value shapes every SDK agrees to evaluate (qfg-goi1.5 R3-R5, Q5). A value
|
|
1316
|
+
* outside them is not an error in any SDK at eval time: the rule just never
|
|
1317
|
+
* matches, silently, and before qfg-goi1.5 some SDKs matched it anyway. Rejecting
|
|
1318
|
+
* at write time is the only place a human sees the mistake.
|
|
1319
|
+
*/
|
|
1320
|
+
function criterionValueShapeIssue(criterion) {
|
|
1321
|
+
const vtm = criterion.valueToMatch;
|
|
1322
|
+
if (!vtm)
|
|
1323
|
+
return undefined;
|
|
1324
|
+
const shown = JSON.stringify(vtm.value);
|
|
1325
|
+
switch (criterion.operator) {
|
|
1326
|
+
case 'IN_INT_RANGE': {
|
|
1327
|
+
if (vtm.type !== 'int_range' || !isValidIntRange(vtm.value))
|
|
1328
|
+
return { hint: INT_RANGE_FORMAT_HINT, problem: `needs an int_range value; got ${vtm.type} ${shown}` };
|
|
1329
|
+
return undefined;
|
|
1330
|
+
}
|
|
1331
|
+
case 'PROP_AFTER':
|
|
1332
|
+
case 'PROP_BEFORE': {
|
|
1333
|
+
if (!['double', 'int', 'string'].includes(vtm.type) || !isValidTimestamp(vtm.value))
|
|
1334
|
+
return { hint: TIMESTAMP_FORMAT_HINT, problem: `needs a timestamp; got ${vtm.type} ${shown}` };
|
|
1335
|
+
return undefined;
|
|
1336
|
+
}
|
|
1337
|
+
case 'PROP_SEMVER_EQUAL':
|
|
1338
|
+
case 'PROP_SEMVER_GREATER_THAN':
|
|
1339
|
+
case 'PROP_SEMVER_LESS_THAN': {
|
|
1340
|
+
if (vtm.type !== 'string' || !isValidSemver(vtm.value))
|
|
1341
|
+
return { hint: SEMVER_FORMAT_HINT, problem: `needs a version string; got ${vtm.type} ${shown}` };
|
|
1342
|
+
return undefined;
|
|
1343
|
+
}
|
|
1344
|
+
default: {
|
|
1345
|
+
return undefined;
|
|
1298
1346
|
}
|
|
1299
1347
|
}
|
|
1300
1348
|
}
|
|
@@ -11,3 +11,10 @@ export declare const DURATION_FORMAT_HINT = "Expected an ISO 8601 duration such
|
|
|
11
11
|
export declare const isValidIsoDuration: (value: string) => boolean;
|
|
12
12
|
export declare const parseIntValue: (value: string) => number | undefined;
|
|
13
13
|
export declare const parseDoubleValue: (value: string) => number | undefined;
|
|
14
|
+
export declare const TIMESTAMP_FORMAT_HINT = "Expected epoch milliseconds (a number or an all-digit string) or an RFC3339 timestamp with Z or an offset, such as 2025-01-01T00:00:00Z or 2025-01-01T09:00:00+09:00.";
|
|
15
|
+
export declare const isValidRfc3339: (value: string) => boolean;
|
|
16
|
+
export declare const isValidTimestamp: (value: unknown) => boolean;
|
|
17
|
+
export declare const SEMVER_FORMAT_HINT = "Expected a SemVer 2.0 version such as 4.0.18, 1.0.0-beta.1 or 1.0.0+build.5, or an abbreviated 4 / 4.1 (read as 4.0.0 / 4.1.0). No \"v\" prefix.";
|
|
18
|
+
export declare const isValidSemver: (value: unknown) => boolean;
|
|
19
|
+
export declare const INT_RANGE_FORMAT_HINT = "Expected {\"start\": <int>, \"end\": <int>} with at least one bound; the range is [start, end) and a missing bound is unbounded.";
|
|
20
|
+
export declare const isValidIntRange: (value: unknown) => boolean;
|
|
@@ -61,3 +61,55 @@ export const parseDoubleValue = (value) => {
|
|
|
61
61
|
const double = Number(value);
|
|
62
62
|
return Number.isFinite(double) ? double : undefined;
|
|
63
63
|
};
|
|
64
|
+
// The ONE timestamp grammar for PROP_BEFORE / PROP_AFTER (qfg-goi1.5 R5),
|
|
65
|
+
// identical on the criterion and context sides in every SDK: a JSON number
|
|
66
|
+
// (epoch ms), an all-digit string (epoch ms), or RFC3339 with an uppercase T
|
|
67
|
+
// and a Z or numeric offset (fractional seconds allowed). Date-only,
|
|
68
|
+
// offset-less and free-form strings are not timestamps.
|
|
69
|
+
/* eslint-disable unicorn/better-regex */
|
|
70
|
+
const RFC3339_PATTERN = /^(?<y>[0-9]{4})-(?<mo>[0-9]{2})-(?<d>[0-9]{2})T(?<h>[0-9]{2}):(?<mi>[0-9]{2}):(?<s>[0-9]{2})(?:\.[0-9]+)?(?:Z|[+-](?<oh>[0-9]{2}):(?<om>[0-9]{2}))$/;
|
|
71
|
+
/* eslint-enable unicorn/better-regex */
|
|
72
|
+
export const TIMESTAMP_FORMAT_HINT = 'Expected epoch milliseconds (a number or an all-digit string) or an RFC3339 timestamp with Z or an offset, such as 2025-01-01T00:00:00Z or 2025-01-01T09:00:00+09:00.';
|
|
73
|
+
export const isValidRfc3339 = (value) => {
|
|
74
|
+
const g = RFC3339_PATTERN.exec(value)?.groups;
|
|
75
|
+
if (!g)
|
|
76
|
+
return false;
|
|
77
|
+
const [y, mo, d, h, mi, s] = [g.y, g.mo, g.d, g.h, g.mi, g.s].map(Number);
|
|
78
|
+
const daysInMonth = new Date(Date.UTC(y, mo, 0)).getUTCDate();
|
|
79
|
+
if (mo < 1 || mo > 12 || d < 1 || d > daysInMonth || h > 23 || mi > 59 || s > 59)
|
|
80
|
+
return false;
|
|
81
|
+
if (g.oh !== undefined && (Number(g.oh) > 23 || Number(g.om) > 59))
|
|
82
|
+
return false;
|
|
83
|
+
return true;
|
|
84
|
+
};
|
|
85
|
+
export const isValidTimestamp = (value) => {
|
|
86
|
+
if (typeof value === 'number')
|
|
87
|
+
return Number.isFinite(value);
|
|
88
|
+
if (typeof value !== 'string')
|
|
89
|
+
return false;
|
|
90
|
+
return parseIntValue(value) !== undefined || isValidRfc3339(value);
|
|
91
|
+
};
|
|
92
|
+
// The ONE version grammar for PROP_SEMVER_* (qfg-goi1.5 R4 + Q5): SemVer 2.0
|
|
93
|
+
// (no leading zeros, optional prerelease and build on a full x.y.z), plus the
|
|
94
|
+
// abbreviated forms "x" and "x.y", read as x.0.0 and x.y.0. A "v" prefix is
|
|
95
|
+
// not a version.
|
|
96
|
+
const NUM = '(?:0|[1-9][0-9]*)';
|
|
97
|
+
const PRE_ID = '(?:0|[1-9][0-9]*|[0-9]*[a-zA-Z-][0-9a-zA-Z-]*)';
|
|
98
|
+
const BUILD_ID = '[0-9a-zA-Z-]+';
|
|
99
|
+
const SEMVER_PATTERN = new RegExp(`^${NUM}(?:\\.${NUM}(?:\\.${NUM}(?:-${PRE_ID}(?:\\.${PRE_ID})*)?(?:\\+${BUILD_ID}(?:\\.${BUILD_ID})*)?)?)?$`);
|
|
100
|
+
export const SEMVER_FORMAT_HINT = 'Expected a SemVer 2.0 version such as 4.0.18, 1.0.0-beta.1 or 1.0.0+build.5, or an abbreviated 4 / 4.1 (read as 4.0.0 / 4.1.0). No "v" prefix.';
|
|
101
|
+
export const isValidSemver = (value) => typeof value === 'string' && SEMVER_PATTERN.test(value);
|
|
102
|
+
// IN_INT_RANGE (qfg-goi1.5 R3): an object with integer start and/or end (at
|
|
103
|
+
// least one), each a safe integer or an all-digit string (the proto int64 JSON
|
|
104
|
+
// form). Range is [start, end); a missing bound is unbounded.
|
|
105
|
+
export const INT_RANGE_FORMAT_HINT = 'Expected {"start": <int>, "end": <int>} with at least one bound; the range is [start, end) and a missing bound is unbounded.';
|
|
106
|
+
export const isValidIntRange = (value) => {
|
|
107
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
108
|
+
return false;
|
|
109
|
+
const keys = Object.keys(value);
|
|
110
|
+
if (keys.length === 0 || keys.some((k) => k !== 'start' && k !== 'end'))
|
|
111
|
+
return false;
|
|
112
|
+
return Object.values(value).every((bound) => typeof bound === 'number'
|
|
113
|
+
? Number.isSafeInteger(bound)
|
|
114
|
+
: typeof bound === 'string' && parseIntValue(bound) !== undefined);
|
|
115
|
+
};
|
package/dist/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
declare const _default: "0.
|
|
1
|
+
declare const _default: "0.4.0";
|
|
2
2
|
export default _default;
|
package/dist/version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// AUTO-GENERATED from package.json by scripts/generate-version.mjs — do not edit.
|
|
2
|
-
export default '0.
|
|
2
|
+
export default '0.4.0';
|
package/oclif.manifest.json
CHANGED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"packageManager": "yarn@4.11.0+sha512.4e54aeace9141df2f0177c266b05ec50dc044638157dae128c471ba65994ac802122d7ab35bcd9e81641228b7dcf24867d28e750e0bcae8a05277d600008ad54",
|
|
3
3
|
"name": "@quonfig/cli",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.4.0",
|
|
5
5
|
"bugs": {
|
|
6
6
|
"url": "https://github.com/quonfig/cli/issues"
|
|
7
7
|
},
|