@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 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.3.0 linux-x64 node-v24.4.1
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.3.0/src/commands/activity.ts)_
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.3.0/src/commands/activity/deleted.ts)_
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.3.0/src/commands/activity/feed.ts)_
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.3.0/src/commands/activity/history.ts)_
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.3.0/src/commands/activity/restore.ts)_
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.3.0/src/commands/agent/install-skill.ts)_
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.3.0/src/commands/audit-log.ts)_
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.3.0/src/commands/cleanup.ts)_
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.3.0/src/commands/cleanup/list.ts)_
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.3.0/src/commands/cleanup/remove.ts)_
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.3.0/src/commands/cleanup/status.ts)_
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.3.0/src/commands/cleanup/verify.ts)_
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.3.0/src/commands/config-schema.ts)_
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.3.0/src/commands/contexts.ts)_
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.3.0/src/commands/contexts/search.ts)_
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.3.0/src/commands/create.ts)_
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.3.0/src/commands/delete.ts)_
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.3.0/src/commands/generate.ts)_
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.3.0/src/commands/generate-new-hex-key.ts)_
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.3.0/src/commands/get.ts)_
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.3.0/src/commands/history.ts)_
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.3.0/src/commands/info.ts)_
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.3.0/src/commands/init.ts)_
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.3.0/src/commands/interactive.ts)_
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.3.0/src/commands/list.ts)_
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.3.0/src/commands/log.ts)_
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.3.0/src/commands/log-level.ts)_
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.3.0/src/commands/login.ts)_
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.3.0/src/commands/logout.ts)_
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.3.0/src/commands/migrate.ts)_
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.3.0/src/commands/migrate/doctor.ts)_
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.3.0/src/commands/migrate/my-code.ts)_
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.3.0/src/commands/migrate/status.ts)_
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.3.0/src/commands/override.ts)_
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.3.0/src/commands/pull.ts)_
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.3.0/src/commands/push.ts)_
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.3.0/src/commands/run.ts)_
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.3.0/src/commands/schema.ts)_
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.3.0/src/commands/sdk-key.ts)_
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.3.0/src/commands/sdk-key/create.ts)_
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.3.0/src/commands/sdk-key/list.ts)_
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.3.0/src/commands/sdk-key/revoke.ts)_
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.3.0/src/commands/serve.ts)_
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.3.0/src/commands/set-default.ts)_
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.3.0/src/commands/set-rollout.ts)_
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.3.0/src/commands/sync.ts)_
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.3.0/src/commands/verify.ts)_
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.3.0/src/commands/whoami.ts)_
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.3.0/src/commands/workspace.ts)_
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.3.0/src/commands/workspace/bootstrap.ts)_
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.3.0/src/commands/workspace/create.ts)_
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.3.0/src/commands/workspace/switch.ts)_
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; valueToMatch is a semver string like "4.0.9"
116
- PROP_SEMVER_EQUAL string semver comparison; valueToMatch is a semver string like "4.0.9"
117
- PROP_SEMVER_GREATER_THAN string semver comparison; valueToMatch is a semver string like "4.0.9"
118
- PROP_BEFORE string (ISO 8601) date/time comparison
119
- PROP_AFTER string (ISO 8601)
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 = {min, max}
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
 
@@ -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: ValueSchema.optional(),
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.3.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.3.0';
2
+ export default '0.4.0';
@@ -4383,5 +4383,5 @@
4383
4383
  ]
4384
4384
  }
4385
4385
  },
4386
- "version": "0.3.0"
4386
+ "version": "0.4.0"
4387
4387
  }
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.3.0",
4
+ "version": "0.4.0",
5
5
  "bugs": {
6
6
  "url": "https://github.com/quonfig/cli/issues"
7
7
  },