faces-cli 1.5.15 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,9 +1,23 @@
1
1
  {
2
2
  "commands": {
3
- "account:state": {
3
+ "account:preferences": {
4
4
  "aliases": [],
5
- "args": {},
6
- "description": "Full account routing state (plan, balance, onboarding)",
5
+ "args": {
6
+ "key": {
7
+ "description": "Preference key to update (api_fallback, default_model)",
8
+ "name": "key"
9
+ },
10
+ "value": {
11
+ "description": "New value",
12
+ "name": "value"
13
+ }
14
+ },
15
+ "description": "View or update account preferences (api_fallback, default_model)",
16
+ "examples": [
17
+ "faces account:preferences",
18
+ "faces account:preferences default_model gpt-5.4",
19
+ "faces account:preferences api_fallback true"
20
+ ],
7
21
  "flags": {
8
22
  "json": {
9
23
  "description": "Format output as json.",
@@ -39,7 +53,7 @@
39
53
  },
40
54
  "hasDynamicHelp": false,
41
55
  "hiddenAliases": [],
42
- "id": "account:state",
56
+ "id": "account:preferences",
43
57
  "pluginAlias": "faces-cli",
44
58
  "pluginName": "faces-cli",
45
59
  "pluginType": "core",
@@ -50,13 +64,13 @@
50
64
  "dist",
51
65
  "commands",
52
66
  "account",
53
- "state.js"
67
+ "preferences.js"
54
68
  ]
55
69
  },
56
- "billing:balance": {
70
+ "account:state": {
57
71
  "aliases": [],
58
72
  "args": {},
59
- "description": "Show credit balance and payment method status",
73
+ "description": "Full account routing state (plan, balance, onboarding)",
60
74
  "flags": {
61
75
  "json": {
62
76
  "description": "Format output as json.",
@@ -92,7 +106,7 @@
92
106
  },
93
107
  "hasDynamicHelp": false,
94
108
  "hiddenAliases": [],
95
- "id": "billing:balance",
109
+ "id": "account:state",
96
110
  "pluginAlias": "faces-cli",
97
111
  "pluginName": "faces-cli",
98
112
  "pluginType": "core",
@@ -102,14 +116,27 @@
102
116
  "relativePath": [
103
117
  "dist",
104
118
  "commands",
105
- "billing",
106
- "balance.js"
119
+ "account",
120
+ "state.js"
107
121
  ]
108
122
  },
109
- "billing:card-setup": {
123
+ "auth:connect": {
110
124
  "aliases": [],
111
- "args": {},
112
- "description": "Get a Stripe card setup URL to save a payment method",
125
+ "args": {
126
+ "provider": {
127
+ "description": "OAuth provider to connect",
128
+ "name": "provider",
129
+ "options": [
130
+ "openai"
131
+ ],
132
+ "required": true
133
+ }
134
+ },
135
+ "description": "Connect an OAuth provider account to Faces (e.g. ChatGPT Plus/Pro)",
136
+ "examples": [
137
+ "<%= config.bin %> auth connect openai",
138
+ "<%= config.bin %> auth connect openai --manual"
139
+ ],
113
140
  "flags": {
114
141
  "json": {
115
142
  "description": "Format output as json.",
@@ -141,11 +168,17 @@
141
168
  "hasDynamicHelp": false,
142
169
  "multiple": false,
143
170
  "type": "option"
171
+ },
172
+ "manual": {
173
+ "description": "Manual mode for headless environments: prints the authorize URL and prompts you to paste the callback URL after approving in any browser.",
174
+ "name": "manual",
175
+ "allowNo": false,
176
+ "type": "boolean"
144
177
  }
145
178
  },
146
179
  "hasDynamicHelp": false,
147
180
  "hiddenAliases": [],
148
- "id": "billing:card-setup",
181
+ "id": "auth:connect",
149
182
  "pluginAlias": "faces-cli",
150
183
  "pluginName": "faces-cli",
151
184
  "pluginType": "core",
@@ -155,14 +188,18 @@
155
188
  "relativePath": [
156
189
  "dist",
157
190
  "commands",
158
- "billing",
159
- "card-setup.js"
191
+ "auth",
192
+ "connect.js"
160
193
  ]
161
194
  },
162
- "billing:checkout": {
195
+ "auth:connections": {
163
196
  "aliases": [],
164
197
  "args": {},
165
- "description": "Get a Stripe checkout URL to upgrade your subscription plan",
198
+ "description": "List connected OAuth provider accounts",
199
+ "examples": [
200
+ "<%= config.bin %> auth connections",
201
+ "<%= config.bin %> auth connections --json"
202
+ ],
166
203
  "flags": {
167
204
  "json": {
168
205
  "description": "Format output as json.",
@@ -194,22 +231,11 @@
194
231
  "hasDynamicHelp": false,
195
232
  "multiple": false,
196
233
  "type": "option"
197
- },
198
- "plan": {
199
- "description": "Plan to subscribe to",
200
- "name": "plan",
201
- "default": "connect",
202
- "hasDynamicHelp": false,
203
- "multiple": false,
204
- "options": [
205
- "connect"
206
- ],
207
- "type": "option"
208
234
  }
209
235
  },
210
236
  "hasDynamicHelp": false,
211
237
  "hiddenAliases": [],
212
- "id": "billing:checkout",
238
+ "id": "auth:connections",
213
239
  "pluginAlias": "faces-cli",
214
240
  "pluginName": "faces-cli",
215
241
  "pluginType": "core",
@@ -219,14 +245,26 @@
219
245
  "relativePath": [
220
246
  "dist",
221
247
  "commands",
222
- "billing",
223
- "checkout.js"
248
+ "auth",
249
+ "connections.js"
224
250
  ]
225
251
  },
226
- "billing:llm-costs": {
252
+ "auth:disconnect": {
227
253
  "aliases": [],
228
- "args": {},
229
- "description": "List available LLMs and their per-token costs",
254
+ "args": {
255
+ "provider": {
256
+ "description": "OAuth provider to disconnect",
257
+ "name": "provider",
258
+ "options": [
259
+ "openai"
260
+ ],
261
+ "required": true
262
+ }
263
+ },
264
+ "description": "Disconnect a linked OAuth provider account",
265
+ "examples": [
266
+ "<%= config.bin %> auth disconnect openai"
267
+ ],
230
268
  "flags": {
231
269
  "json": {
232
270
  "description": "Format output as json.",
@@ -258,18 +296,11 @@
258
296
  "hasDynamicHelp": false,
259
297
  "multiple": false,
260
298
  "type": "option"
261
- },
262
- "provider": {
263
- "description": "Filter by provider (e.g. openai, anthropic)",
264
- "name": "provider",
265
- "hasDynamicHelp": false,
266
- "multiple": false,
267
- "type": "option"
268
299
  }
269
300
  },
270
301
  "hasDynamicHelp": false,
271
302
  "hiddenAliases": [],
272
- "id": "billing:llm-costs",
303
+ "id": "auth:disconnect",
273
304
  "pluginAlias": "faces-cli",
274
305
  "pluginName": "faces-cli",
275
306
  "pluginType": "core",
@@ -279,14 +310,14 @@
279
310
  "relativePath": [
280
311
  "dist",
281
312
  "commands",
282
- "billing",
283
- "llm-costs.js"
313
+ "auth",
314
+ "disconnect.js"
284
315
  ]
285
316
  },
286
- "billing:quota": {
317
+ "auth:login": {
287
318
  "aliases": [],
288
319
  "args": {},
289
- "description": "Show compile token quota and per-face stats",
320
+ "description": "Login and save JWT credentials",
290
321
  "flags": {
291
322
  "json": {
292
323
  "description": "Format output as json.",
@@ -318,11 +349,27 @@
318
349
  "hasDynamicHelp": false,
319
350
  "multiple": false,
320
351
  "type": "option"
352
+ },
353
+ "email": {
354
+ "description": "Account email",
355
+ "name": "email",
356
+ "required": true,
357
+ "hasDynamicHelp": false,
358
+ "multiple": false,
359
+ "type": "option"
360
+ },
361
+ "password": {
362
+ "description": "Account password",
363
+ "name": "password",
364
+ "required": true,
365
+ "hasDynamicHelp": false,
366
+ "multiple": false,
367
+ "type": "option"
321
368
  }
322
369
  },
323
370
  "hasDynamicHelp": false,
324
371
  "hiddenAliases": [],
325
- "id": "billing:quota",
372
+ "id": "auth:login",
326
373
  "pluginAlias": "faces-cli",
327
374
  "pluginName": "faces-cli",
328
375
  "pluginType": "core",
@@ -332,14 +379,14 @@
332
379
  "relativePath": [
333
380
  "dist",
334
381
  "commands",
335
- "billing",
336
- "quota.js"
382
+ "auth",
383
+ "login.js"
337
384
  ]
338
385
  },
339
- "billing:subscription": {
386
+ "auth:logout": {
340
387
  "aliases": [],
341
388
  "args": {},
342
- "description": "Show current plan, face count, and renewal date",
389
+ "description": "Clear saved credentials",
343
390
  "flags": {
344
391
  "json": {
345
392
  "description": "Format output as json.",
@@ -375,7 +422,7 @@
375
422
  },
376
423
  "hasDynamicHelp": false,
377
424
  "hiddenAliases": [],
378
- "id": "billing:subscription",
425
+ "id": "auth:logout",
379
426
  "pluginAlias": "faces-cli",
380
427
  "pluginName": "faces-cli",
381
428
  "pluginType": "core",
@@ -385,14 +432,14 @@
385
432
  "relativePath": [
386
433
  "dist",
387
434
  "commands",
388
- "billing",
389
- "subscription.js"
435
+ "auth",
436
+ "logout.js"
390
437
  ]
391
438
  },
392
- "billing:topup": {
439
+ "auth:refresh": {
393
440
  "aliases": [],
394
441
  "args": {},
395
- "description": "Top up credit balance using saved payment method",
442
+ "description": "Exchange current JWT for a fresh one",
396
443
  "flags": {
397
444
  "json": {
398
445
  "description": "Format output as json.",
@@ -424,26 +471,11 @@
424
471
  "hasDynamicHelp": false,
425
472
  "multiple": false,
426
473
  "type": "option"
427
- },
428
- "amount": {
429
- "description": "Top-up amount in USD (min $1)",
430
- "name": "amount",
431
- "required": true,
432
- "hasDynamicHelp": false,
433
- "multiple": false,
434
- "type": "option"
435
- },
436
- "payment-ref": {
437
- "description": "Payment reference (admin/test path)",
438
- "name": "payment-ref",
439
- "hasDynamicHelp": false,
440
- "multiple": false,
441
- "type": "option"
442
474
  }
443
475
  },
444
476
  "hasDynamicHelp": false,
445
477
  "hiddenAliases": [],
446
- "id": "billing:topup",
478
+ "id": "auth:refresh",
447
479
  "pluginAlias": "faces-cli",
448
480
  "pluginName": "faces-cli",
449
481
  "pluginType": "core",
@@ -453,14 +485,14 @@
453
485
  "relativePath": [
454
486
  "dist",
455
487
  "commands",
456
- "billing",
457
- "topup.js"
488
+ "auth",
489
+ "refresh.js"
458
490
  ]
459
491
  },
460
- "billing:usage": {
492
+ "auth:register": {
461
493
  "aliases": [],
462
494
  "args": {},
463
- "description": "Aggregated usage analytics",
495
+ "description": "Create a new Faces account",
464
496
  "flags": {
465
497
  "json": {
466
498
  "description": "Format output as json.",
@@ -493,37 +525,60 @@
493
525
  "multiple": false,
494
526
  "type": "option"
495
527
  },
496
- "group-by": {
497
- "description": "Group results",
498
- "name": "group-by",
528
+ "email": {
529
+ "description": "Email address",
530
+ "name": "email",
531
+ "required": true,
499
532
  "hasDynamicHelp": false,
500
533
  "multiple": false,
501
- "options": [
502
- "api_key",
503
- "model",
504
- "llm",
505
- "date"
506
- ],
507
534
  "type": "option"
508
535
  },
509
- "from": {
510
- "description": "Start date (YYYY-MM-DD)",
511
- "name": "from",
536
+ "password": {
537
+ "description": "Password",
538
+ "name": "password",
539
+ "required": true,
512
540
  "hasDynamicHelp": false,
513
541
  "multiple": false,
514
542
  "type": "option"
515
543
  },
516
- "to": {
517
- "description": "End date (YYYY-MM-DD)",
518
- "name": "to",
544
+ "name": {
545
+ "description": "Display name (defaults to username)",
546
+ "name": "name",
547
+ "hasDynamicHelp": false,
548
+ "multiple": false,
549
+ "type": "option"
550
+ },
551
+ "username": {
552
+ "description": "Username (lowercase, dashes, numbers)",
553
+ "name": "username",
554
+ "required": true,
555
+ "hasDynamicHelp": false,
556
+ "multiple": false,
557
+ "type": "option"
558
+ },
559
+ "invite-key": {
560
+ "description": "Invite key (if required)",
561
+ "name": "invite-key",
562
+ "hasDynamicHelp": false,
563
+ "multiple": false,
564
+ "type": "option"
565
+ },
566
+ "plan": {
567
+ "description": "Plan to subscribe to: \"free\" ($5 activation) or \"connect\" ($17/mo, no activation fee)",
568
+ "name": "plan",
569
+ "default": "free",
519
570
  "hasDynamicHelp": false,
520
571
  "multiple": false,
572
+ "options": [
573
+ "free",
574
+ "connect"
575
+ ],
521
576
  "type": "option"
522
577
  }
523
578
  },
524
579
  "hasDynamicHelp": false,
525
580
  "hiddenAliases": [],
526
- "id": "billing:usage",
581
+ "id": "auth:register",
527
582
  "pluginAlias": "faces-cli",
528
583
  "pluginName": "faces-cli",
529
584
  "pluginType": "core",
@@ -533,14 +588,14 @@
533
588
  "relativePath": [
534
589
  "dist",
535
590
  "commands",
536
- "billing",
537
- "usage.js"
591
+ "auth",
592
+ "register.js"
538
593
  ]
539
594
  },
540
- "catalog:backup": {
595
+ "auth:whoami": {
541
596
  "aliases": [],
542
597
  "args": {},
543
- "description": "Snapshot all faces and source material for migration",
598
+ "description": "Print current user profile and auth diagnostic",
544
599
  "flags": {
545
600
  "json": {
546
601
  "description": "Format output as json.",
@@ -576,7 +631,7 @@
576
631
  },
577
632
  "hasDynamicHelp": false,
578
633
  "hiddenAliases": [],
579
- "id": "catalog:backup",
634
+ "id": "auth:whoami",
580
635
  "pluginAlias": "faces-cli",
581
636
  "pluginName": "faces-cli",
582
637
  "pluginType": "core",
@@ -586,14 +641,14 @@
586
641
  "relativePath": [
587
642
  "dist",
588
643
  "commands",
589
- "catalog",
590
- "backup.js"
644
+ "auth",
645
+ "whoami.js"
591
646
  ]
592
647
  },
593
- "catalog:doctor": {
648
+ "billing:balance": {
594
649
  "aliases": [],
595
650
  "args": {},
596
- "description": "Diagnose and repair the local face catalog",
651
+ "description": "Show credit balance and payment method status",
597
652
  "flags": {
598
653
  "json": {
599
654
  "description": "Format output as json.",
@@ -625,23 +680,11 @@
625
680
  "hasDynamicHelp": false,
626
681
  "multiple": false,
627
682
  "type": "option"
628
- },
629
- "fix": {
630
- "description": "Rebuild missing or stale catalog entries from API",
631
- "name": "fix",
632
- "allowNo": false,
633
- "type": "boolean"
634
- },
635
- "generate": {
636
- "description": "Fix + generate missing descriptions via LLM",
637
- "name": "generate",
638
- "allowNo": false,
639
- "type": "boolean"
640
683
  }
641
684
  },
642
685
  "hasDynamicHelp": false,
643
686
  "hiddenAliases": [],
644
- "id": "catalog:doctor",
687
+ "id": "billing:balance",
645
688
  "pluginAlias": "faces-cli",
646
689
  "pluginName": "faces-cli",
647
690
  "pluginType": "core",
@@ -651,14 +694,14 @@
651
694
  "relativePath": [
652
695
  "dist",
653
696
  "commands",
654
- "catalog",
655
- "doctor.js"
697
+ "billing",
698
+ "balance.js"
656
699
  ]
657
700
  },
658
- "catalog:list": {
701
+ "billing:card-setup": {
659
702
  "aliases": [],
660
703
  "args": {},
661
- "description": "List all faces in the local catalog",
704
+ "description": "Get a Stripe card setup URL to save a payment method",
662
705
  "flags": {
663
706
  "json": {
664
707
  "description": "Format output as json.",
@@ -694,7 +737,7 @@
694
737
  },
695
738
  "hasDynamicHelp": false,
696
739
  "hiddenAliases": [],
697
- "id": "catalog:list",
740
+ "id": "billing:card-setup",
698
741
  "pluginAlias": "faces-cli",
699
742
  "pluginName": "faces-cli",
700
743
  "pluginType": "core",
@@ -704,14 +747,14 @@
704
747
  "relativePath": [
705
748
  "dist",
706
749
  "commands",
707
- "catalog",
708
- "list.js"
750
+ "billing",
751
+ "card-setup.js"
709
752
  ]
710
753
  },
711
- "catalog:manyfaced": {
754
+ "billing:checkout": {
712
755
  "aliases": [],
713
756
  "args": {},
714
- "description": "Browse and install community manyfaced skills from github.com/facessh/manyfaced",
757
+ "description": "Get a Stripe checkout URL to upgrade your subscription plan",
715
758
  "flags": {
716
759
  "json": {
717
760
  "description": "Format output as json.",
@@ -744,37 +787,21 @@
744
787
  "multiple": false,
745
788
  "type": "option"
746
789
  },
747
- "skill": {
748
- "description": "Show details for a specific skill",
749
- "name": "skill",
750
- "hasDynamicHelp": false,
751
- "multiple": false,
752
- "type": "option"
753
- },
754
- "install": {
755
- "description": "Install a skill by name",
756
- "name": "install",
757
- "hasDynamicHelp": false,
758
- "multiple": false,
759
- "type": "option"
760
- },
761
- "skills-dir": {
762
- "description": "Directory to install skills into (required for --install)",
763
- "name": "skills-dir",
790
+ "plan": {
791
+ "description": "Plan to subscribe to",
792
+ "name": "plan",
793
+ "default": "connect",
764
794
  "hasDynamicHelp": false,
765
795
  "multiple": false,
796
+ "options": [
797
+ "connect"
798
+ ],
766
799
  "type": "option"
767
- },
768
- "refresh": {
769
- "description": "Force refresh the skill index (ignore cache)",
770
- "name": "refresh",
771
- "allowNo": false,
772
- "type": "boolean"
773
800
  }
774
801
  },
775
802
  "hasDynamicHelp": false,
776
803
  "hiddenAliases": [],
777
- "id": "catalog:manyfaced",
804
+ "id": "billing:checkout",
778
805
  "pluginAlias": "faces-cli",
779
806
  "pluginName": "faces-cli",
780
807
  "pluginType": "core",
@@ -784,19 +811,14 @@
784
811
  "relativePath": [
785
812
  "dist",
786
813
  "commands",
787
- "catalog",
788
- "manyfaced.js"
814
+ "billing",
815
+ "checkout.js"
789
816
  ]
790
817
  },
791
- "catalog:restore": {
818
+ "billing:llm-costs": {
792
819
  "aliases": [],
793
- "args": {
794
- "file": {
795
- "description": "Backup file path (default: most recent in ~/.faces/backups/)",
796
- "name": "file"
797
- }
798
- },
799
- "description": "Restore faces and source material from a backup snapshot",
820
+ "args": {},
821
+ "description": "List available LLMs and their per-token costs",
800
822
  "flags": {
801
823
  "json": {
802
824
  "description": "Format output as json.",
@@ -829,16 +851,17 @@
829
851
  "multiple": false,
830
852
  "type": "option"
831
853
  },
832
- "compile": {
833
- "description": "Run compile:all after restoring",
834
- "name": "compile",
835
- "allowNo": false,
836
- "type": "boolean"
854
+ "provider": {
855
+ "description": "Filter by provider (e.g. openai, anthropic)",
856
+ "name": "provider",
857
+ "hasDynamicHelp": false,
858
+ "multiple": false,
859
+ "type": "option"
837
860
  }
838
861
  },
839
862
  "hasDynamicHelp": false,
840
863
  "hiddenAliases": [],
841
- "id": "catalog:restore",
864
+ "id": "billing:llm-costs",
842
865
  "pluginAlias": "faces-cli",
843
866
  "pluginName": "faces-cli",
844
867
  "pluginType": "core",
@@ -848,27 +871,14 @@
848
871
  "relativePath": [
849
872
  "dist",
850
873
  "commands",
851
- "catalog",
852
- "restore.js"
874
+ "billing",
875
+ "llm-costs.js"
853
876
  ]
854
877
  },
855
- "auth:connect": {
878
+ "billing:quota": {
856
879
  "aliases": [],
857
- "args": {
858
- "provider": {
859
- "description": "OAuth provider to connect",
860
- "name": "provider",
861
- "options": [
862
- "openai"
863
- ],
864
- "required": true
865
- }
866
- },
867
- "description": "Connect an OAuth provider account to Faces (e.g. ChatGPT Plus/Pro)",
868
- "examples": [
869
- "<%= config.bin %> auth connect openai",
870
- "<%= config.bin %> auth connect openai --manual"
871
- ],
880
+ "args": {},
881
+ "description": "Show compile token quota and per-face stats",
872
882
  "flags": {
873
883
  "json": {
874
884
  "description": "Format output as json.",
@@ -900,17 +910,11 @@
900
910
  "hasDynamicHelp": false,
901
911
  "multiple": false,
902
912
  "type": "option"
903
- },
904
- "manual": {
905
- "description": "Manual mode for headless environments: prints the authorize URL and prompts you to paste the callback URL after approving in any browser.",
906
- "name": "manual",
907
- "allowNo": false,
908
- "type": "boolean"
909
913
  }
910
914
  },
911
915
  "hasDynamicHelp": false,
912
916
  "hiddenAliases": [],
913
- "id": "auth:connect",
917
+ "id": "billing:quota",
914
918
  "pluginAlias": "faces-cli",
915
919
  "pluginName": "faces-cli",
916
920
  "pluginType": "core",
@@ -920,18 +924,14 @@
920
924
  "relativePath": [
921
925
  "dist",
922
926
  "commands",
923
- "auth",
924
- "connect.js"
927
+ "billing",
928
+ "quota.js"
925
929
  ]
926
930
  },
927
- "auth:connections": {
931
+ "billing:subscription": {
928
932
  "aliases": [],
929
933
  "args": {},
930
- "description": "List connected OAuth provider accounts",
931
- "examples": [
932
- "<%= config.bin %> auth connections",
933
- "<%= config.bin %> auth connections --json"
934
- ],
934
+ "description": "Show current plan, face count, and renewal date",
935
935
  "flags": {
936
936
  "json": {
937
937
  "description": "Format output as json.",
@@ -967,7 +967,7 @@
967
967
  },
968
968
  "hasDynamicHelp": false,
969
969
  "hiddenAliases": [],
970
- "id": "auth:connections",
970
+ "id": "billing:subscription",
971
971
  "pluginAlias": "faces-cli",
972
972
  "pluginName": "faces-cli",
973
973
  "pluginType": "core",
@@ -977,26 +977,14 @@
977
977
  "relativePath": [
978
978
  "dist",
979
979
  "commands",
980
- "auth",
981
- "connections.js"
980
+ "billing",
981
+ "subscription.js"
982
982
  ]
983
983
  },
984
- "auth:disconnect": {
984
+ "billing:topup": {
985
985
  "aliases": [],
986
- "args": {
987
- "provider": {
988
- "description": "OAuth provider to disconnect",
989
- "name": "provider",
990
- "options": [
991
- "openai"
992
- ],
993
- "required": true
994
- }
995
- },
996
- "description": "Disconnect a linked OAuth provider account",
997
- "examples": [
998
- "<%= config.bin %> auth disconnect openai"
999
- ],
986
+ "args": {},
987
+ "description": "Top up credit balance using saved payment method",
1000
988
  "flags": {
1001
989
  "json": {
1002
990
  "description": "Format output as json.",
@@ -1028,11 +1016,26 @@
1028
1016
  "hasDynamicHelp": false,
1029
1017
  "multiple": false,
1030
1018
  "type": "option"
1019
+ },
1020
+ "amount": {
1021
+ "description": "Top-up amount in USD (min $1)",
1022
+ "name": "amount",
1023
+ "required": true,
1024
+ "hasDynamicHelp": false,
1025
+ "multiple": false,
1026
+ "type": "option"
1027
+ },
1028
+ "payment-ref": {
1029
+ "description": "Payment reference (admin/test path)",
1030
+ "name": "payment-ref",
1031
+ "hasDynamicHelp": false,
1032
+ "multiple": false,
1033
+ "type": "option"
1031
1034
  }
1032
1035
  },
1033
1036
  "hasDynamicHelp": false,
1034
1037
  "hiddenAliases": [],
1035
- "id": "auth:disconnect",
1038
+ "id": "billing:topup",
1036
1039
  "pluginAlias": "faces-cli",
1037
1040
  "pluginName": "faces-cli",
1038
1041
  "pluginType": "core",
@@ -1042,14 +1045,14 @@
1042
1045
  "relativePath": [
1043
1046
  "dist",
1044
1047
  "commands",
1045
- "auth",
1046
- "disconnect.js"
1048
+ "billing",
1049
+ "topup.js"
1047
1050
  ]
1048
1051
  },
1049
- "auth:login": {
1052
+ "billing:usage": {
1050
1053
  "aliases": [],
1051
1054
  "args": {},
1052
- "description": "Login and save JWT credentials",
1055
+ "description": "Aggregated usage analytics",
1053
1056
  "flags": {
1054
1057
  "json": {
1055
1058
  "description": "Format output as json.",
@@ -1082,18 +1085,29 @@
1082
1085
  "multiple": false,
1083
1086
  "type": "option"
1084
1087
  },
1085
- "email": {
1086
- "description": "Account email",
1087
- "name": "email",
1088
- "required": true,
1088
+ "group-by": {
1089
+ "description": "Group results",
1090
+ "name": "group-by",
1089
1091
  "hasDynamicHelp": false,
1090
1092
  "multiple": false,
1093
+ "options": [
1094
+ "api_key",
1095
+ "model",
1096
+ "llm",
1097
+ "date"
1098
+ ],
1091
1099
  "type": "option"
1092
1100
  },
1093
- "password": {
1094
- "description": "Account password",
1095
- "name": "password",
1096
- "required": true,
1101
+ "from": {
1102
+ "description": "Start date (YYYY-MM-DD)",
1103
+ "name": "from",
1104
+ "hasDynamicHelp": false,
1105
+ "multiple": false,
1106
+ "type": "option"
1107
+ },
1108
+ "to": {
1109
+ "description": "End date (YYYY-MM-DD)",
1110
+ "name": "to",
1097
1111
  "hasDynamicHelp": false,
1098
1112
  "multiple": false,
1099
1113
  "type": "option"
@@ -1101,7 +1115,7 @@
1101
1115
  },
1102
1116
  "hasDynamicHelp": false,
1103
1117
  "hiddenAliases": [],
1104
- "id": "auth:login",
1118
+ "id": "billing:usage",
1105
1119
  "pluginAlias": "faces-cli",
1106
1120
  "pluginName": "faces-cli",
1107
1121
  "pluginType": "core",
@@ -1111,14 +1125,14 @@
1111
1125
  "relativePath": [
1112
1126
  "dist",
1113
1127
  "commands",
1114
- "auth",
1115
- "login.js"
1128
+ "billing",
1129
+ "usage.js"
1116
1130
  ]
1117
1131
  },
1118
- "auth:logout": {
1132
+ "catalog:backup": {
1119
1133
  "aliases": [],
1120
1134
  "args": {},
1121
- "description": "Clear saved credentials",
1135
+ "description": "Snapshot all faces and source material for migration",
1122
1136
  "flags": {
1123
1137
  "json": {
1124
1138
  "description": "Format output as json.",
@@ -1154,7 +1168,7 @@
1154
1168
  },
1155
1169
  "hasDynamicHelp": false,
1156
1170
  "hiddenAliases": [],
1157
- "id": "auth:logout",
1171
+ "id": "catalog:backup",
1158
1172
  "pluginAlias": "faces-cli",
1159
1173
  "pluginName": "faces-cli",
1160
1174
  "pluginType": "core",
@@ -1164,14 +1178,14 @@
1164
1178
  "relativePath": [
1165
1179
  "dist",
1166
1180
  "commands",
1167
- "auth",
1168
- "logout.js"
1181
+ "catalog",
1182
+ "backup.js"
1169
1183
  ]
1170
1184
  },
1171
- "auth:refresh": {
1185
+ "catalog:doctor": {
1172
1186
  "aliases": [],
1173
1187
  "args": {},
1174
- "description": "Exchange current JWT for a fresh one",
1188
+ "description": "Diagnose and repair the local face catalog",
1175
1189
  "flags": {
1176
1190
  "json": {
1177
1191
  "description": "Format output as json.",
@@ -1203,11 +1217,23 @@
1203
1217
  "hasDynamicHelp": false,
1204
1218
  "multiple": false,
1205
1219
  "type": "option"
1220
+ },
1221
+ "fix": {
1222
+ "description": "Rebuild missing or stale catalog entries from API",
1223
+ "name": "fix",
1224
+ "allowNo": false,
1225
+ "type": "boolean"
1226
+ },
1227
+ "generate": {
1228
+ "description": "Fix + generate missing descriptions via LLM",
1229
+ "name": "generate",
1230
+ "allowNo": false,
1231
+ "type": "boolean"
1206
1232
  }
1207
1233
  },
1208
1234
  "hasDynamicHelp": false,
1209
1235
  "hiddenAliases": [],
1210
- "id": "auth:refresh",
1236
+ "id": "catalog:doctor",
1211
1237
  "pluginAlias": "faces-cli",
1212
1238
  "pluginName": "faces-cli",
1213
1239
  "pluginType": "core",
@@ -1217,14 +1243,14 @@
1217
1243
  "relativePath": [
1218
1244
  "dist",
1219
1245
  "commands",
1220
- "auth",
1221
- "refresh.js"
1246
+ "catalog",
1247
+ "doctor.js"
1222
1248
  ]
1223
1249
  },
1224
- "auth:register": {
1250
+ "catalog:list": {
1225
1251
  "aliases": [],
1226
1252
  "args": {},
1227
- "description": "Create a new Faces account",
1253
+ "description": "List all faces in the local catalog",
1228
1254
  "flags": {
1229
1255
  "json": {
1230
1256
  "description": "Format output as json.",
@@ -1256,61 +1282,91 @@
1256
1282
  "hasDynamicHelp": false,
1257
1283
  "multiple": false,
1258
1284
  "type": "option"
1259
- },
1260
- "email": {
1261
- "description": "Email address",
1262
- "name": "email",
1263
- "required": true,
1264
- "hasDynamicHelp": false,
1265
- "multiple": false,
1266
- "type": "option"
1267
- },
1268
- "password": {
1269
- "description": "Password",
1270
- "name": "password",
1271
- "required": true,
1285
+ }
1286
+ },
1287
+ "hasDynamicHelp": false,
1288
+ "hiddenAliases": [],
1289
+ "id": "catalog:list",
1290
+ "pluginAlias": "faces-cli",
1291
+ "pluginName": "faces-cli",
1292
+ "pluginType": "core",
1293
+ "strict": true,
1294
+ "enableJsonFlag": true,
1295
+ "isESM": true,
1296
+ "relativePath": [
1297
+ "dist",
1298
+ "commands",
1299
+ "catalog",
1300
+ "list.js"
1301
+ ]
1302
+ },
1303
+ "catalog:manyfaced": {
1304
+ "aliases": [],
1305
+ "args": {},
1306
+ "description": "Browse and install community manyfaced skills from github.com/facessh/manyfaced",
1307
+ "flags": {
1308
+ "json": {
1309
+ "description": "Format output as json.",
1310
+ "helpGroup": "GLOBAL",
1311
+ "name": "json",
1312
+ "allowNo": false,
1313
+ "type": "boolean"
1314
+ },
1315
+ "base-url": {
1316
+ "description": "API base URL",
1317
+ "env": "FACES_BASE_URL",
1318
+ "name": "base-url",
1272
1319
  "hasDynamicHelp": false,
1273
1320
  "multiple": false,
1274
1321
  "type": "option"
1275
1322
  },
1276
- "name": {
1277
- "description": "Display name (defaults to username)",
1278
- "name": "name",
1323
+ "token": {
1324
+ "description": "JWT bearer token",
1325
+ "env": "FACES_TOKEN",
1326
+ "name": "token",
1279
1327
  "hasDynamicHelp": false,
1280
1328
  "multiple": false,
1281
1329
  "type": "option"
1282
1330
  },
1283
- "username": {
1284
- "description": "Username (lowercase, dashes, numbers)",
1285
- "name": "username",
1286
- "required": true,
1331
+ "api-key": {
1332
+ "description": "API key",
1333
+ "env": "FACES_API_KEY",
1334
+ "name": "api-key",
1287
1335
  "hasDynamicHelp": false,
1288
1336
  "multiple": false,
1289
1337
  "type": "option"
1290
1338
  },
1291
- "invite-key": {
1292
- "description": "Invite key (if required)",
1293
- "name": "invite-key",
1339
+ "skill": {
1340
+ "description": "Show details for a specific skill",
1341
+ "name": "skill",
1294
1342
  "hasDynamicHelp": false,
1295
1343
  "multiple": false,
1296
1344
  "type": "option"
1297
1345
  },
1298
- "plan": {
1299
- "description": "Plan to subscribe to: \"free\" ($5 activation) or \"connect\" ($17/mo, no activation fee)",
1300
- "name": "plan",
1301
- "default": "free",
1346
+ "install": {
1347
+ "description": "Install a skill by name",
1348
+ "name": "install",
1302
1349
  "hasDynamicHelp": false,
1303
1350
  "multiple": false,
1304
- "options": [
1305
- "free",
1306
- "connect"
1307
- ],
1308
1351
  "type": "option"
1352
+ },
1353
+ "skills-dir": {
1354
+ "description": "Directory to install skills into (required for --install)",
1355
+ "name": "skills-dir",
1356
+ "hasDynamicHelp": false,
1357
+ "multiple": false,
1358
+ "type": "option"
1359
+ },
1360
+ "refresh": {
1361
+ "description": "Force refresh the skill index (ignore cache)",
1362
+ "name": "refresh",
1363
+ "allowNo": false,
1364
+ "type": "boolean"
1309
1365
  }
1310
1366
  },
1311
1367
  "hasDynamicHelp": false,
1312
1368
  "hiddenAliases": [],
1313
- "id": "auth:register",
1369
+ "id": "catalog:manyfaced",
1314
1370
  "pluginAlias": "faces-cli",
1315
1371
  "pluginName": "faces-cli",
1316
1372
  "pluginType": "core",
@@ -1320,14 +1376,19 @@
1320
1376
  "relativePath": [
1321
1377
  "dist",
1322
1378
  "commands",
1323
- "auth",
1324
- "register.js"
1379
+ "catalog",
1380
+ "manyfaced.js"
1325
1381
  ]
1326
1382
  },
1327
- "auth:whoami": {
1383
+ "catalog:restore": {
1328
1384
  "aliases": [],
1329
- "args": {},
1330
- "description": "Print current user profile and auth diagnostic",
1385
+ "args": {
1386
+ "file": {
1387
+ "description": "Backup file path (default: most recent in ~/.faces/backups/)",
1388
+ "name": "file"
1389
+ }
1390
+ },
1391
+ "description": "Restore faces and source material from a backup snapshot",
1331
1392
  "flags": {
1332
1393
  "json": {
1333
1394
  "description": "Format output as json.",
@@ -1359,11 +1420,17 @@
1359
1420
  "hasDynamicHelp": false,
1360
1421
  "multiple": false,
1361
1422
  "type": "option"
1423
+ },
1424
+ "compile": {
1425
+ "description": "Run compile:all after restoring",
1426
+ "name": "compile",
1427
+ "allowNo": false,
1428
+ "type": "boolean"
1362
1429
  }
1363
1430
  },
1364
1431
  "hasDynamicHelp": false,
1365
1432
  "hiddenAliases": [],
1366
- "id": "auth:whoami",
1433
+ "id": "catalog:restore",
1367
1434
  "pluginAlias": "faces-cli",
1368
1435
  "pluginName": "faces-cli",
1369
1436
  "pluginType": "core",
@@ -1373,8 +1440,8 @@
1373
1440
  "relativePath": [
1374
1441
  "dist",
1375
1442
  "commands",
1376
- "auth",
1377
- "whoami.js"
1443
+ "catalog",
1444
+ "restore.js"
1378
1445
  ]
1379
1446
  },
1380
1447
  "chat:chat": {
@@ -1474,6 +1541,12 @@
1474
1541
  "name": "responses",
1475
1542
  "allowNo": false,
1476
1543
  "type": "boolean"
1544
+ },
1545
+ "oauth-only": {
1546
+ "description": "Prevent fallback to paid system key (use OAuth only)",
1547
+ "name": "oauth-only",
1548
+ "allowNo": false,
1549
+ "type": "boolean"
1477
1550
  }
1478
1551
  },
1479
1552
  "hasDynamicHelp": false,
@@ -1563,6 +1636,12 @@
1563
1636
  "hasDynamicHelp": false,
1564
1637
  "multiple": false,
1565
1638
  "type": "option"
1639
+ },
1640
+ "oauth-only": {
1641
+ "description": "Prevent fallback to paid system key (use OAuth only)",
1642
+ "name": "oauth-only",
1643
+ "allowNo": false,
1644
+ "type": "boolean"
1566
1645
  }
1567
1646
  },
1568
1647
  "hasDynamicHelp": false,
@@ -1644,6 +1723,12 @@
1644
1723
  "name": "stream",
1645
1724
  "allowNo": false,
1646
1725
  "type": "boolean"
1726
+ },
1727
+ "oauth-only": {
1728
+ "description": "Prevent fallback to paid system key (use OAuth only)",
1729
+ "name": "oauth-only",
1730
+ "allowNo": false,
1731
+ "type": "boolean"
1647
1732
  }
1648
1733
  },
1649
1734
  "hasDynamicHelp": false,
@@ -2107,10 +2192,10 @@
2107
2192
  "show.js"
2108
2193
  ]
2109
2194
  },
2110
- "face:attributes": {
2195
+ "keys:create": {
2111
2196
  "aliases": [],
2112
2197
  "args": {},
2113
- "description": "List all supported attribute keys",
2198
+ "description": "Create a new API key (JWT required)",
2114
2199
  "flags": {
2115
2200
  "json": {
2116
2201
  "description": "Format output as json.",
@@ -2142,11 +2227,47 @@
2142
2227
  "hasDynamicHelp": false,
2143
2228
  "multiple": false,
2144
2229
  "type": "option"
2230
+ },
2231
+ "name": {
2232
+ "description": "Key name/label",
2233
+ "name": "name",
2234
+ "required": true,
2235
+ "hasDynamicHelp": false,
2236
+ "multiple": false,
2237
+ "type": "option"
2238
+ },
2239
+ "expires-days": {
2240
+ "description": "Expiry in days (omit for no expiry)",
2241
+ "name": "expires-days",
2242
+ "hasDynamicHelp": false,
2243
+ "multiple": false,
2244
+ "type": "option"
2245
+ },
2246
+ "budget": {
2247
+ "description": "Spend budget in USD",
2248
+ "name": "budget",
2249
+ "hasDynamicHelp": false,
2250
+ "multiple": false,
2251
+ "type": "option"
2252
+ },
2253
+ "face": {
2254
+ "description": "Allowed face alias (repeatable)",
2255
+ "name": "face",
2256
+ "hasDynamicHelp": false,
2257
+ "multiple": true,
2258
+ "type": "option"
2259
+ },
2260
+ "model": {
2261
+ "description": "Allowed model name (repeatable)",
2262
+ "name": "model",
2263
+ "hasDynamicHelp": false,
2264
+ "multiple": true,
2265
+ "type": "option"
2145
2266
  }
2146
2267
  },
2147
2268
  "hasDynamicHelp": false,
2148
2269
  "hiddenAliases": [],
2149
- "id": "face:attributes",
2270
+ "id": "keys:create",
2150
2271
  "pluginAlias": "faces-cli",
2151
2272
  "pluginName": "faces-cli",
2152
2273
  "pluginType": "core",
@@ -2156,14 +2277,14 @@
2156
2277
  "relativePath": [
2157
2278
  "dist",
2158
2279
  "commands",
2159
- "face",
2160
- "attributes.js"
2280
+ "keys",
2281
+ "create.js"
2161
2282
  ]
2162
2283
  },
2163
- "face:create": {
2284
+ "keys:list": {
2164
2285
  "aliases": [],
2165
2286
  "args": {},
2166
- "description": "Create a new face",
2287
+ "description": "List all API keys (JWT required)",
2167
2288
  "flags": {
2168
2289
  "json": {
2169
2290
  "description": "Format output as json.",
@@ -2195,62 +2316,11 @@
2195
2316
  "hasDynamicHelp": false,
2196
2317
  "multiple": false,
2197
2318
  "type": "option"
2198
- },
2199
- "name": {
2200
- "description": "Display name",
2201
- "name": "name",
2202
- "required": true,
2203
- "hasDynamicHelp": false,
2204
- "multiple": false,
2205
- "type": "option"
2206
- },
2207
- "alias": {
2208
- "description": "Unique alias slug",
2209
- "name": "alias",
2210
- "required": true,
2211
- "hasDynamicHelp": false,
2212
- "multiple": false,
2213
- "type": "option"
2214
- },
2215
- "description": {
2216
- "description": "Description for local catalog",
2217
- "name": "description",
2218
- "hasDynamicHelp": false,
2219
- "multiple": false,
2220
- "type": "option"
2221
- },
2222
- "default-model": {
2223
- "description": "Default LLM for chat (e.g. gpt-4o-mini, claude-sonnet-4-6)",
2224
- "name": "default-model",
2225
- "hasDynamicHelp": false,
2226
- "multiple": false,
2227
- "type": "option"
2228
- },
2229
- "formula": {
2230
- "description": "Boolean formula over owned concrete face aliases (e.g. \"a | b\", \"(a | b) - c\"). Creates a composite face.",
2231
- "name": "formula",
2232
- "hasDynamicHelp": false,
2233
- "multiple": false,
2234
- "type": "option"
2235
- },
2236
- "attr": {
2237
- "description": "Attribute KEY=VALUE (repeatable)",
2238
- "name": "attr",
2239
- "hasDynamicHelp": false,
2240
- "multiple": true,
2241
- "type": "option"
2242
- },
2243
- "tool": {
2244
- "description": "Tool name to enable (repeatable)",
2245
- "name": "tool",
2246
- "hasDynamicHelp": false,
2247
- "multiple": true,
2248
- "type": "option"
2249
2319
  }
2250
2320
  },
2251
2321
  "hasDynamicHelp": false,
2252
2322
  "hiddenAliases": [],
2253
- "id": "face:create",
2323
+ "id": "keys:list",
2254
2324
  "pluginAlias": "faces-cli",
2255
2325
  "pluginName": "faces-cli",
2256
2326
  "pluginType": "core",
@@ -2260,20 +2330,20 @@
2260
2330
  "relativePath": [
2261
2331
  "dist",
2262
2332
  "commands",
2263
- "face",
2264
- "create.js"
2333
+ "keys",
2334
+ "list.js"
2265
2335
  ]
2266
2336
  },
2267
- "face:delete": {
2337
+ "keys:revoke": {
2268
2338
  "aliases": [],
2269
2339
  "args": {
2270
- "face_id": {
2271
- "description": "Face alias",
2272
- "name": "face_id",
2340
+ "key_id": {
2341
+ "description": "Key ID",
2342
+ "name": "key_id",
2273
2343
  "required": true
2274
2344
  }
2275
2345
  },
2276
- "description": "Delete a face permanently",
2346
+ "description": "Revoke an API key (JWT required)",
2277
2347
  "flags": {
2278
2348
  "json": {
2279
2349
  "description": "Format output as json.",
@@ -2315,7 +2385,7 @@
2315
2385
  },
2316
2386
  "hasDynamicHelp": false,
2317
2387
  "hiddenAliases": [],
2318
- "id": "face:delete",
2388
+ "id": "keys:revoke",
2319
2389
  "pluginAlias": "faces-cli",
2320
2390
  "pluginName": "faces-cli",
2321
2391
  "pluginType": "core",
@@ -2325,14 +2395,20 @@
2325
2395
  "relativePath": [
2326
2396
  "dist",
2327
2397
  "commands",
2328
- "face",
2329
- "delete.js"
2398
+ "keys",
2399
+ "revoke.js"
2330
2400
  ]
2331
2401
  },
2332
- "face:diff": {
2402
+ "keys:update": {
2333
2403
  "aliases": [],
2334
- "args": {},
2335
- "description": "Compare owned faces pairwise across all centroid components",
2404
+ "args": {
2405
+ "key_id": {
2406
+ "description": "Key ID",
2407
+ "name": "key_id",
2408
+ "required": true
2409
+ }
2410
+ },
2411
+ "description": "Update API key metadata (JWT required)",
2336
2412
  "flags": {
2337
2413
  "json": {
2338
2414
  "description": "Format output as json.",
@@ -2365,18 +2441,30 @@
2365
2441
  "multiple": false,
2366
2442
  "type": "option"
2367
2443
  },
2368
- "face": {
2369
- "description": "Face alias to include (repeatable, min 2)",
2370
- "name": "face",
2371
- "required": true,
2444
+ "name": {
2445
+ "description": "New key name",
2446
+ "name": "name",
2372
2447
  "hasDynamicHelp": false,
2373
- "multiple": true,
2448
+ "multiple": false,
2374
2449
  "type": "option"
2450
+ },
2451
+ "budget": {
2452
+ "description": "New spend budget in USD",
2453
+ "name": "budget",
2454
+ "hasDynamicHelp": false,
2455
+ "multiple": false,
2456
+ "type": "option"
2457
+ },
2458
+ "reset-spent": {
2459
+ "description": "Reset spent amount to zero",
2460
+ "name": "reset-spent",
2461
+ "allowNo": false,
2462
+ "type": "boolean"
2375
2463
  }
2376
2464
  },
2377
2465
  "hasDynamicHelp": false,
2378
2466
  "hiddenAliases": [],
2379
- "id": "face:diff",
2467
+ "id": "keys:update",
2380
2468
  "pluginAlias": "faces-cli",
2381
2469
  "pluginName": "faces-cli",
2382
2470
  "pluginType": "core",
@@ -2386,20 +2474,14 @@
2386
2474
  "relativePath": [
2387
2475
  "dist",
2388
2476
  "commands",
2389
- "face",
2390
- "diff.js"
2477
+ "keys",
2478
+ "update.js"
2391
2479
  ]
2392
2480
  },
2393
- "face:get": {
2481
+ "face:attributes": {
2394
2482
  "aliases": [],
2395
- "args": {
2396
- "face_id": {
2397
- "description": "Face alias",
2398
- "name": "face_id",
2399
- "required": true
2400
- }
2401
- },
2402
- "description": "Get details for a face by alias",
2483
+ "args": {},
2484
+ "description": "List all supported attribute keys",
2403
2485
  "flags": {
2404
2486
  "json": {
2405
2487
  "description": "Format output as json.",
@@ -2435,7 +2517,7 @@
2435
2517
  },
2436
2518
  "hasDynamicHelp": false,
2437
2519
  "hiddenAliases": [],
2438
- "id": "face:get",
2520
+ "id": "face:attributes",
2439
2521
  "pluginAlias": "faces-cli",
2440
2522
  "pluginName": "faces-cli",
2441
2523
  "pluginType": "core",
@@ -2446,13 +2528,13 @@
2446
2528
  "dist",
2447
2529
  "commands",
2448
2530
  "face",
2449
- "get.js"
2531
+ "attributes.js"
2450
2532
  ]
2451
2533
  },
2452
- "face:list": {
2534
+ "face:create": {
2453
2535
  "aliases": [],
2454
2536
  "args": {},
2455
- "description": "List all owned faces",
2537
+ "description": "Create a new face",
2456
2538
  "flags": {
2457
2539
  "json": {
2458
2540
  "description": "Format output as json.",
@@ -2484,11 +2566,62 @@
2484
2566
  "hasDynamicHelp": false,
2485
2567
  "multiple": false,
2486
2568
  "type": "option"
2569
+ },
2570
+ "name": {
2571
+ "description": "Display name",
2572
+ "name": "name",
2573
+ "required": true,
2574
+ "hasDynamicHelp": false,
2575
+ "multiple": false,
2576
+ "type": "option"
2577
+ },
2578
+ "alias": {
2579
+ "description": "Unique alias slug",
2580
+ "name": "alias",
2581
+ "required": true,
2582
+ "hasDynamicHelp": false,
2583
+ "multiple": false,
2584
+ "type": "option"
2585
+ },
2586
+ "description": {
2587
+ "description": "Description for local catalog",
2588
+ "name": "description",
2589
+ "hasDynamicHelp": false,
2590
+ "multiple": false,
2591
+ "type": "option"
2592
+ },
2593
+ "default-model": {
2594
+ "description": "Default LLM for chat (e.g. gpt-4o-mini, claude-sonnet-4-6)",
2595
+ "name": "default-model",
2596
+ "hasDynamicHelp": false,
2597
+ "multiple": false,
2598
+ "type": "option"
2599
+ },
2600
+ "formula": {
2601
+ "description": "Boolean formula over owned concrete face aliases (e.g. \"a | b\", \"(a | b) - c\"). Creates a composite face.",
2602
+ "name": "formula",
2603
+ "hasDynamicHelp": false,
2604
+ "multiple": false,
2605
+ "type": "option"
2606
+ },
2607
+ "attr": {
2608
+ "description": "Attribute KEY=VALUE (repeatable)",
2609
+ "name": "attr",
2610
+ "hasDynamicHelp": false,
2611
+ "multiple": true,
2612
+ "type": "option"
2613
+ },
2614
+ "tool": {
2615
+ "description": "Tool name to enable (repeatable)",
2616
+ "name": "tool",
2617
+ "hasDynamicHelp": false,
2618
+ "multiple": true,
2619
+ "type": "option"
2487
2620
  }
2488
2621
  },
2489
2622
  "hasDynamicHelp": false,
2490
2623
  "hiddenAliases": [],
2491
- "id": "face:list",
2624
+ "id": "face:create",
2492
2625
  "pluginAlias": "faces-cli",
2493
2626
  "pluginName": "faces-cli",
2494
2627
  "pluginType": "core",
@@ -2499,10 +2632,10 @@
2499
2632
  "dist",
2500
2633
  "commands",
2501
2634
  "face",
2502
- "list.js"
2635
+ "create.js"
2503
2636
  ]
2504
2637
  },
2505
- "face:neighbors": {
2638
+ "face:delete": {
2506
2639
  "aliases": [],
2507
2640
  "args": {
2508
2641
  "face_id": {
@@ -2511,7 +2644,7 @@
2511
2644
  "required": true
2512
2645
  }
2513
2646
  },
2514
- "description": "Find the most similar or dissimilar owned faces to a given face",
2647
+ "description": "Delete a face permanently",
2515
2648
  "flags": {
2516
2649
  "json": {
2517
2650
  "description": "Format output as json.",
@@ -2544,44 +2677,16 @@
2544
2677
  "multiple": false,
2545
2678
  "type": "option"
2546
2679
  },
2547
- "k": {
2548
- "description": "Number of results (1–20)",
2549
- "name": "k",
2550
- "default": 5,
2551
- "hasDynamicHelp": false,
2552
- "multiple": false,
2553
- "type": "option"
2554
- },
2555
- "component": {
2556
- "description": "Centroid component to rank on (beta, delta, epsilon are the principal components of a face; face is their composite)",
2557
- "name": "component",
2558
- "default": "face",
2559
- "hasDynamicHelp": false,
2560
- "multiple": false,
2561
- "options": [
2562
- "face",
2563
- "beta",
2564
- "delta",
2565
- "epsilon"
2566
- ],
2567
- "type": "option"
2568
- },
2569
- "direction": {
2570
- "description": "nearest (most similar) or furthest (most dissimilar)",
2571
- "name": "direction",
2572
- "default": "nearest",
2573
- "hasDynamicHelp": false,
2574
- "multiple": false,
2575
- "options": [
2576
- "nearest",
2577
- "furthest"
2578
- ],
2579
- "type": "option"
2680
+ "yes": {
2681
+ "description": "Skip confirmation",
2682
+ "name": "yes",
2683
+ "allowNo": false,
2684
+ "type": "boolean"
2580
2685
  }
2581
2686
  },
2582
2687
  "hasDynamicHelp": false,
2583
2688
  "hiddenAliases": [],
2584
- "id": "face:neighbors",
2689
+ "id": "face:delete",
2585
2690
  "pluginAlias": "faces-cli",
2586
2691
  "pluginName": "faces-cli",
2587
2692
  "pluginType": "core",
@@ -2592,13 +2697,13 @@
2592
2697
  "dist",
2593
2698
  "commands",
2594
2699
  "face",
2595
- "neighbors.js"
2700
+ "delete.js"
2596
2701
  ]
2597
2702
  },
2598
- "face:stats": {
2703
+ "face:diff": {
2599
2704
  "aliases": [],
2600
2705
  "args": {},
2601
- "description": "Compile and chat stats for all owned faces",
2706
+ "description": "Compare owned faces pairwise across all centroid components",
2602
2707
  "flags": {
2603
2708
  "json": {
2604
2709
  "description": "Format output as json.",
@@ -2630,11 +2735,19 @@
2630
2735
  "hasDynamicHelp": false,
2631
2736
  "multiple": false,
2632
2737
  "type": "option"
2738
+ },
2739
+ "face": {
2740
+ "description": "Face alias to include (repeatable, min 2)",
2741
+ "name": "face",
2742
+ "required": true,
2743
+ "hasDynamicHelp": false,
2744
+ "multiple": true,
2745
+ "type": "option"
2633
2746
  }
2634
2747
  },
2635
2748
  "hasDynamicHelp": false,
2636
2749
  "hiddenAliases": [],
2637
- "id": "face:stats",
2750
+ "id": "face:diff",
2638
2751
  "pluginAlias": "faces-cli",
2639
2752
  "pluginName": "faces-cli",
2640
2753
  "pluginType": "core",
@@ -2645,10 +2758,10 @@
2645
2758
  "dist",
2646
2759
  "commands",
2647
2760
  "face",
2648
- "stats.js"
2761
+ "diff.js"
2649
2762
  ]
2650
2763
  },
2651
- "face:update": {
2764
+ "face:get": {
2652
2765
  "aliases": [],
2653
2766
  "args": {
2654
2767
  "face_id": {
@@ -2657,7 +2770,7 @@
2657
2770
  "required": true
2658
2771
  }
2659
2772
  },
2660
- "description": "Update a face's metadata",
2773
+ "description": "Get details for a face by alias",
2661
2774
  "flags": {
2662
2775
  "json": {
2663
2776
  "description": "Format output as json.",
@@ -2689,53 +2802,11 @@
2689
2802
  "hasDynamicHelp": false,
2690
2803
  "multiple": false,
2691
2804
  "type": "option"
2692
- },
2693
- "name": {
2694
- "description": "New display name",
2695
- "name": "name",
2696
- "hasDynamicHelp": false,
2697
- "multiple": false,
2698
- "type": "option"
2699
- },
2700
- "description": {
2701
- "description": "Description for local catalog",
2702
- "name": "description",
2703
- "hasDynamicHelp": false,
2704
- "multiple": false,
2705
- "type": "option"
2706
- },
2707
- "default-model": {
2708
- "description": "Default LLM for chat (e.g. gpt-4o-mini, claude-sonnet-4-6)",
2709
- "name": "default-model",
2710
- "hasDynamicHelp": false,
2711
- "multiple": false,
2712
- "type": "option"
2713
- },
2714
- "formula": {
2715
- "description": "New boolean formula (synthetic faces only)",
2716
- "name": "formula",
2717
- "hasDynamicHelp": false,
2718
- "multiple": false,
2719
- "type": "option"
2720
- },
2721
- "attr": {
2722
- "description": "Update attribute KEY=VALUE (repeatable)",
2723
- "name": "attr",
2724
- "hasDynamicHelp": false,
2725
- "multiple": true,
2726
- "type": "option"
2727
- },
2728
- "tool": {
2729
- "description": "Tool names to set (replaces list, repeatable)",
2730
- "name": "tool",
2731
- "hasDynamicHelp": false,
2732
- "multiple": true,
2733
- "type": "option"
2734
2805
  }
2735
2806
  },
2736
2807
  "hasDynamicHelp": false,
2737
2808
  "hiddenAliases": [],
2738
- "id": "face:update",
2809
+ "id": "face:get",
2739
2810
  "pluginAlias": "faces-cli",
2740
2811
  "pluginName": "faces-cli",
2741
2812
  "pluginType": "core",
@@ -2746,19 +2817,13 @@
2746
2817
  "dist",
2747
2818
  "commands",
2748
2819
  "face",
2749
- "update.js"
2820
+ "get.js"
2750
2821
  ]
2751
2822
  },
2752
- "face:upload": {
2823
+ "face:list": {
2753
2824
  "aliases": [],
2754
- "args": {
2755
- "face_id": {
2756
- "description": "Face alias",
2757
- "name": "face_id",
2758
- "required": true
2759
- }
2760
- },
2761
- "description": "Upload a file (text/PDF/audio/video) to a face",
2825
+ "args": {},
2826
+ "description": "List all owned faces",
2762
2827
  "flags": {
2763
2828
  "json": {
2764
2829
  "description": "Format output as json.",
@@ -2790,50 +2855,11 @@
2790
2855
  "hasDynamicHelp": false,
2791
2856
  "multiple": false,
2792
2857
  "type": "option"
2793
- },
2794
- "file": {
2795
- "description": "File to upload",
2796
- "name": "file",
2797
- "required": true,
2798
- "hasDynamicHelp": false,
2799
- "multiple": false,
2800
- "type": "option"
2801
- },
2802
- "kind": {
2803
- "description": "Upload kind: document or thread",
2804
- "name": "kind",
2805
- "default": "document",
2806
- "hasDynamicHelp": false,
2807
- "multiple": false,
2808
- "options": [
2809
- "document",
2810
- "thread"
2811
- ],
2812
- "type": "option"
2813
- },
2814
- "perspective": {
2815
- "description": "Perspective (document only)",
2816
- "name": "perspective",
2817
- "default": "third-person",
2818
- "hasDynamicHelp": false,
2819
- "multiple": false,
2820
- "options": [
2821
- "first-person",
2822
- "third-person"
2823
- ],
2824
- "type": "option"
2825
- },
2826
- "face-speaker": {
2827
- "description": "Speaker name to map to the face (thread only). If omitted, first speaker is used.",
2828
- "name": "face-speaker",
2829
- "hasDynamicHelp": false,
2830
- "multiple": false,
2831
- "type": "option"
2832
2858
  }
2833
2859
  },
2834
2860
  "hasDynamicHelp": false,
2835
2861
  "hiddenAliases": [],
2836
- "id": "face:upload",
2862
+ "id": "face:list",
2837
2863
  "pluginAlias": "faces-cli",
2838
2864
  "pluginName": "faces-cli",
2839
2865
  "pluginType": "core",
@@ -2844,13 +2870,19 @@
2844
2870
  "dist",
2845
2871
  "commands",
2846
2872
  "face",
2847
- "upload.js"
2873
+ "list.js"
2848
2874
  ]
2849
2875
  },
2850
- "keys:create": {
2876
+ "face:neighbors": {
2851
2877
  "aliases": [],
2852
- "args": {},
2853
- "description": "Create a new API key (JWT required)",
2878
+ "args": {
2879
+ "face_id": {
2880
+ "description": "Face alias",
2881
+ "name": "face_id",
2882
+ "required": true
2883
+ }
2884
+ },
2885
+ "description": "Find the most similar or dissimilar owned faces to a given face",
2854
2886
  "flags": {
2855
2887
  "json": {
2856
2888
  "description": "Format output as json.",
@@ -2883,46 +2915,44 @@
2883
2915
  "multiple": false,
2884
2916
  "type": "option"
2885
2917
  },
2886
- "name": {
2887
- "description": "Key name/label",
2888
- "name": "name",
2889
- "required": true,
2918
+ "k": {
2919
+ "description": "Number of results (1–20)",
2920
+ "name": "k",
2921
+ "default": 5,
2890
2922
  "hasDynamicHelp": false,
2891
2923
  "multiple": false,
2892
2924
  "type": "option"
2893
2925
  },
2894
- "expires-days": {
2895
- "description": "Expiry in days (omit for no expiry)",
2896
- "name": "expires-days",
2926
+ "component": {
2927
+ "description": "Centroid component to rank on (beta, delta, epsilon are the principal components of a face; face is their composite)",
2928
+ "name": "component",
2929
+ "default": "face",
2897
2930
  "hasDynamicHelp": false,
2898
2931
  "multiple": false,
2932
+ "options": [
2933
+ "face",
2934
+ "beta",
2935
+ "delta",
2936
+ "epsilon"
2937
+ ],
2899
2938
  "type": "option"
2900
2939
  },
2901
- "budget": {
2902
- "description": "Spend budget in USD",
2903
- "name": "budget",
2940
+ "direction": {
2941
+ "description": "nearest (most similar) or furthest (most dissimilar)",
2942
+ "name": "direction",
2943
+ "default": "nearest",
2904
2944
  "hasDynamicHelp": false,
2905
2945
  "multiple": false,
2906
- "type": "option"
2907
- },
2908
- "face": {
2909
- "description": "Allowed face alias (repeatable)",
2910
- "name": "face",
2911
- "hasDynamicHelp": false,
2912
- "multiple": true,
2913
- "type": "option"
2914
- },
2915
- "model": {
2916
- "description": "Allowed model name (repeatable)",
2917
- "name": "model",
2918
- "hasDynamicHelp": false,
2919
- "multiple": true,
2946
+ "options": [
2947
+ "nearest",
2948
+ "furthest"
2949
+ ],
2920
2950
  "type": "option"
2921
2951
  }
2922
2952
  },
2923
2953
  "hasDynamicHelp": false,
2924
2954
  "hiddenAliases": [],
2925
- "id": "keys:create",
2955
+ "id": "face:neighbors",
2926
2956
  "pluginAlias": "faces-cli",
2927
2957
  "pluginName": "faces-cli",
2928
2958
  "pluginType": "core",
@@ -2932,14 +2962,14 @@
2932
2962
  "relativePath": [
2933
2963
  "dist",
2934
2964
  "commands",
2935
- "keys",
2936
- "create.js"
2965
+ "face",
2966
+ "neighbors.js"
2937
2967
  ]
2938
2968
  },
2939
- "keys:list": {
2969
+ "face:stats": {
2940
2970
  "aliases": [],
2941
2971
  "args": {},
2942
- "description": "List all API keys (JWT required)",
2972
+ "description": "Compile and chat stats for all owned faces",
2943
2973
  "flags": {
2944
2974
  "json": {
2945
2975
  "description": "Format output as json.",
@@ -2975,7 +3005,7 @@
2975
3005
  },
2976
3006
  "hasDynamicHelp": false,
2977
3007
  "hiddenAliases": [],
2978
- "id": "keys:list",
3008
+ "id": "face:stats",
2979
3009
  "pluginAlias": "faces-cli",
2980
3010
  "pluginName": "faces-cli",
2981
3011
  "pluginType": "core",
@@ -2985,20 +3015,20 @@
2985
3015
  "relativePath": [
2986
3016
  "dist",
2987
3017
  "commands",
2988
- "keys",
2989
- "list.js"
3018
+ "face",
3019
+ "stats.js"
2990
3020
  ]
2991
3021
  },
2992
- "keys:revoke": {
3022
+ "face:update": {
2993
3023
  "aliases": [],
2994
3024
  "args": {
2995
- "key_id": {
2996
- "description": "Key ID",
2997
- "name": "key_id",
3025
+ "face_id": {
3026
+ "description": "Face alias",
3027
+ "name": "face_id",
2998
3028
  "required": true
2999
3029
  }
3000
3030
  },
3001
- "description": "Revoke an API key (JWT required)",
3031
+ "description": "Update a face's metadata",
3002
3032
  "flags": {
3003
3033
  "json": {
3004
3034
  "description": "Format output as json.",
@@ -3031,16 +3061,52 @@
3031
3061
  "multiple": false,
3032
3062
  "type": "option"
3033
3063
  },
3034
- "yes": {
3035
- "description": "Skip confirmation",
3036
- "name": "yes",
3037
- "allowNo": false,
3038
- "type": "boolean"
3064
+ "name": {
3065
+ "description": "New display name",
3066
+ "name": "name",
3067
+ "hasDynamicHelp": false,
3068
+ "multiple": false,
3069
+ "type": "option"
3070
+ },
3071
+ "description": {
3072
+ "description": "Description for local catalog",
3073
+ "name": "description",
3074
+ "hasDynamicHelp": false,
3075
+ "multiple": false,
3076
+ "type": "option"
3077
+ },
3078
+ "default-model": {
3079
+ "description": "Default LLM for chat (e.g. gpt-4o-mini, claude-sonnet-4-6)",
3080
+ "name": "default-model",
3081
+ "hasDynamicHelp": false,
3082
+ "multiple": false,
3083
+ "type": "option"
3084
+ },
3085
+ "formula": {
3086
+ "description": "New boolean formula (synthetic faces only)",
3087
+ "name": "formula",
3088
+ "hasDynamicHelp": false,
3089
+ "multiple": false,
3090
+ "type": "option"
3091
+ },
3092
+ "attr": {
3093
+ "description": "Update attribute KEY=VALUE (repeatable)",
3094
+ "name": "attr",
3095
+ "hasDynamicHelp": false,
3096
+ "multiple": true,
3097
+ "type": "option"
3098
+ },
3099
+ "tool": {
3100
+ "description": "Tool names to set (replaces list, repeatable)",
3101
+ "name": "tool",
3102
+ "hasDynamicHelp": false,
3103
+ "multiple": true,
3104
+ "type": "option"
3039
3105
  }
3040
3106
  },
3041
3107
  "hasDynamicHelp": false,
3042
3108
  "hiddenAliases": [],
3043
- "id": "keys:revoke",
3109
+ "id": "face:update",
3044
3110
  "pluginAlias": "faces-cli",
3045
3111
  "pluginName": "faces-cli",
3046
3112
  "pluginType": "core",
@@ -3050,20 +3116,20 @@
3050
3116
  "relativePath": [
3051
3117
  "dist",
3052
3118
  "commands",
3053
- "keys",
3054
- "revoke.js"
3119
+ "face",
3120
+ "update.js"
3055
3121
  ]
3056
3122
  },
3057
- "keys:update": {
3123
+ "face:upload": {
3058
3124
  "aliases": [],
3059
3125
  "args": {
3060
- "key_id": {
3061
- "description": "Key ID",
3062
- "name": "key_id",
3126
+ "face_id": {
3127
+ "description": "Face alias",
3128
+ "name": "face_id",
3063
3129
  "required": true
3064
3130
  }
3065
3131
  },
3066
- "description": "Update API key metadata (JWT required)",
3132
+ "description": "Upload a file (text/PDF/audio/video) to a face",
3067
3133
  "flags": {
3068
3134
  "json": {
3069
3135
  "description": "Format output as json.",
@@ -3096,30 +3162,49 @@
3096
3162
  "multiple": false,
3097
3163
  "type": "option"
3098
3164
  },
3099
- "name": {
3100
- "description": "New key name",
3101
- "name": "name",
3165
+ "file": {
3166
+ "description": "File to upload",
3167
+ "name": "file",
3168
+ "required": true,
3102
3169
  "hasDynamicHelp": false,
3103
3170
  "multiple": false,
3104
3171
  "type": "option"
3105
3172
  },
3106
- "budget": {
3107
- "description": "New spend budget in USD",
3108
- "name": "budget",
3173
+ "kind": {
3174
+ "description": "Upload kind: document or thread",
3175
+ "name": "kind",
3176
+ "default": "document",
3109
3177
  "hasDynamicHelp": false,
3110
3178
  "multiple": false,
3179
+ "options": [
3180
+ "document",
3181
+ "thread"
3182
+ ],
3111
3183
  "type": "option"
3112
3184
  },
3113
- "reset-spent": {
3114
- "description": "Reset spent amount to zero",
3115
- "name": "reset-spent",
3116
- "allowNo": false,
3117
- "type": "boolean"
3185
+ "perspective": {
3186
+ "description": "Perspective (document only)",
3187
+ "name": "perspective",
3188
+ "default": "third-person",
3189
+ "hasDynamicHelp": false,
3190
+ "multiple": false,
3191
+ "options": [
3192
+ "first-person",
3193
+ "third-person"
3194
+ ],
3195
+ "type": "option"
3196
+ },
3197
+ "face-speaker": {
3198
+ "description": "Speaker name to map to the face (thread only). If omitted, first speaker is used.",
3199
+ "name": "face-speaker",
3200
+ "hasDynamicHelp": false,
3201
+ "multiple": false,
3202
+ "type": "option"
3118
3203
  }
3119
3204
  },
3120
3205
  "hasDynamicHelp": false,
3121
3206
  "hiddenAliases": [],
3122
- "id": "keys:update",
3207
+ "id": "face:upload",
3123
3208
  "pluginAlias": "faces-cli",
3124
3209
  "pluginName": "faces-cli",
3125
3210
  "pluginType": "core",
@@ -3129,8 +3214,8 @@
3129
3214
  "relativePath": [
3130
3215
  "dist",
3131
3216
  "commands",
3132
- "keys",
3133
- "update.js"
3217
+ "face",
3218
+ "upload.js"
3134
3219
  ]
3135
3220
  },
3136
3221
  "compile:doc:create": {
@@ -3853,6 +3938,12 @@
3853
3938
  "hasDynamicHelp": false,
3854
3939
  "multiple": false,
3855
3940
  "type": "option"
3941
+ },
3942
+ "oauth-only": {
3943
+ "description": "Prevent fallback to paid system key (use OAuth only)",
3944
+ "name": "oauth-only",
3945
+ "allowNo": false,
3946
+ "type": "boolean"
3856
3947
  }
3857
3948
  },
3858
3949
  "hasDynamicHelp": false,
@@ -4256,6 +4347,12 @@
4256
4347
  "hasDynamicHelp": false,
4257
4348
  "multiple": false,
4258
4349
  "type": "option"
4350
+ },
4351
+ "oauth-only": {
4352
+ "description": "Prevent fallback to paid system key (use OAuth only)",
4353
+ "name": "oauth-only",
4354
+ "allowNo": false,
4355
+ "type": "boolean"
4259
4356
  }
4260
4357
  },
4261
4358
  "hasDynamicHelp": false,
@@ -4462,5 +4559,5 @@
4462
4559
  ]
4463
4560
  }
4464
4561
  },
4465
- "version": "1.5.15"
4562
+ "version": "1.6.0"
4466
4563
  }