@quonfig/cli 0.0.48 → 0.0.50

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.0.48 linux-x64 node-v24.4.1
20
+ @quonfig/cli/0.0.50 linux-x64 node-v24.4.1
21
21
  $ qfg --help [COMMAND]
22
22
  USAGE
23
23
  $ qfg COMMAND
@@ -195,7 +195,7 @@ EXAMPLES
195
195
  $ qfg activity restore my.flag --yes
196
196
  ```
197
197
 
198
- _See code: [src/commands/activity.ts](https://github.com/quonfig/cli/blob/v0.0.48/src/commands/activity.ts)_
198
+ _See code: [src/commands/activity.ts](https://github.com/quonfig/cli/blob/v0.0.50/src/commands/activity.ts)_
199
199
 
200
200
  ## `qfg activity deleted`
201
201
 
@@ -224,7 +224,7 @@ EXAMPLES
224
224
  $ qfg activity deleted --json
225
225
  ```
226
226
 
227
- _See code: [src/commands/activity/deleted.ts](https://github.com/quonfig/cli/blob/v0.0.48/src/commands/activity/deleted.ts)_
227
+ _See code: [src/commands/activity/deleted.ts](https://github.com/quonfig/cli/blob/v0.0.50/src/commands/activity/deleted.ts)_
228
228
 
229
229
  ## `qfg activity feed`
230
230
 
@@ -259,7 +259,7 @@ EXAMPLES
259
259
  $ qfg activity feed --json
260
260
  ```
261
261
 
262
- _See code: [src/commands/activity/feed.ts](https://github.com/quonfig/cli/blob/v0.0.48/src/commands/activity/feed.ts)_
262
+ _See code: [src/commands/activity/feed.ts](https://github.com/quonfig/cli/blob/v0.0.50/src/commands/activity/feed.ts)_
263
263
 
264
264
  ## `qfg activity history [NAME]`
265
265
 
@@ -293,7 +293,7 @@ EXAMPLES
293
293
  $ qfg activity history request.timeout --json
294
294
  ```
295
295
 
296
- _See code: [src/commands/activity/history.ts](https://github.com/quonfig/cli/blob/v0.0.48/src/commands/activity/history.ts)_
296
+ _See code: [src/commands/activity/history.ts](https://github.com/quonfig/cli/blob/v0.0.50/src/commands/activity/history.ts)_
297
297
 
298
298
  ## `qfg activity restore [NAME]`
299
299
 
@@ -332,7 +332,7 @@ EXAMPLES
332
332
  $ qfg activity restore request.timeout --type config --yes
333
333
  ```
334
334
 
335
- _See code: [src/commands/activity/restore.ts](https://github.com/quonfig/cli/blob/v0.0.48/src/commands/activity/restore.ts)_
335
+ _See code: [src/commands/activity/restore.ts](https://github.com/quonfig/cli/blob/v0.0.50/src/commands/activity/restore.ts)_
336
336
 
337
337
  ## `qfg audit-log [NAME]`
338
338
 
@@ -360,7 +360,7 @@ EXAMPLES
360
360
  $ qfg audit-log my.flag
361
361
  ```
362
362
 
363
- _See code: [src/commands/audit-log.ts](https://github.com/quonfig/cli/blob/v0.0.48/src/commands/audit-log.ts)_
363
+ _See code: [src/commands/audit-log.ts](https://github.com/quonfig/cli/blob/v0.0.50/src/commands/audit-log.ts)_
364
364
 
365
365
  ## `qfg config-schema`
366
366
 
@@ -389,7 +389,7 @@ EXAMPLES
389
389
  $ qfg config-schema --json-schema # full JSON Schema document (copy into your editor)
390
390
  ```
391
391
 
392
- _See code: [src/commands/config-schema.ts](https://github.com/quonfig/cli/blob/v0.0.48/src/commands/config-schema.ts)_
392
+ _See code: [src/commands/config-schema.ts](https://github.com/quonfig/cli/blob/v0.0.50/src/commands/config-schema.ts)_
393
393
 
394
394
  ## `qfg create NAME`
395
395
 
@@ -474,7 +474,7 @@ EXAMPLES
474
474
  $ qfg set-rollout my.new.flag --environment production --true-percent 20
475
475
  ```
476
476
 
477
- _See code: [src/commands/create.ts](https://github.com/quonfig/cli/blob/v0.0.48/src/commands/create.ts)_
477
+ _See code: [src/commands/create.ts](https://github.com/quonfig/cli/blob/v0.0.50/src/commands/create.ts)_
478
478
 
479
479
  ## `qfg delete NAME`
480
480
 
@@ -520,7 +520,7 @@ EXAMPLES
520
520
  $ qfg delete my.config --yes
521
521
  ```
522
522
 
523
- _See code: [src/commands/delete.ts](https://github.com/quonfig/cli/blob/v0.0.48/src/commands/delete.ts)_
523
+ _See code: [src/commands/delete.ts](https://github.com/quonfig/cli/blob/v0.0.50/src/commands/delete.ts)_
524
524
 
525
525
  ## `qfg flag info [NAME]`
526
526
 
@@ -723,7 +723,7 @@ EXAMPLES
723
723
  $ qfg generate --targets node-ts -o ./dist # combine with targets
724
724
  ```
725
725
 
726
- _See code: [src/commands/generate.ts](https://github.com/quonfig/cli/blob/v0.0.48/src/commands/generate.ts)_
726
+ _See code: [src/commands/generate.ts](https://github.com/quonfig/cli/blob/v0.0.50/src/commands/generate.ts)_
727
727
 
728
728
  ## `qfg generate-new-hex-key`
729
729
 
@@ -746,7 +746,7 @@ EXAMPLES
746
746
  $ qfg generate-new-hex-key
747
747
  ```
748
748
 
749
- _See code: [src/commands/generate-new-hex-key.ts](https://github.com/quonfig/cli/blob/v0.0.48/src/commands/generate-new-hex-key.ts)_
749
+ _See code: [src/commands/generate-new-hex-key.ts](https://github.com/quonfig/cli/blob/v0.0.50/src/commands/generate-new-hex-key.ts)_
750
750
 
751
751
  ## `qfg get [NAME]`
752
752
 
@@ -778,7 +778,7 @@ EXAMPLES
778
778
  $ qfg get my.config.name --environment=production
779
779
  ```
780
780
 
781
- _See code: [src/commands/get.ts](https://github.com/quonfig/cli/blob/v0.0.48/src/commands/get.ts)_
781
+ _See code: [src/commands/get.ts](https://github.com/quonfig/cli/blob/v0.0.50/src/commands/get.ts)_
782
782
 
783
783
  ## `qfg history NAME`
784
784
 
@@ -804,7 +804,7 @@ EXAMPLES
804
804
  $ qfg history my.flag
805
805
  ```
806
806
 
807
- _See code: [src/commands/history.ts](https://github.com/quonfig/cli/blob/v0.0.48/src/commands/history.ts)_
807
+ _See code: [src/commands/history.ts](https://github.com/quonfig/cli/blob/v0.0.50/src/commands/history.ts)_
808
808
 
809
809
  ## `qfg info [NAME]`
810
810
 
@@ -852,7 +852,7 @@ EXAMPLES
852
852
  $ qfg info my.config.name --exclude-evaluations # skip 24h stats
853
853
  ```
854
854
 
855
- _See code: [src/commands/info.ts](https://github.com/quonfig/cli/blob/v0.0.48/src/commands/info.ts)_
855
+ _See code: [src/commands/info.ts](https://github.com/quonfig/cli/blob/v0.0.50/src/commands/info.ts)_
856
856
 
857
857
  ## `qfg init [DIRECTORY]`
858
858
 
@@ -892,7 +892,7 @@ EXAMPLES
892
892
  $ qfg init --dry-run
893
893
  ```
894
894
 
895
- _See code: [src/commands/init.ts](https://github.com/quonfig/cli/blob/v0.0.48/src/commands/init.ts)_
895
+ _See code: [src/commands/init.ts](https://github.com/quonfig/cli/blob/v0.0.50/src/commands/init.ts)_
896
896
 
897
897
  ## `qfg interactive`
898
898
 
@@ -922,7 +922,7 @@ EXAMPLES
922
922
  $ qfg
923
923
  ```
924
924
 
925
- _See code: [src/commands/interactive.ts](https://github.com/quonfig/cli/blob/v0.0.48/src/commands/interactive.ts)_
925
+ _See code: [src/commands/interactive.ts](https://github.com/quonfig/cli/blob/v0.0.50/src/commands/interactive.ts)_
926
926
 
927
927
  ## `qfg list`
928
928
 
@@ -962,7 +962,7 @@ EXAMPLES
962
962
  $ qfg list --feature-flags
963
963
  ```
964
964
 
965
- _See code: [src/commands/list.ts](https://github.com/quonfig/cli/blob/v0.0.48/src/commands/list.ts)_
965
+ _See code: [src/commands/list.ts](https://github.com/quonfig/cli/blob/v0.0.50/src/commands/list.ts)_
966
966
 
967
967
  ## `qfg log`
968
968
 
@@ -987,7 +987,7 @@ EXAMPLES
987
987
  $ qfg log --limit 5
988
988
  ```
989
989
 
990
- _See code: [src/commands/log.ts](https://github.com/quonfig/cli/blob/v0.0.48/src/commands/log.ts)_
990
+ _See code: [src/commands/log.ts](https://github.com/quonfig/cli/blob/v0.0.50/src/commands/log.ts)_
991
991
 
992
992
  ## `qfg log-level NAME`
993
993
 
@@ -1052,7 +1052,7 @@ EXAMPLES
1052
1052
  $ qfg log-level log-level.my-app --target=Chatty --value=INFO --environment=production
1053
1053
  ```
1054
1054
 
1055
- _See code: [src/commands/log-level.ts](https://github.com/quonfig/cli/blob/v0.0.48/src/commands/log-level.ts)_
1055
+ _See code: [src/commands/log-level.ts](https://github.com/quonfig/cli/blob/v0.0.50/src/commands/log-level.ts)_
1056
1056
 
1057
1057
  ## `qfg login`
1058
1058
 
@@ -1077,7 +1077,7 @@ EXAMPLES
1077
1077
  $ qfg login --profile myprofile
1078
1078
  ```
1079
1079
 
1080
- _See code: [src/commands/login.ts](https://github.com/quonfig/cli/blob/v0.0.48/src/commands/login.ts)_
1080
+ _See code: [src/commands/login.ts](https://github.com/quonfig/cli/blob/v0.0.50/src/commands/login.ts)_
1081
1081
 
1082
1082
  ## `qfg logout`
1083
1083
 
@@ -1100,7 +1100,7 @@ EXAMPLES
1100
1100
  $ qfg logout
1101
1101
  ```
1102
1102
 
1103
- _See code: [src/commands/logout.ts](https://github.com/quonfig/cli/blob/v0.0.48/src/commands/logout.ts)_
1103
+ _See code: [src/commands/logout.ts](https://github.com/quonfig/cli/blob/v0.0.50/src/commands/logout.ts)_
1104
1104
 
1105
1105
  ## `qfg migrate`
1106
1106
 
@@ -1162,7 +1162,7 @@ EXAMPLES
1162
1162
  $ qfg migrate --from launch --source-api-key $LAUNCH_API_KEY --dir ./quonfig-repo --staging
1163
1163
  ```
1164
1164
 
1165
- _See code: [src/commands/migrate.ts](https://github.com/quonfig/cli/blob/v0.0.48/src/commands/migrate.ts)_
1165
+ _See code: [src/commands/migrate.ts](https://github.com/quonfig/cli/blob/v0.0.50/src/commands/migrate.ts)_
1166
1166
 
1167
1167
  ## `qfg migrate doctor`
1168
1168
 
@@ -1200,7 +1200,7 @@ EXAMPLES
1200
1200
  $ qfg migrate doctor --json
1201
1201
  ```
1202
1202
 
1203
- _See code: [src/commands/migrate/doctor.ts](https://github.com/quonfig/cli/blob/v0.0.48/src/commands/migrate/doctor.ts)_
1203
+ _See code: [src/commands/migrate/doctor.ts](https://github.com/quonfig/cli/blob/v0.0.50/src/commands/migrate/doctor.ts)_
1204
1204
 
1205
1205
  ## `qfg migrate my-code`
1206
1206
 
@@ -1232,7 +1232,7 @@ EXAMPLES
1232
1232
  $ qfg migrate my-code --dry-run
1233
1233
  ```
1234
1234
 
1235
- _See code: [src/commands/migrate/my-code.ts](https://github.com/quonfig/cli/blob/v0.0.48/src/commands/migrate/my-code.ts)_
1235
+ _See code: [src/commands/migrate/my-code.ts](https://github.com/quonfig/cli/blob/v0.0.50/src/commands/migrate/my-code.ts)_
1236
1236
 
1237
1237
  ## `qfg migrate status`
1238
1238
 
@@ -1263,7 +1263,7 @@ EXAMPLES
1263
1263
  $ qfg migrate status --json
1264
1264
  ```
1265
1265
 
1266
- _See code: [src/commands/migrate/status.ts](https://github.com/quonfig/cli/blob/v0.0.48/src/commands/migrate/status.ts)_
1266
+ _See code: [src/commands/migrate/status.ts](https://github.com/quonfig/cli/blob/v0.0.50/src/commands/migrate/status.ts)_
1267
1267
 
1268
1268
  ## `qfg override [NAME] [VALUE]`
1269
1269
 
@@ -1318,7 +1318,7 @@ EXAMPLES
1318
1318
  $ qfg override my.flag true --env=staging
1319
1319
  ```
1320
1320
 
1321
- _See code: [src/commands/override.ts](https://github.com/quonfig/cli/blob/v0.0.48/src/commands/override.ts)_
1321
+ _See code: [src/commands/override.ts](https://github.com/quonfig/cli/blob/v0.0.50/src/commands/override.ts)_
1322
1322
 
1323
1323
  ## `qfg pull`
1324
1324
 
@@ -1366,7 +1366,7 @@ EXAMPLES
1366
1366
  $ qfg pull # uses QUONFIG_DIR env var
1367
1367
  ```
1368
1368
 
1369
- _See code: [src/commands/pull.ts](https://github.com/quonfig/cli/blob/v0.0.48/src/commands/pull.ts)_
1369
+ _See code: [src/commands/pull.ts](https://github.com/quonfig/cli/blob/v0.0.50/src/commands/pull.ts)_
1370
1370
 
1371
1371
  ## `qfg push`
1372
1372
 
@@ -1415,7 +1415,7 @@ EXAMPLES
1415
1415
  $ qfg push --dir ./our-config --yes
1416
1416
  ```
1417
1417
 
1418
- _See code: [src/commands/push.ts](https://github.com/quonfig/cli/blob/v0.0.48/src/commands/push.ts)_
1418
+ _See code: [src/commands/push.ts](https://github.com/quonfig/cli/blob/v0.0.50/src/commands/push.ts)_
1419
1419
 
1420
1420
  ## `qfg run [COMMAND]`
1421
1421
 
@@ -1466,7 +1466,7 @@ EXAMPLES
1466
1466
  $ qfg run --env DATABASE_URL=db.url --preserve-env --environment=staging -- npm test
1467
1467
  ```
1468
1468
 
1469
- _See code: [src/commands/run.ts](https://github.com/quonfig/cli/blob/v0.0.48/src/commands/run.ts)_
1469
+ _See code: [src/commands/run.ts](https://github.com/quonfig/cli/blob/v0.0.50/src/commands/run.ts)_
1470
1470
 
1471
1471
  ## `qfg schema NAME`
1472
1472
 
@@ -1504,7 +1504,7 @@ EXAMPLES
1504
1504
  $ qfg schema my-schema --set-json-schema=@schemas/my-schema.json --protected
1505
1505
  ```
1506
1506
 
1507
- _See code: [src/commands/schema.ts](https://github.com/quonfig/cli/blob/v0.0.48/src/commands/schema.ts)_
1507
+ _See code: [src/commands/schema.ts](https://github.com/quonfig/cli/blob/v0.0.50/src/commands/schema.ts)_
1508
1508
 
1509
1509
  ## `qfg sdk-key`
1510
1510
 
@@ -1531,7 +1531,7 @@ EXAMPLES
1531
1531
  $ qfg sdk-key revoke <key-id>
1532
1532
  ```
1533
1533
 
1534
- _See code: [src/commands/sdk-key.ts](https://github.com/quonfig/cli/blob/v0.0.48/src/commands/sdk-key.ts)_
1534
+ _See code: [src/commands/sdk-key.ts](https://github.com/quonfig/cli/blob/v0.0.50/src/commands/sdk-key.ts)_
1535
1535
 
1536
1536
  ## `qfg sdk-key create`
1537
1537
 
@@ -1563,7 +1563,7 @@ EXAMPLES
1563
1563
  $ qfg sdk-key create --environment staging --type browser
1564
1564
  ```
1565
1565
 
1566
- _See code: [src/commands/sdk-key/create.ts](https://github.com/quonfig/cli/blob/v0.0.48/src/commands/sdk-key/create.ts)_
1566
+ _See code: [src/commands/sdk-key/create.ts](https://github.com/quonfig/cli/blob/v0.0.50/src/commands/sdk-key/create.ts)_
1567
1567
 
1568
1568
  ## `qfg sdk-key list`
1569
1569
 
@@ -1592,7 +1592,7 @@ EXAMPLES
1592
1592
  $ qfg sdk-key list --environment production
1593
1593
  ```
1594
1594
 
1595
- _See code: [src/commands/sdk-key/list.ts](https://github.com/quonfig/cli/blob/v0.0.48/src/commands/sdk-key/list.ts)_
1595
+ _See code: [src/commands/sdk-key/list.ts](https://github.com/quonfig/cli/blob/v0.0.50/src/commands/sdk-key/list.ts)_
1596
1596
 
1597
1597
  ## `qfg sdk-key revoke KEYID`
1598
1598
 
@@ -1619,7 +1619,7 @@ EXAMPLES
1619
1619
  $ qfg sdk-key revoke a1b2c3d4-e5f6-7890-abcd-ef1234567890
1620
1620
  ```
1621
1621
 
1622
- _See code: [src/commands/sdk-key/revoke.ts](https://github.com/quonfig/cli/blob/v0.0.48/src/commands/sdk-key/revoke.ts)_
1622
+ _See code: [src/commands/sdk-key/revoke.ts](https://github.com/quonfig/cli/blob/v0.0.50/src/commands/sdk-key/revoke.ts)_
1623
1623
 
1624
1624
  ## `qfg set-default [NAME]`
1625
1625
 
@@ -1690,7 +1690,7 @@ EXAMPLES
1690
1690
  $ qfg pull && qfg config-schema
1691
1691
  ```
1692
1692
 
1693
- _See code: [src/commands/set-default.ts](https://github.com/quonfig/cli/blob/v0.0.48/src/commands/set-default.ts)_
1693
+ _See code: [src/commands/set-default.ts](https://github.com/quonfig/cli/blob/v0.0.50/src/commands/set-default.ts)_
1694
1694
 
1695
1695
  ## `qfg set-rollout [NAME]`
1696
1696
 
@@ -1767,7 +1767,7 @@ EXAMPLES
1767
1767
  $ qfg set-rollout my.variant.flag --environment production --weights "a:33,b:33,c:34" --hash-by user.id
1768
1768
  ```
1769
1769
 
1770
- _See code: [src/commands/set-rollout.ts](https://github.com/quonfig/cli/blob/v0.0.48/src/commands/set-rollout.ts)_
1770
+ _See code: [src/commands/set-rollout.ts](https://github.com/quonfig/cli/blob/v0.0.50/src/commands/set-rollout.ts)_
1771
1771
 
1772
1772
  ## `qfg sync`
1773
1773
 
@@ -1799,7 +1799,7 @@ EXAMPLES
1799
1799
  $ qfg sync --watch --dir ./our-config --interval 30
1800
1800
  ```
1801
1801
 
1802
- _See code: [src/commands/sync.ts](https://github.com/quonfig/cli/blob/v0.0.48/src/commands/sync.ts)_
1802
+ _See code: [src/commands/sync.ts](https://github.com/quonfig/cli/blob/v0.0.50/src/commands/sync.ts)_
1803
1803
 
1804
1804
  ## `qfg toggle [NAME]`
1805
1805
 
@@ -1901,7 +1901,7 @@ EXAMPLES
1901
1901
  $ qfg verify --json
1902
1902
  ```
1903
1903
 
1904
- _See code: [src/commands/verify.ts](https://github.com/quonfig/cli/blob/v0.0.48/src/commands/verify.ts)_
1904
+ _See code: [src/commands/verify.ts](https://github.com/quonfig/cli/blob/v0.0.50/src/commands/verify.ts)_
1905
1905
 
1906
1906
  ## `qfg whoami`
1907
1907
 
@@ -1924,7 +1924,7 @@ EXAMPLES
1924
1924
  $ qfg whoami
1925
1925
  ```
1926
1926
 
1927
- _See code: [src/commands/whoami.ts](https://github.com/quonfig/cli/blob/v0.0.48/src/commands/whoami.ts)_
1927
+ _See code: [src/commands/whoami.ts](https://github.com/quonfig/cli/blob/v0.0.50/src/commands/whoami.ts)_
1928
1928
 
1929
1929
  ## `qfg workspace`
1930
1930
 
@@ -1947,7 +1947,7 @@ EXAMPLES
1947
1947
  $ qfg workspace
1948
1948
  ```
1949
1949
 
1950
- _See code: [src/commands/workspace.ts](https://github.com/quonfig/cli/blob/v0.0.48/src/commands/workspace.ts)_
1950
+ _See code: [src/commands/workspace.ts](https://github.com/quonfig/cli/blob/v0.0.50/src/commands/workspace.ts)_
1951
1951
 
1952
1952
  ## `qfg workspace bootstrap`
1953
1953
 
@@ -1980,7 +1980,7 @@ EXAMPLES
1980
1980
  $ qfg workspace bootstrap --dir ./our-config --skip-validate
1981
1981
  ```
1982
1982
 
1983
- _See code: [src/commands/workspace/bootstrap.ts](https://github.com/quonfig/cli/blob/v0.0.48/src/commands/workspace/bootstrap.ts)_
1983
+ _See code: [src/commands/workspace/bootstrap.ts](https://github.com/quonfig/cli/blob/v0.0.50/src/commands/workspace/bootstrap.ts)_
1984
1984
 
1985
1985
  ## `qfg workspace create SLUG`
1986
1986
 
@@ -2014,7 +2014,7 @@ EXAMPLES
2014
2014
  $ qfg workspace create my-team --org 11111111-1111-1111-1111-111111111111
2015
2015
  ```
2016
2016
 
2017
- _See code: [src/commands/workspace/create.ts](https://github.com/quonfig/cli/blob/v0.0.48/src/commands/workspace/create.ts)_
2017
+ _See code: [src/commands/workspace/create.ts](https://github.com/quonfig/cli/blob/v0.0.50/src/commands/workspace/create.ts)_
2018
2018
 
2019
2019
  ## `qfg workspace switch [SLUG]`
2020
2020
 
@@ -2042,7 +2042,7 @@ EXAMPLES
2042
2042
  $ qfg workspace switch acme/production
2043
2043
  ```
2044
2044
 
2045
- _See code: [src/commands/workspace/switch.ts](https://github.com/quonfig/cli/blob/v0.0.48/src/commands/workspace/switch.ts)_
2045
+ _See code: [src/commands/workspace/switch.ts](https://github.com/quonfig/cli/blob/v0.0.50/src/commands/workspace/switch.ts)_
2046
2046
  <!-- commandsstop -->
2047
2047
 
2048
2048
  ## Local Development
@@ -16,6 +16,7 @@ export default class Info extends APICommand {
16
16
  private fetchEvaluationStats;
17
17
  private formatValue;
18
18
  private hasNonTrivialCriteria;
19
+ private isSimpleScalarRuleValue;
19
20
  private parseConfig;
20
21
  private transformEvaluationStatsForJson;
21
22
  private transformValueForJson;
@@ -304,6 +304,32 @@ Related commands:
304
304
  return false;
305
305
  return true;
306
306
  }
307
+ // A rule value is a "simple scalar" if it carries a literal value that can be
308
+ // rendered inline next to "[override]". Rollouts ({type: 'weighted_values',
309
+ // ...}, or anything else where `value.value` is itself an object) cannot —
310
+ // String(obj) yields "[object Object]" (qfg-5j9i), and a percent split is
311
+ // never a one-token override anyway.
312
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
313
+ isSimpleScalarRuleValue(value) {
314
+ if (!value || typeof value !== 'object')
315
+ return false;
316
+ if (value.type === 'weighted_values' || Array.isArray(value.weightedValues))
317
+ return false;
318
+ // Old format: {type: 'string'|'bool'|'int'|'double'|'stringList'|'json', value: X}
319
+ if (typeof value.type === 'string' && value.value !== undefined) {
320
+ // A `json` payload may legitimately be an object — render it as JSON, not [object Object].
321
+ if (value.type === 'json')
322
+ return true;
323
+ return typeof value.value !== 'object' || Array.isArray(value.value);
324
+ }
325
+ // New format: {string: X} / {bool: X} / {int: X} / {double: X} / {stringList: [...]} / {json: ...}
326
+ return (value.string !== undefined ||
327
+ value.bool !== undefined ||
328
+ value.int !== undefined ||
329
+ value.double !== undefined ||
330
+ value.stringList !== undefined ||
331
+ value.json !== undefined);
332
+ }
307
333
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
308
334
  parseConfig(config, environments, url) {
309
335
  const contents = [];
@@ -354,11 +380,12 @@ Related commands:
354
380
  // Has conditional rules - show [override] with the conditional value
355
381
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
356
382
  const overrideRule = envConfig.rules.find((r) => this.hasNonTrivialCriteria(r));
357
- if (overrideRule) {
383
+ if (overrideRule && this.isSimpleScalarRuleValue(overrideRule.value)) {
358
384
  const overrideValue = this.formatValue(overrideRule.value, false);
359
385
  displayValue = `[override] \`${overrideValue}\``;
360
386
  }
361
387
  else {
388
+ // Rollouts / weighted_values / anything we can't render inline → defer to the URL (qfg-5j9i).
362
389
  displayValue = '[see rules]';
363
390
  }
364
391
  }
@@ -101,8 +101,8 @@ CLI shortcuts (no JSON editing needed for simple cases):
101
101
  // Plain `git pull` is fine with untracked files, and `git merge --ff-only`
102
102
  // below will fail loudly on real conflicts (tracked modifications, or an
103
103
  // incoming commit that would overwrite an untracked file). Pre-checking
104
- // just creates a self-trap when qfg itself writes files like
105
- // `.qfg-friction.log` into the workspace dir (qfg-q2l).
104
+ // creates a self-trap whenever the customer leaves anything in the
105
+ // workspace dir that they haven't committed yet.
106
106
  // Fetch
107
107
  this.log('Fetching from remote...');
108
108
  try {
@@ -1,14 +1,25 @@
1
1
  import * as fs from 'node:fs';
2
2
  import * as path from 'node:path';
3
3
  import { removeQfFromGitignore, writeImportState } from './import-state.js';
4
- import { writeMigrationReport } from './migration-report.js';
4
+ import { deriveFollowUpFromConversionNotes, writeMigrationReport } from './migration-report.js';
5
5
  import { detectDuplicateKeys } from './sources/launch/translate.js';
6
6
  import { MIGRATOR_IDENTITY, stackCommits } from '../util/clone-and-stack-push.js';
7
7
  import { runGit, spawnGit } from '../util/git-ops.js';
8
+ /**
9
+ * True only when `dir` is itself the root of a git repo. `rev-parse --git-dir`
10
+ * walks UP the filesystem, so a plain `rev-parse` check returns true for any
11
+ * subdir of any ancestor repo — and the migrator then commits into that
12
+ * ancestor instead of `git init`-ing a fresh repo at `dir`. We use
13
+ * `--show-prefix`, which is the relative path from the enclosing toplevel
14
+ * down to `dir`: empty string when `dir` IS the toplevel, non-empty when it's
15
+ * a subdir of an ancestor repo. Avoids all the cross-platform path-string
16
+ * pitfalls of comparing toplevel against `dir` (macOS /var/folders symlinks,
17
+ * Windows 8.3 short names, case folding) (qfg-wu85).
18
+ */
8
19
  const isGitRepo = async (dir) => {
9
20
  try {
10
- await runGit(['-C', dir, 'rev-parse', '--git-dir']);
11
- return true;
21
+ const { stdout } = await runGit(['-C', dir, 'rev-parse', '--show-prefix']);
22
+ return stdout.trim() === '';
12
23
  }
13
24
  catch {
14
25
  return false;
@@ -188,16 +199,21 @@ export const applyLocalMigration = async (opts) => {
188
199
  const skippedConfigs = opts.source.getSkippedConfigs?.() ?? null;
189
200
  const coercedSentinels = opts.source.getCoercedSentinels?.() ?? null;
190
201
  const conversionNotes = opts.source.getConversionNotes?.() ?? null;
202
+ const environmentMap = opts.source.getEnvironmentMap?.() ?? null;
203
+ const maintainerMap = opts.source.getMaintainerMap?.() ?? null;
191
204
  const duplicateResolutions = resolutionEntries.length > 0 ? { entries: resolutionEntries, total: resolutionEntries.length } : null;
192
205
  const skippedTotal = (skippedConfigs?.total ?? 0) + resolutionEntries.reduce((sum, r) => sum + r.deleted.length, 0);
193
206
  const counts = buildMigrationCounts(livePaths, opts.environments.length, skippedTotal);
194
207
  const reportData = {
195
208
  ...opts.reportData,
196
209
  counts,
210
+ ...(environmentMap && environmentMap.length > 0 ? { environmentMap } : {}),
211
+ followUp: deriveFollowUpFromConversionNotes(opts.reportData.followUp, conversionNotes ?? undefined),
197
212
  ...(coercedSentinels ? { coercedSentinels } : {}),
198
213
  ...(conversionNotes && conversionNotes.length > 0 ? { conversionNotes } : {}),
199
214
  ...(droppedOverrides ? { droppedOverrides } : {}),
200
215
  ...(duplicateResolutions ? { duplicateResolutions } : {}),
216
+ ...(maintainerMap && Object.keys(maintainerMap).length > 0 ? { maintainerMap } : {}),
201
217
  ...(skippedConfigs ? { skippedConfigs } : {}),
202
218
  };
203
219
  writeMigrationReport(opts.localDir, reportData);
@@ -320,6 +336,8 @@ export const buildAuditFinalCommit = (opts) => ({
320
336
  const skippedConfigs = opts.source.getSkippedConfigs?.() ?? null;
321
337
  const coercedSentinels = opts.source.getCoercedSentinels?.() ?? null;
322
338
  const conversionNotes = opts.source.getConversionNotes?.() ?? null;
339
+ const environmentMap = opts.source.getEnvironmentMap?.() ?? null;
340
+ const maintainerMap = opts.source.getMaintainerMap?.() ?? null;
323
341
  const duplicateResolutions = resolutionEntries.length > 0 ? { entries: resolutionEntries, total: resolutionEntries.length } : null;
324
342
  removeQfFromGitignore(dir);
325
343
  writeImportState(dir, opts.importState);
@@ -328,10 +346,13 @@ export const buildAuditFinalCommit = (opts) => ({
328
346
  const reportData = {
329
347
  ...opts.reportData,
330
348
  counts,
349
+ ...(environmentMap && environmentMap.length > 0 ? { environmentMap } : {}),
350
+ followUp: deriveFollowUpFromConversionNotes(opts.reportData.followUp, conversionNotes ?? undefined),
331
351
  ...(coercedSentinels ? { coercedSentinels } : {}),
332
352
  ...(conversionNotes && conversionNotes.length > 0 ? { conversionNotes } : {}),
333
353
  ...(droppedOverrides ? { droppedOverrides } : {}),
334
354
  ...(duplicateResolutions ? { duplicateResolutions } : {}),
355
+ ...(maintainerMap && Object.keys(maintainerMap).length > 0 ? { maintainerMap } : {}),
335
356
  ...(skippedConfigs ? { skippedConfigs } : {}),
336
357
  };
337
358
  writeMigrationReport(dir, reportData);
@@ -1,6 +1,7 @@
1
1
  import type { IdentifierMap } from './identifier-map.js';
2
2
  import type { ConversionNote } from './quonfig-target/report.js';
3
- import type { CoercedSentinelSummary, DroppedOverrideSummary, DuplicateResolutionSummary, SkippedConfigSummary } from './source.js';
3
+ import type { CoercedSentinelSummary, DroppedOverrideSummary, DuplicateResolutionSummary, EnvironmentMapEntry, SkippedConfigSummary } from './source.js';
4
+ export type { EnvironmentMapEntry } from './source.js';
4
5
  export interface MigrationReportCounts {
5
6
  configsMigrated: number;
6
7
  environmentsMapped: number;
@@ -23,10 +24,6 @@ export interface UnsupportedFeature {
23
24
  feature: string;
24
25
  note?: string;
25
26
  }
26
- export interface EnvironmentMapEntry {
27
- quonfigName: string;
28
- sourceName: string;
29
- }
30
27
  export interface FollowUpChecklist {
31
28
  mustFixBeforeCutover: string[];
32
29
  reviewPostCutover: string[];
@@ -65,6 +62,14 @@ export interface MigrationReportData {
65
62
  followUp: FollowUpChecklist;
66
63
  identifierMap: IdentifierMap;
67
64
  lossyMappings: LossyMapping[];
65
+ /**
66
+ * qfg-l8uz: source maintainerId → email pairs. Rendered as a sub-table on
67
+ * `## Identifier map` so the reader sees who owned each dropped-maintainer
68
+ * note, and consumed by the renderer to decorate the dropped-maintainer
69
+ * rollup with emails. Optional/undefined when the source has no member
70
+ * lookup (or it failed) — both the table and the decoration just no-op.
71
+ */
72
+ maintainerMap?: null | Record<string, string>;
68
73
  /**
69
74
  * Configs soft-skipped by translate() because the source data was invalid
70
75
  * (e.g. variant/valueType mismatch). Null when nothing was skipped.
@@ -73,6 +78,12 @@ export interface MigrationReportData {
73
78
  source: string;
74
79
  unsupportedFeatures: UnsupportedFeature[];
75
80
  }
81
+ /**
82
+ * Folds conversion notes into a followUp checklist. De-duplicates by hint
83
+ * string so a flag with two dropped prerequisites doesn't produce two
84
+ * identical checkbox lines.
85
+ */
86
+ export declare const deriveFollowUpFromConversionNotes: (base: FollowUpChecklist, notes: ConversionNote[] | undefined) => FollowUpChecklist;
76
87
  export declare const buildMigrationReport: (data: MigrationReportData) => string;
77
88
  export declare const migrationReportPath: (outputDir: string) => string;
78
89
  export declare const writeMigrationReport: (outputDir: string, data: MigrationReportData) => string;