faces-cli 1.7.0 → 1.7.2

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.
@@ -120,10 +120,23 @@
120
120
  "state.js"
121
121
  ]
122
122
  },
123
- "catalog:backup": {
123
+ "auth:connect": {
124
124
  "aliases": [],
125
- "args": {},
126
- "description": "Snapshot all faces, teams, and source material for migration",
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 your ChatGPT account to Faces via device-code authorization (Subscription Connect plan)",
136
+ "examples": [
137
+ "<%= config.bin %> auth connect openai",
138
+ "<%= config.bin %> auth connect openai --json"
139
+ ],
127
140
  "flags": {
128
141
  "json": {
129
142
  "description": "Format output as json.",
@@ -159,7 +172,7 @@
159
172
  },
160
173
  "hasDynamicHelp": false,
161
174
  "hiddenAliases": [],
162
- "id": "catalog:backup",
175
+ "id": "auth:connect",
163
176
  "pluginAlias": "faces-cli",
164
177
  "pluginName": "faces-cli",
165
178
  "pluginType": "core",
@@ -169,14 +182,18 @@
169
182
  "relativePath": [
170
183
  "dist",
171
184
  "commands",
172
- "catalog",
173
- "backup.js"
185
+ "auth",
186
+ "connect.js"
174
187
  ]
175
188
  },
176
- "catalog:doctor": {
189
+ "auth:connections": {
177
190
  "aliases": [],
178
191
  "args": {},
179
- "description": "Diagnose and repair the local face and team catalog",
192
+ "description": "List connected OAuth provider accounts",
193
+ "examples": [
194
+ "<%= config.bin %> auth connections",
195
+ "<%= config.bin %> auth connections --json"
196
+ ],
180
197
  "flags": {
181
198
  "json": {
182
199
  "description": "Format output as json.",
@@ -208,23 +225,11 @@
208
225
  "hasDynamicHelp": false,
209
226
  "multiple": false,
210
227
  "type": "option"
211
- },
212
- "fix": {
213
- "description": "Rebuild missing or stale catalog entries from API",
214
- "name": "fix",
215
- "allowNo": false,
216
- "type": "boolean"
217
- },
218
- "generate": {
219
- "description": "Fix + generate missing descriptions via LLM",
220
- "name": "generate",
221
- "allowNo": false,
222
- "type": "boolean"
223
228
  }
224
229
  },
225
230
  "hasDynamicHelp": false,
226
231
  "hiddenAliases": [],
227
- "id": "catalog:doctor",
232
+ "id": "auth:connections",
228
233
  "pluginAlias": "faces-cli",
229
234
  "pluginName": "faces-cli",
230
235
  "pluginType": "core",
@@ -234,14 +239,26 @@
234
239
  "relativePath": [
235
240
  "dist",
236
241
  "commands",
237
- "catalog",
238
- "doctor.js"
242
+ "auth",
243
+ "connections.js"
239
244
  ]
240
245
  },
241
- "catalog:list": {
246
+ "auth:disconnect": {
242
247
  "aliases": [],
243
- "args": {},
244
- "description": "List all faces in the local catalog",
248
+ "args": {
249
+ "provider": {
250
+ "description": "OAuth provider to disconnect",
251
+ "name": "provider",
252
+ "options": [
253
+ "openai"
254
+ ],
255
+ "required": true
256
+ }
257
+ },
258
+ "description": "Disconnect a linked OAuth provider account",
259
+ "examples": [
260
+ "<%= config.bin %> auth disconnect openai"
261
+ ],
245
262
  "flags": {
246
263
  "json": {
247
264
  "description": "Format output as json.",
@@ -277,7 +294,7 @@
277
294
  },
278
295
  "hasDynamicHelp": false,
279
296
  "hiddenAliases": [],
280
- "id": "catalog:list",
297
+ "id": "auth:disconnect",
281
298
  "pluginAlias": "faces-cli",
282
299
  "pluginName": "faces-cli",
283
300
  "pluginType": "core",
@@ -287,14 +304,14 @@
287
304
  "relativePath": [
288
305
  "dist",
289
306
  "commands",
290
- "catalog",
291
- "list.js"
307
+ "auth",
308
+ "disconnect.js"
292
309
  ]
293
310
  },
294
- "catalog:manyfaced": {
311
+ "auth:login": {
295
312
  "aliases": [],
296
313
  "args": {},
297
- "description": "Browse and install community manyfaced skills from github.com/facessh/manyfaced",
314
+ "description": "Login and save JWT credentials",
298
315
  "flags": {
299
316
  "json": {
300
317
  "description": "Format output as json.",
@@ -327,37 +344,26 @@
327
344
  "multiple": false,
328
345
  "type": "option"
329
346
  },
330
- "skill": {
331
- "description": "Show details for a specific skill",
332
- "name": "skill",
333
- "hasDynamicHelp": false,
334
- "multiple": false,
335
- "type": "option"
336
- },
337
- "install": {
338
- "description": "Install a skill by name",
339
- "name": "install",
347
+ "email": {
348
+ "description": "Account email",
349
+ "name": "email",
350
+ "required": true,
340
351
  "hasDynamicHelp": false,
341
352
  "multiple": false,
342
353
  "type": "option"
343
354
  },
344
- "skills-dir": {
345
- "description": "Directory to install skills into (required for --install)",
346
- "name": "skills-dir",
355
+ "password": {
356
+ "description": "Account password",
357
+ "name": "password",
358
+ "required": true,
347
359
  "hasDynamicHelp": false,
348
360
  "multiple": false,
349
361
  "type": "option"
350
- },
351
- "refresh": {
352
- "description": "Force refresh the skill index (ignore cache)",
353
- "name": "refresh",
354
- "allowNo": false,
355
- "type": "boolean"
356
362
  }
357
363
  },
358
364
  "hasDynamicHelp": false,
359
365
  "hiddenAliases": [],
360
- "id": "catalog:manyfaced",
366
+ "id": "auth:login",
361
367
  "pluginAlias": "faces-cli",
362
368
  "pluginName": "faces-cli",
363
369
  "pluginType": "core",
@@ -367,19 +373,14 @@
367
373
  "relativePath": [
368
374
  "dist",
369
375
  "commands",
370
- "catalog",
371
- "manyfaced.js"
376
+ "auth",
377
+ "login.js"
372
378
  ]
373
379
  },
374
- "catalog:restore": {
380
+ "auth:logout": {
375
381
  "aliases": [],
376
- "args": {
377
- "file": {
378
- "description": "Backup file path (default: most recent in ~/.faces/backups/)",
379
- "name": "file"
380
- }
381
- },
382
- "description": "Restore faces, teams, and source material from a backup snapshot",
382
+ "args": {},
383
+ "description": "Clear saved credentials",
383
384
  "flags": {
384
385
  "json": {
385
386
  "description": "Format output as json.",
@@ -411,17 +412,11 @@
411
412
  "hasDynamicHelp": false,
412
413
  "multiple": false,
413
414
  "type": "option"
414
- },
415
- "compile": {
416
- "description": "Run compile:all after restoring",
417
- "name": "compile",
418
- "allowNo": false,
419
- "type": "boolean"
420
415
  }
421
416
  },
422
417
  "hasDynamicHelp": false,
423
418
  "hiddenAliases": [],
424
- "id": "catalog:restore",
419
+ "id": "auth:logout",
425
420
  "pluginAlias": "faces-cli",
426
421
  "pluginName": "faces-cli",
427
422
  "pluginType": "core",
@@ -431,27 +426,14 @@
431
426
  "relativePath": [
432
427
  "dist",
433
428
  "commands",
434
- "catalog",
435
- "restore.js"
429
+ "auth",
430
+ "logout.js"
436
431
  ]
437
432
  },
438
- "auth:connect": {
433
+ "auth:refresh": {
439
434
  "aliases": [],
440
- "args": {
441
- "provider": {
442
- "description": "OAuth provider to connect",
443
- "name": "provider",
444
- "options": [
445
- "openai"
446
- ],
447
- "required": true
448
- }
449
- },
450
- "description": "Connect your ChatGPT account to Faces via device-code authorization (Subscription Connect plan)",
451
- "examples": [
452
- "<%= config.bin %> auth connect openai",
453
- "<%= config.bin %> auth connect openai --json"
454
- ],
435
+ "args": {},
436
+ "description": "Exchange current JWT for a fresh one",
455
437
  "flags": {
456
438
  "json": {
457
439
  "description": "Format output as json.",
@@ -487,7 +469,7 @@
487
469
  },
488
470
  "hasDynamicHelp": false,
489
471
  "hiddenAliases": [],
490
- "id": "auth:connect",
472
+ "id": "auth:refresh",
491
473
  "pluginAlias": "faces-cli",
492
474
  "pluginName": "faces-cli",
493
475
  "pluginType": "core",
@@ -498,17 +480,13 @@
498
480
  "dist",
499
481
  "commands",
500
482
  "auth",
501
- "connect.js"
483
+ "refresh.js"
502
484
  ]
503
485
  },
504
- "auth:connections": {
486
+ "auth:register": {
505
487
  "aliases": [],
506
488
  "args": {},
507
- "description": "List connected OAuth provider accounts",
508
- "examples": [
509
- "<%= config.bin %> auth connections",
510
- "<%= config.bin %> auth connections --json"
511
- ],
489
+ "description": "Create a new Faces account",
512
490
  "flags": {
513
491
  "json": {
514
492
  "description": "Format output as json.",
@@ -540,11 +518,54 @@
540
518
  "hasDynamicHelp": false,
541
519
  "multiple": false,
542
520
  "type": "option"
521
+ },
522
+ "email": {
523
+ "description": "Email address",
524
+ "name": "email",
525
+ "required": true,
526
+ "hasDynamicHelp": false,
527
+ "multiple": false,
528
+ "type": "option"
529
+ },
530
+ "password": {
531
+ "description": "Password",
532
+ "name": "password",
533
+ "required": true,
534
+ "hasDynamicHelp": false,
535
+ "multiple": false,
536
+ "type": "option"
537
+ },
538
+ "username": {
539
+ "description": "Username (lowercase, dashes, numbers)",
540
+ "name": "username",
541
+ "required": true,
542
+ "hasDynamicHelp": false,
543
+ "multiple": false,
544
+ "type": "option"
545
+ },
546
+ "invite-key": {
547
+ "description": "Invite key (if required)",
548
+ "name": "invite-key",
549
+ "hasDynamicHelp": false,
550
+ "multiple": false,
551
+ "type": "option"
552
+ },
553
+ "plan": {
554
+ "description": "Plan to subscribe to: \"free\" ($5 activation) or \"connect\" ($17/mo, no activation fee)",
555
+ "name": "plan",
556
+ "default": "free",
557
+ "hasDynamicHelp": false,
558
+ "multiple": false,
559
+ "options": [
560
+ "free",
561
+ "connect"
562
+ ],
563
+ "type": "option"
543
564
  }
544
565
  },
545
566
  "hasDynamicHelp": false,
546
567
  "hiddenAliases": [],
547
- "id": "auth:connections",
568
+ "id": "auth:register",
548
569
  "pluginAlias": "faces-cli",
549
570
  "pluginName": "faces-cli",
550
571
  "pluginType": "core",
@@ -555,25 +576,13 @@
555
576
  "dist",
556
577
  "commands",
557
578
  "auth",
558
- "connections.js"
579
+ "register.js"
559
580
  ]
560
581
  },
561
- "auth:disconnect": {
582
+ "auth:whoami": {
562
583
  "aliases": [],
563
- "args": {
564
- "provider": {
565
- "description": "OAuth provider to disconnect",
566
- "name": "provider",
567
- "options": [
568
- "openai"
569
- ],
570
- "required": true
571
- }
572
- },
573
- "description": "Disconnect a linked OAuth provider account",
574
- "examples": [
575
- "<%= config.bin %> auth disconnect openai"
576
- ],
584
+ "args": {},
585
+ "description": "Print current user profile and auth diagnostic",
577
586
  "flags": {
578
587
  "json": {
579
588
  "description": "Format output as json.",
@@ -609,7 +618,7 @@
609
618
  },
610
619
  "hasDynamicHelp": false,
611
620
  "hiddenAliases": [],
612
- "id": "auth:disconnect",
621
+ "id": "auth:whoami",
613
622
  "pluginAlias": "faces-cli",
614
623
  "pluginName": "faces-cli",
615
624
  "pluginType": "core",
@@ -620,13 +629,13 @@
620
629
  "dist",
621
630
  "commands",
622
631
  "auth",
623
- "disconnect.js"
632
+ "whoami.js"
624
633
  ]
625
634
  },
626
- "auth:login": {
635
+ "catalog:backup": {
627
636
  "aliases": [],
628
637
  "args": {},
629
- "description": "Login and save JWT credentials",
638
+ "description": "Snapshot all faces, teams, and source material for migration",
630
639
  "flags": {
631
640
  "json": {
632
641
  "description": "Format output as json.",
@@ -658,27 +667,11 @@
658
667
  "hasDynamicHelp": false,
659
668
  "multiple": false,
660
669
  "type": "option"
661
- },
662
- "email": {
663
- "description": "Account email",
664
- "name": "email",
665
- "required": true,
666
- "hasDynamicHelp": false,
667
- "multiple": false,
668
- "type": "option"
669
- },
670
- "password": {
671
- "description": "Account password",
672
- "name": "password",
673
- "required": true,
674
- "hasDynamicHelp": false,
675
- "multiple": false,
676
- "type": "option"
677
670
  }
678
671
  },
679
672
  "hasDynamicHelp": false,
680
673
  "hiddenAliases": [],
681
- "id": "auth:login",
674
+ "id": "catalog:backup",
682
675
  "pluginAlias": "faces-cli",
683
676
  "pluginName": "faces-cli",
684
677
  "pluginType": "core",
@@ -688,14 +681,14 @@
688
681
  "relativePath": [
689
682
  "dist",
690
683
  "commands",
691
- "auth",
692
- "login.js"
684
+ "catalog",
685
+ "backup.js"
693
686
  ]
694
687
  },
695
- "auth:logout": {
688
+ "catalog:doctor": {
696
689
  "aliases": [],
697
690
  "args": {},
698
- "description": "Clear saved credentials",
691
+ "description": "Diagnose and repair the local face and team catalog",
699
692
  "flags": {
700
693
  "json": {
701
694
  "description": "Format output as json.",
@@ -727,11 +720,23 @@
727
720
  "hasDynamicHelp": false,
728
721
  "multiple": false,
729
722
  "type": "option"
723
+ },
724
+ "fix": {
725
+ "description": "Rebuild missing or stale catalog entries from API",
726
+ "name": "fix",
727
+ "allowNo": false,
728
+ "type": "boolean"
729
+ },
730
+ "generate": {
731
+ "description": "Fix + generate missing descriptions via LLM",
732
+ "name": "generate",
733
+ "allowNo": false,
734
+ "type": "boolean"
730
735
  }
731
736
  },
732
737
  "hasDynamicHelp": false,
733
738
  "hiddenAliases": [],
734
- "id": "auth:logout",
739
+ "id": "catalog:doctor",
735
740
  "pluginAlias": "faces-cli",
736
741
  "pluginName": "faces-cli",
737
742
  "pluginType": "core",
@@ -741,14 +746,14 @@
741
746
  "relativePath": [
742
747
  "dist",
743
748
  "commands",
744
- "auth",
745
- "logout.js"
749
+ "catalog",
750
+ "doctor.js"
746
751
  ]
747
752
  },
748
- "auth:refresh": {
753
+ "catalog:list": {
749
754
  "aliases": [],
750
755
  "args": {},
751
- "description": "Exchange current JWT for a fresh one",
756
+ "description": "List all faces in the local catalog",
752
757
  "flags": {
753
758
  "json": {
754
759
  "description": "Format output as json.",
@@ -784,7 +789,7 @@
784
789
  },
785
790
  "hasDynamicHelp": false,
786
791
  "hiddenAliases": [],
787
- "id": "auth:refresh",
792
+ "id": "catalog:list",
788
793
  "pluginAlias": "faces-cli",
789
794
  "pluginName": "faces-cli",
790
795
  "pluginType": "core",
@@ -794,14 +799,14 @@
794
799
  "relativePath": [
795
800
  "dist",
796
801
  "commands",
797
- "auth",
798
- "refresh.js"
802
+ "catalog",
803
+ "list.js"
799
804
  ]
800
805
  },
801
- "auth:register": {
806
+ "catalog:manyfaced": {
802
807
  "aliases": [],
803
808
  "args": {},
804
- "description": "Create a new Faces account",
809
+ "description": "Browse and install community manyfaced skills from github.com/facessh/manyfaced",
805
810
  "flags": {
806
811
  "json": {
807
812
  "description": "Format output as json.",
@@ -834,53 +839,37 @@
834
839
  "multiple": false,
835
840
  "type": "option"
836
841
  },
837
- "email": {
838
- "description": "Email address",
839
- "name": "email",
840
- "required": true,
841
- "hasDynamicHelp": false,
842
- "multiple": false,
843
- "type": "option"
844
- },
845
- "password": {
846
- "description": "Password",
847
- "name": "password",
848
- "required": true,
842
+ "skill": {
843
+ "description": "Show details for a specific skill",
844
+ "name": "skill",
849
845
  "hasDynamicHelp": false,
850
846
  "multiple": false,
851
847
  "type": "option"
852
848
  },
853
- "username": {
854
- "description": "Username (lowercase, dashes, numbers)",
855
- "name": "username",
856
- "required": true,
849
+ "install": {
850
+ "description": "Install a skill by name",
851
+ "name": "install",
857
852
  "hasDynamicHelp": false,
858
853
  "multiple": false,
859
854
  "type": "option"
860
855
  },
861
- "invite-key": {
862
- "description": "Invite key (if required)",
863
- "name": "invite-key",
856
+ "skills-dir": {
857
+ "description": "Directory to install skills into (required for --install)",
858
+ "name": "skills-dir",
864
859
  "hasDynamicHelp": false,
865
860
  "multiple": false,
866
861
  "type": "option"
867
862
  },
868
- "plan": {
869
- "description": "Plan to subscribe to: \"free\" ($5 activation) or \"connect\" ($17/mo, no activation fee)",
870
- "name": "plan",
871
- "default": "free",
872
- "hasDynamicHelp": false,
873
- "multiple": false,
874
- "options": [
875
- "free",
876
- "connect"
877
- ],
878
- "type": "option"
863
+ "refresh": {
864
+ "description": "Force refresh the skill index (ignore cache)",
865
+ "name": "refresh",
866
+ "allowNo": false,
867
+ "type": "boolean"
879
868
  }
880
869
  },
881
870
  "hasDynamicHelp": false,
882
871
  "hiddenAliases": [],
883
- "id": "auth:register",
872
+ "id": "catalog:manyfaced",
884
873
  "pluginAlias": "faces-cli",
885
874
  "pluginName": "faces-cli",
886
875
  "pluginType": "core",
@@ -890,14 +879,19 @@
890
879
  "relativePath": [
891
880
  "dist",
892
881
  "commands",
893
- "auth",
894
- "register.js"
882
+ "catalog",
883
+ "manyfaced.js"
895
884
  ]
896
885
  },
897
- "auth:whoami": {
886
+ "catalog:restore": {
898
887
  "aliases": [],
899
- "args": {},
900
- "description": "Print current user profile and auth diagnostic",
888
+ "args": {
889
+ "file": {
890
+ "description": "Backup file path (default: most recent in ~/.faces/backups/)",
891
+ "name": "file"
892
+ }
893
+ },
894
+ "description": "Restore faces, teams, and source material from a backup snapshot",
901
895
  "flags": {
902
896
  "json": {
903
897
  "description": "Format output as json.",
@@ -929,11 +923,17 @@
929
923
  "hasDynamicHelp": false,
930
924
  "multiple": false,
931
925
  "type": "option"
926
+ },
927
+ "compile": {
928
+ "description": "Run compile:all after restoring",
929
+ "name": "compile",
930
+ "allowNo": false,
931
+ "type": "boolean"
932
932
  }
933
933
  },
934
934
  "hasDynamicHelp": false,
935
935
  "hiddenAliases": [],
936
- "id": "auth:whoami",
936
+ "id": "catalog:restore",
937
937
  "pluginAlias": "faces-cli",
938
938
  "pluginName": "faces-cli",
939
939
  "pluginType": "core",
@@ -943,8 +943,8 @@
943
943
  "relativePath": [
944
944
  "dist",
945
945
  "commands",
946
- "auth",
947
- "whoami.js"
946
+ "catalog",
947
+ "restore.js"
948
948
  ]
949
949
  },
950
950
  "billing:balance": {
@@ -1367,10 +1367,21 @@
1367
1367
  "usage.js"
1368
1368
  ]
1369
1369
  },
1370
- "compile:all": {
1370
+ "chat:chat": {
1371
1371
  "aliases": [],
1372
- "args": {},
1373
- "description": "Compile all uncompiled documents and threads across all faces",
1372
+ "args": {
1373
+ "face_username": {
1374
+ "description": "Face alias (alias@model, owner:alias@model for a published face, or a composite formula like \"(a | b)@model\"). Omit when using --formula.",
1375
+ "name": "face_username",
1376
+ "required": false
1377
+ }
1378
+ },
1379
+ "description": "Chat via a face. Auto-routes to the correct API endpoint based on the model catalog.",
1380
+ "examples": [
1381
+ "<%= config.bin %> <%= command.id %> socrates -m \"What is virtue?\"",
1382
+ "<%= config.bin %> <%= command.id %> \"(socrates | nietzsche)@claude-sonnet-4-6\" -m \"What is virtue?\"",
1383
+ "<%= config.bin %> <%= command.id %> --formula \"socrates | nietzsche\" --llm claude-sonnet-4-6 -m \"What is virtue?\""
1384
+ ],
1374
1385
  "flags": {
1375
1386
  "json": {
1376
1387
  "description": "Format output as json.",
@@ -1403,18 +1414,79 @@
1403
1414
  "multiple": false,
1404
1415
  "type": "option"
1405
1416
  },
1406
- "timeout": {
1407
- "description": "Per-item compile timeout in seconds (default: 600)",
1408
- "name": "timeout",
1409
- "default": 600,
1417
+ "message": {
1418
+ "char": "m",
1419
+ "description": "User message (repeatable)",
1420
+ "name": "message",
1421
+ "required": false,
1422
+ "hasDynamicHelp": false,
1423
+ "multiple": true,
1424
+ "type": "option"
1425
+ },
1426
+ "llm": {
1427
+ "description": "LLM override (e.g. gpt-4o-mini, claude-sonnet-4-6)",
1428
+ "name": "llm",
1429
+ "hasDynamicHelp": false,
1430
+ "multiple": false,
1431
+ "type": "option"
1432
+ },
1433
+ "formula": {
1434
+ "description": "Compose a run-time composite from your own faces, e.g. \"socrates | nietzsche\" (operators: | & ^ -). Requires --llm.",
1435
+ "name": "formula",
1436
+ "hasDynamicHelp": false,
1437
+ "multiple": false,
1438
+ "type": "option"
1439
+ },
1440
+ "system": {
1441
+ "description": "System prompt / instructions",
1442
+ "name": "system",
1443
+ "hasDynamicHelp": false,
1444
+ "multiple": false,
1445
+ "type": "option"
1446
+ },
1447
+ "stream": {
1448
+ "description": "Stream the response",
1449
+ "name": "stream",
1450
+ "allowNo": false,
1451
+ "type": "boolean"
1452
+ },
1453
+ "max-tokens": {
1454
+ "description": "Max tokens",
1455
+ "name": "max-tokens",
1456
+ "hasDynamicHelp": false,
1457
+ "multiple": false,
1458
+ "type": "option"
1459
+ },
1460
+ "temperature": {
1461
+ "description": "Temperature (0.0-2.0)",
1462
+ "name": "temperature",
1410
1463
  "hasDynamicHelp": false,
1411
1464
  "multiple": false,
1412
1465
  "type": "option"
1466
+ },
1467
+ "file": {
1468
+ "description": "Read message from file",
1469
+ "name": "file",
1470
+ "hasDynamicHelp": false,
1471
+ "multiple": false,
1472
+ "type": "option"
1473
+ },
1474
+ "responses": {
1475
+ "description": "Force the OpenAI Responses API endpoint (escape hatch; routing is automatic otherwise)",
1476
+ "name": "responses",
1477
+ "allowNo": false,
1478
+ "type": "boolean"
1479
+ },
1480
+ "oauth-only": {
1481
+ "description": "Prevent fallback to paid system key (use OAuth only)",
1482
+ "name": "oauth-only",
1483
+ "allowNo": false,
1484
+ "type": "boolean"
1413
1485
  }
1414
1486
  },
1415
1487
  "hasDynamicHelp": false,
1416
1488
  "hiddenAliases": [],
1417
- "id": "compile:all",
1489
+ "id": "chat:chat",
1418
1490
  "pluginAlias": "faces-cli",
1419
1491
  "pluginName": "faces-cli",
1420
1492
  "pluginType": "core",
@@ -1424,20 +1496,20 @@
1424
1496
  "relativePath": [
1425
1497
  "dist",
1426
1498
  "commands",
1427
- "compile",
1428
- "all.js"
1499
+ "chat",
1500
+ "chat.js"
1429
1501
  ]
1430
1502
  },
1431
- "compile:import": {
1503
+ "chat:messages": {
1432
1504
  "aliases": [],
1433
1505
  "args": {
1434
- "face_id": {
1435
- "description": "Face alias",
1436
- "name": "face_id",
1506
+ "face_model": {
1507
+ "description": "Face model (e.g. myface, myface@claude-sonnet-4-6, or head:judge@claude-sonnet-4-6)",
1508
+ "name": "face_model",
1437
1509
  "required": true
1438
1510
  }
1439
1511
  },
1440
- "description": "Import a YouTube video into a face via server-side download and transcription",
1512
+ "description": "Anthropic Messages API proxy via a face (alias: chat:chat auto-routes Anthropic models here)",
1441
1513
  "flags": {
1442
1514
  "json": {
1443
1515
  "description": "Format output as json.",
@@ -1470,108 +1542,46 @@
1470
1542
  "multiple": false,
1471
1543
  "type": "option"
1472
1544
  },
1473
- "url": {
1474
- "description": "YouTube URL (youtube.com/watch?v=... or youtu.be/...)",
1475
- "name": "url",
1545
+ "message": {
1546
+ "char": "m",
1547
+ "description": "User message (repeatable)",
1548
+ "name": "message",
1476
1549
  "required": true,
1477
1550
  "hasDynamicHelp": false,
1478
- "multiple": false,
1551
+ "multiple": true,
1479
1552
  "type": "option"
1480
1553
  },
1481
- "type": {
1482
- "description": "\"document\" for solo talks, lectures, monologues; \"thread\" for interviews or multi-speaker conversations",
1483
- "name": "type",
1484
- "default": "document",
1554
+ "system": {
1555
+ "description": "System prompt",
1556
+ "name": "system",
1485
1557
  "hasDynamicHelp": false,
1486
1558
  "multiple": false,
1487
- "options": [
1488
- "document",
1489
- "thread"
1490
- ],
1491
1559
  "type": "option"
1492
1560
  },
1493
- "perspective": {
1494
- "description": "\"first-person\" if the face is the speaker; \"third-person\" if the video is about the face",
1495
- "name": "perspective",
1496
- "default": "third-person",
1497
- "hasDynamicHelp": false,
1498
- "multiple": false,
1499
- "options": [
1500
- "first-person",
1501
- "third-person"
1502
- ],
1503
- "type": "option"
1561
+ "stream": {
1562
+ "description": "Stream the response",
1563
+ "name": "stream",
1564
+ "allowNo": false,
1565
+ "type": "boolean"
1504
1566
  },
1505
- "face-speaker": {
1506
- "description": "For --type thread: AssemblyAI speaker label (e.g. \"A\") that corresponds to the face. Defaults to first detected speaker.",
1507
- "name": "face-speaker",
1567
+ "max-tokens": {
1568
+ "description": "Max tokens",
1569
+ "name": "max-tokens",
1570
+ "default": 1024,
1508
1571
  "hasDynamicHelp": false,
1509
1572
  "multiple": false,
1510
1573
  "type": "option"
1511
1574
  },
1512
- "no-wait": {
1513
- "description": "Return immediately after import starts (do not poll for transcription). Prints the ID for manual polling.",
1514
- "name": "no-wait",
1515
- "allowNo": false,
1516
- "type": "boolean"
1517
- }
1518
- },
1519
- "hasDynamicHelp": false,
1520
- "hiddenAliases": [],
1521
- "id": "compile:import",
1522
- "pluginAlias": "faces-cli",
1523
- "pluginName": "faces-cli",
1524
- "pluginType": "core",
1525
- "strict": true,
1526
- "enableJsonFlag": true,
1527
- "isESM": true,
1528
- "relativePath": [
1529
- "dist",
1530
- "commands",
1531
- "compile",
1532
- "import.js"
1533
- ]
1534
- },
1535
- "compile:stats": {
1536
- "aliases": [],
1537
- "args": {},
1538
- "description": "Show compilation stats per face",
1539
- "flags": {
1540
- "json": {
1541
- "description": "Format output as json.",
1542
- "helpGroup": "GLOBAL",
1543
- "name": "json",
1575
+ "oauth-only": {
1576
+ "description": "Prevent fallback to paid system key (use OAuth only)",
1577
+ "name": "oauth-only",
1544
1578
  "allowNo": false,
1545
1579
  "type": "boolean"
1546
- },
1547
- "base-url": {
1548
- "description": "API base URL",
1549
- "env": "FACES_BASE_URL",
1550
- "name": "base-url",
1551
- "hasDynamicHelp": false,
1552
- "multiple": false,
1553
- "type": "option"
1554
- },
1555
- "token": {
1556
- "description": "JWT bearer token",
1557
- "env": "FACES_TOKEN",
1558
- "name": "token",
1559
- "hasDynamicHelp": false,
1560
- "multiple": false,
1561
- "type": "option"
1562
- },
1563
- "api-key": {
1564
- "description": "API key",
1565
- "env": "FACES_API_KEY",
1566
- "name": "api-key",
1567
- "hasDynamicHelp": false,
1568
- "multiple": false,
1569
- "type": "option"
1570
1580
  }
1571
1581
  },
1572
1582
  "hasDynamicHelp": false,
1573
1583
  "hiddenAliases": [],
1574
- "id": "compile:stats",
1584
+ "id": "chat:messages",
1575
1585
  "pluginAlias": "faces-cli",
1576
1586
  "pluginName": "faces-cli",
1577
1587
  "pluginType": "core",
@@ -1581,20 +1591,20 @@
1581
1591
  "relativePath": [
1582
1592
  "dist",
1583
1593
  "commands",
1584
- "compile",
1585
- "stats.js"
1594
+ "chat",
1595
+ "messages.js"
1586
1596
  ]
1587
1597
  },
1588
- "compile:upload": {
1598
+ "chat:responses": {
1589
1599
  "aliases": [],
1590
1600
  "args": {
1591
- "alias": {
1592
- "description": "Face alias",
1593
- "name": "alias",
1601
+ "face_model": {
1602
+ "description": "Face model (e.g. myface, myface@gpt-4o, or head:logician@gpt-5.4)",
1603
+ "name": "face_model",
1594
1604
  "required": true
1595
1605
  }
1596
1606
  },
1597
- "description": "Upload a file (text/PDF/audio/video) to compile into a face",
1607
+ "description": "OpenAI Responses API proxy via a face (alias: chat:chat --responses)",
1598
1608
  "flags": {
1599
1609
  "json": {
1600
1610
  "description": "Format output as json.",
@@ -1627,55 +1637,38 @@
1627
1637
  "multiple": false,
1628
1638
  "type": "option"
1629
1639
  },
1630
- "file": {
1631
- "description": "File to upload",
1632
- "name": "file",
1640
+ "message": {
1641
+ "char": "m",
1642
+ "description": "User input message",
1643
+ "name": "message",
1633
1644
  "required": true,
1634
1645
  "hasDynamicHelp": false,
1635
1646
  "multiple": false,
1636
1647
  "type": "option"
1637
1648
  },
1638
- "kind": {
1639
- "description": "Upload kind: document or thread",
1640
- "name": "kind",
1641
- "default": "document",
1642
- "hasDynamicHelp": false,
1643
- "multiple": false,
1644
- "options": [
1645
- "document",
1646
- "thread"
1647
- ],
1648
- "type": "option"
1649
- },
1650
- "perspective": {
1651
- "description": "Perspective (document only)",
1652
- "name": "perspective",
1653
- "default": "third-person",
1649
+ "instructions": {
1650
+ "description": "System instructions",
1651
+ "name": "instructions",
1654
1652
  "hasDynamicHelp": false,
1655
1653
  "multiple": false,
1656
- "options": [
1657
- "first-person",
1658
- "third-person"
1659
- ],
1660
1654
  "type": "option"
1661
1655
  },
1662
- "face-speaker": {
1663
- "description": "Speaker name to map to the face (thread only). If omitted, auto-detected from face name.",
1664
- "name": "face-speaker",
1665
- "hasDynamicHelp": false,
1666
- "multiple": false,
1667
- "type": "option"
1656
+ "stream": {
1657
+ "description": "Stream the response",
1658
+ "name": "stream",
1659
+ "allowNo": false,
1660
+ "type": "boolean"
1668
1661
  },
1669
- "no-wait": {
1670
- "description": "Return immediately after upload (do not poll for transcription). Prints the ID for manual polling.",
1671
- "name": "no-wait",
1662
+ "oauth-only": {
1663
+ "description": "Prevent fallback to paid system key (use OAuth only)",
1664
+ "name": "oauth-only",
1672
1665
  "allowNo": false,
1673
1666
  "type": "boolean"
1674
1667
  }
1675
1668
  },
1676
1669
  "hasDynamicHelp": false,
1677
1670
  "hiddenAliases": [],
1678
- "id": "compile:upload",
1671
+ "id": "chat:responses",
1679
1672
  "pluginAlias": "faces-cli",
1680
1673
  "pluginName": "faces-cli",
1681
1674
  "pluginType": "core",
@@ -1685,20 +1678,27 @@
1685
1678
  "relativePath": [
1686
1679
  "dist",
1687
1680
  "commands",
1688
- "compile",
1689
- "upload.js"
1681
+ "chat",
1682
+ "responses.js"
1690
1683
  ]
1691
1684
  },
1692
- "chat:chat": {
1685
+ "chat:thread": {
1693
1686
  "aliases": [],
1694
1687
  "args": {
1695
1688
  "face_username": {
1696
- "description": "Face alias (or alias@model)",
1689
+ "description": "Face alias (alias@model, or owner:alias@model for a published face) — required when starting a new thread",
1697
1690
  "name": "face_username",
1698
- "required": true
1691
+ "required": false
1699
1692
  }
1700
1693
  },
1701
- "description": "Chat via a face. Auto-routes to the correct API endpoint based on the model catalog.",
1694
+ "description": "Multi-turn chat thread. Conversation history is stored under ~/.faces/threads/<id>.json resume any thread later with --id.",
1695
+ "examples": [
1696
+ "<%= config.bin %> <%= command.id %> socrates -m \"What is justice?\"",
1697
+ "<%= config.bin %> <%= command.id %> --id t_abc123 -m \"Say more about that\"",
1698
+ "<%= config.bin %> <%= command.id %> --list",
1699
+ "<%= config.bin %> <%= command.id %> --id t_abc123 --show",
1700
+ "<%= config.bin %> <%= command.id %> --id t_abc123 --delete"
1701
+ ],
1702
1702
  "flags": {
1703
1703
  "json": {
1704
1704
  "description": "Format output as json.",
@@ -1731,35 +1731,42 @@
1731
1731
  "multiple": false,
1732
1732
  "type": "option"
1733
1733
  },
1734
+ "id": {
1735
+ "description": "Resume an existing thread by id",
1736
+ "name": "id",
1737
+ "hasDynamicHelp": false,
1738
+ "multiple": false,
1739
+ "type": "option"
1740
+ },
1734
1741
  "message": {
1735
1742
  "char": "m",
1736
- "description": "User message (repeatable)",
1743
+ "description": "User message",
1737
1744
  "name": "message",
1738
- "required": false,
1739
1745
  "hasDynamicHelp": false,
1740
- "multiple": true,
1746
+ "multiple": false,
1747
+ "type": "option"
1748
+ },
1749
+ "file": {
1750
+ "description": "Read message from file",
1751
+ "name": "file",
1752
+ "hasDynamicHelp": false,
1753
+ "multiple": false,
1741
1754
  "type": "option"
1742
1755
  },
1743
1756
  "llm": {
1744
- "description": "LLM override (e.g. gpt-4o-mini, claude-sonnet-4-6)",
1757
+ "description": "LLM override (only honored when starting a new thread)",
1745
1758
  "name": "llm",
1746
1759
  "hasDynamicHelp": false,
1747
1760
  "multiple": false,
1748
1761
  "type": "option"
1749
1762
  },
1750
1763
  "system": {
1751
- "description": "System prompt / instructions",
1764
+ "description": "System prompt (only honored when starting a new thread)",
1752
1765
  "name": "system",
1753
1766
  "hasDynamicHelp": false,
1754
1767
  "multiple": false,
1755
1768
  "type": "option"
1756
1769
  },
1757
- "stream": {
1758
- "description": "Stream the response",
1759
- "name": "stream",
1760
- "allowNo": false,
1761
- "type": "boolean"
1762
- },
1763
1770
  "max-tokens": {
1764
1771
  "description": "Max tokens",
1765
1772
  "name": "max-tokens",
@@ -1768,35 +1775,46 @@
1768
1775
  "type": "option"
1769
1776
  },
1770
1777
  "temperature": {
1771
- "description": "Temperature (0.0-2.0)",
1778
+ "description": "Temperature (0.0-2.0, OpenAI/Chat Completions only)",
1772
1779
  "name": "temperature",
1773
1780
  "hasDynamicHelp": false,
1774
1781
  "multiple": false,
1775
1782
  "type": "option"
1776
1783
  },
1777
- "file": {
1778
- "description": "Read message from file",
1779
- "name": "file",
1780
- "hasDynamicHelp": false,
1781
- "multiple": false,
1782
- "type": "option"
1783
- },
1784
- "responses": {
1785
- "description": "Force the OpenAI Responses API endpoint (escape hatch; routing is automatic otherwise)",
1786
- "name": "responses",
1784
+ "stream": {
1785
+ "description": "Stream the response",
1786
+ "name": "stream",
1787
1787
  "allowNo": false,
1788
1788
  "type": "boolean"
1789
1789
  },
1790
1790
  "oauth-only": {
1791
- "description": "Prevent fallback to paid system key (use OAuth only)",
1791
+ "description": "Prevent fallback to paid system key",
1792
1792
  "name": "oauth-only",
1793
1793
  "allowNo": false,
1794
1794
  "type": "boolean"
1795
+ },
1796
+ "list": {
1797
+ "description": "List saved threads",
1798
+ "name": "list",
1799
+ "allowNo": false,
1800
+ "type": "boolean"
1801
+ },
1802
+ "show": {
1803
+ "description": "Show the thread transcript (requires --id)",
1804
+ "name": "show",
1805
+ "allowNo": false,
1806
+ "type": "boolean"
1807
+ },
1808
+ "delete": {
1809
+ "description": "Delete the thread (requires --id)",
1810
+ "name": "delete",
1811
+ "allowNo": false,
1812
+ "type": "boolean"
1795
1813
  }
1796
1814
  },
1797
1815
  "hasDynamicHelp": false,
1798
1816
  "hiddenAliases": [],
1799
- "id": "chat:chat",
1817
+ "id": "chat:thread",
1800
1818
  "pluginAlias": "faces-cli",
1801
1819
  "pluginName": "faces-cli",
1802
1820
  "pluginType": "core",
@@ -1807,19 +1825,13 @@
1807
1825
  "dist",
1808
1826
  "commands",
1809
1827
  "chat",
1810
- "chat.js"
1828
+ "thread.js"
1811
1829
  ]
1812
1830
  },
1813
- "chat:messages": {
1831
+ "config:clear": {
1814
1832
  "aliases": [],
1815
- "args": {
1816
- "face_model": {
1817
- "description": "Face model (e.g. myface or myface@claude-sonnet-4-6)",
1818
- "name": "face_model",
1819
- "required": true
1820
- }
1821
- },
1822
- "description": "Anthropic Messages API proxy via a face (alias: chat:chat auto-routes Anthropic models here)",
1833
+ "args": {},
1834
+ "description": "Delete all saved credentials and config",
1823
1835
  "flags": {
1824
1836
  "json": {
1825
1837
  "description": "Format output as json.",
@@ -1852,46 +1864,16 @@
1852
1864
  "multiple": false,
1853
1865
  "type": "option"
1854
1866
  },
1855
- "message": {
1856
- "char": "m",
1857
- "description": "User message (repeatable)",
1858
- "name": "message",
1859
- "required": true,
1860
- "hasDynamicHelp": false,
1861
- "multiple": true,
1862
- "type": "option"
1863
- },
1864
- "system": {
1865
- "description": "System prompt",
1866
- "name": "system",
1867
- "hasDynamicHelp": false,
1868
- "multiple": false,
1869
- "type": "option"
1870
- },
1871
- "stream": {
1872
- "description": "Stream the response",
1873
- "name": "stream",
1874
- "allowNo": false,
1875
- "type": "boolean"
1876
- },
1877
- "max-tokens": {
1878
- "description": "Max tokens",
1879
- "name": "max-tokens",
1880
- "default": 1024,
1881
- "hasDynamicHelp": false,
1882
- "multiple": false,
1883
- "type": "option"
1884
- },
1885
- "oauth-only": {
1886
- "description": "Prevent fallback to paid system key (use OAuth only)",
1887
- "name": "oauth-only",
1867
+ "yes": {
1868
+ "description": "Skip confirmation",
1869
+ "name": "yes",
1888
1870
  "allowNo": false,
1889
1871
  "type": "boolean"
1890
1872
  }
1891
1873
  },
1892
1874
  "hasDynamicHelp": false,
1893
1875
  "hiddenAliases": [],
1894
- "id": "chat:messages",
1876
+ "id": "config:clear",
1895
1877
  "pluginAlias": "faces-cli",
1896
1878
  "pluginName": "faces-cli",
1897
1879
  "pluginType": "core",
@@ -1901,20 +1883,25 @@
1901
1883
  "relativePath": [
1902
1884
  "dist",
1903
1885
  "commands",
1904
- "chat",
1905
- "messages.js"
1886
+ "config",
1887
+ "clear.js"
1906
1888
  ]
1907
1889
  },
1908
- "chat:responses": {
1890
+ "config:set": {
1909
1891
  "aliases": [],
1910
1892
  "args": {
1911
- "face_model": {
1912
- "description": "Face model (e.g. myface or myface@gpt-4o)",
1913
- "name": "face_model",
1893
+ "key": {
1894
+ "description": "Config key",
1895
+ "name": "key",
1896
+ "required": true
1897
+ },
1898
+ "value": {
1899
+ "description": "Config value",
1900
+ "name": "value",
1914
1901
  "required": true
1915
1902
  }
1916
1903
  },
1917
- "description": "OpenAI Responses API proxy via a face (alias: chat:chat --responses)",
1904
+ "description": "Set a config value (e.g. base_url, api_key, token)",
1918
1905
  "flags": {
1919
1906
  "json": {
1920
1907
  "description": "Format output as json.",
@@ -1946,39 +1933,11 @@
1946
1933
  "hasDynamicHelp": false,
1947
1934
  "multiple": false,
1948
1935
  "type": "option"
1949
- },
1950
- "message": {
1951
- "char": "m",
1952
- "description": "User input message",
1953
- "name": "message",
1954
- "required": true,
1955
- "hasDynamicHelp": false,
1956
- "multiple": false,
1957
- "type": "option"
1958
- },
1959
- "instructions": {
1960
- "description": "System instructions",
1961
- "name": "instructions",
1962
- "hasDynamicHelp": false,
1963
- "multiple": false,
1964
- "type": "option"
1965
- },
1966
- "stream": {
1967
- "description": "Stream the response",
1968
- "name": "stream",
1969
- "allowNo": false,
1970
- "type": "boolean"
1971
- },
1972
- "oauth-only": {
1973
- "description": "Prevent fallback to paid system key (use OAuth only)",
1974
- "name": "oauth-only",
1975
- "allowNo": false,
1976
- "type": "boolean"
1977
1936
  }
1978
1937
  },
1979
1938
  "hasDynamicHelp": false,
1980
1939
  "hiddenAliases": [],
1981
- "id": "chat:responses",
1940
+ "id": "config:set",
1982
1941
  "pluginAlias": "faces-cli",
1983
1942
  "pluginName": "faces-cli",
1984
1943
  "pluginType": "core",
@@ -1988,27 +1947,14 @@
1988
1947
  "relativePath": [
1989
1948
  "dist",
1990
1949
  "commands",
1991
- "chat",
1992
- "responses.js"
1950
+ "config",
1951
+ "set.js"
1993
1952
  ]
1994
1953
  },
1995
- "chat:thread": {
1954
+ "config:show": {
1996
1955
  "aliases": [],
1997
- "args": {
1998
- "face_username": {
1999
- "description": "Face alias (or alias@model) — required when starting a new thread",
2000
- "name": "face_username",
2001
- "required": false
2002
- }
2003
- },
2004
- "description": "Multi-turn chat thread. Conversation history is stored under ~/.faces/threads/<id>.json — resume any thread later with --id.",
2005
- "examples": [
2006
- "<%= config.bin %> <%= command.id %> socrates -m \"What is justice?\"",
2007
- "<%= config.bin %> <%= command.id %> --id t_abc123 -m \"Say more about that\"",
2008
- "<%= config.bin %> <%= command.id %> --list",
2009
- "<%= config.bin %> <%= command.id %> --id t_abc123 --show",
2010
- "<%= config.bin %> <%= command.id %> --id t_abc123 --delete"
2011
- ],
1956
+ "args": {},
1957
+ "description": "Print current config (credentials are masked)",
2012
1958
  "flags": {
2013
1959
  "json": {
2014
1960
  "description": "Format output as json.",
@@ -2040,91 +1986,72 @@
2040
1986
  "hasDynamicHelp": false,
2041
1987
  "multiple": false,
2042
1988
  "type": "option"
1989
+ }
1990
+ },
1991
+ "hasDynamicHelp": false,
1992
+ "hiddenAliases": [],
1993
+ "id": "config:show",
1994
+ "pluginAlias": "faces-cli",
1995
+ "pluginName": "faces-cli",
1996
+ "pluginType": "core",
1997
+ "strict": true,
1998
+ "enableJsonFlag": true,
1999
+ "isESM": true,
2000
+ "relativePath": [
2001
+ "dist",
2002
+ "commands",
2003
+ "config",
2004
+ "show.js"
2005
+ ]
2006
+ },
2007
+ "compile:all": {
2008
+ "aliases": [],
2009
+ "args": {},
2010
+ "description": "Compile all uncompiled documents and threads across all faces",
2011
+ "flags": {
2012
+ "json": {
2013
+ "description": "Format output as json.",
2014
+ "helpGroup": "GLOBAL",
2015
+ "name": "json",
2016
+ "allowNo": false,
2017
+ "type": "boolean"
2043
2018
  },
2044
- "id": {
2045
- "description": "Resume an existing thread by id",
2046
- "name": "id",
2047
- "hasDynamicHelp": false,
2048
- "multiple": false,
2049
- "type": "option"
2050
- },
2051
- "message": {
2052
- "char": "m",
2053
- "description": "User message",
2054
- "name": "message",
2055
- "hasDynamicHelp": false,
2056
- "multiple": false,
2057
- "type": "option"
2058
- },
2059
- "file": {
2060
- "description": "Read message from file",
2061
- "name": "file",
2062
- "hasDynamicHelp": false,
2063
- "multiple": false,
2064
- "type": "option"
2065
- },
2066
- "llm": {
2067
- "description": "LLM override (only honored when starting a new thread)",
2068
- "name": "llm",
2019
+ "base-url": {
2020
+ "description": "API base URL",
2021
+ "env": "FACES_BASE_URL",
2022
+ "name": "base-url",
2069
2023
  "hasDynamicHelp": false,
2070
2024
  "multiple": false,
2071
2025
  "type": "option"
2072
2026
  },
2073
- "system": {
2074
- "description": "System prompt (only honored when starting a new thread)",
2075
- "name": "system",
2027
+ "token": {
2028
+ "description": "JWT bearer token",
2029
+ "env": "FACES_TOKEN",
2030
+ "name": "token",
2076
2031
  "hasDynamicHelp": false,
2077
2032
  "multiple": false,
2078
2033
  "type": "option"
2079
2034
  },
2080
- "max-tokens": {
2081
- "description": "Max tokens",
2082
- "name": "max-tokens",
2035
+ "api-key": {
2036
+ "description": "API key",
2037
+ "env": "FACES_API_KEY",
2038
+ "name": "api-key",
2083
2039
  "hasDynamicHelp": false,
2084
2040
  "multiple": false,
2085
2041
  "type": "option"
2086
2042
  },
2087
- "temperature": {
2088
- "description": "Temperature (0.0-2.0, OpenAI/Chat Completions only)",
2089
- "name": "temperature",
2043
+ "timeout": {
2044
+ "description": "Per-item compile timeout in seconds (default: 600)",
2045
+ "name": "timeout",
2046
+ "default": 600,
2090
2047
  "hasDynamicHelp": false,
2091
2048
  "multiple": false,
2092
2049
  "type": "option"
2093
- },
2094
- "stream": {
2095
- "description": "Stream the response",
2096
- "name": "stream",
2097
- "allowNo": false,
2098
- "type": "boolean"
2099
- },
2100
- "oauth-only": {
2101
- "description": "Prevent fallback to paid system key",
2102
- "name": "oauth-only",
2103
- "allowNo": false,
2104
- "type": "boolean"
2105
- },
2106
- "list": {
2107
- "description": "List saved threads",
2108
- "name": "list",
2109
- "allowNo": false,
2110
- "type": "boolean"
2111
- },
2112
- "show": {
2113
- "description": "Show the thread transcript (requires --id)",
2114
- "name": "show",
2115
- "allowNo": false,
2116
- "type": "boolean"
2117
- },
2118
- "delete": {
2119
- "description": "Delete the thread (requires --id)",
2120
- "name": "delete",
2121
- "allowNo": false,
2122
- "type": "boolean"
2123
2050
  }
2124
2051
  },
2125
2052
  "hasDynamicHelp": false,
2126
2053
  "hiddenAliases": [],
2127
- "id": "chat:thread",
2054
+ "id": "compile:all",
2128
2055
  "pluginAlias": "faces-cli",
2129
2056
  "pluginName": "faces-cli",
2130
2057
  "pluginType": "core",
@@ -2134,14 +2061,20 @@
2134
2061
  "relativePath": [
2135
2062
  "dist",
2136
2063
  "commands",
2137
- "chat",
2138
- "thread.js"
2064
+ "compile",
2065
+ "all.js"
2139
2066
  ]
2140
2067
  },
2141
- "config:clear": {
2068
+ "compile:import": {
2142
2069
  "aliases": [],
2143
- "args": {},
2144
- "description": "Delete all saved credentials and config",
2070
+ "args": {
2071
+ "face_id": {
2072
+ "description": "Face alias",
2073
+ "name": "face_id",
2074
+ "required": true
2075
+ }
2076
+ },
2077
+ "description": "Import a YouTube video into a face via server-side download and transcription",
2145
2078
  "flags": {
2146
2079
  "json": {
2147
2080
  "description": "Format output as json.",
@@ -2174,16 +2107,55 @@
2174
2107
  "multiple": false,
2175
2108
  "type": "option"
2176
2109
  },
2177
- "yes": {
2178
- "description": "Skip confirmation",
2179
- "name": "yes",
2110
+ "url": {
2111
+ "description": "YouTube URL (youtube.com/watch?v=... or youtu.be/...)",
2112
+ "name": "url",
2113
+ "required": true,
2114
+ "hasDynamicHelp": false,
2115
+ "multiple": false,
2116
+ "type": "option"
2117
+ },
2118
+ "type": {
2119
+ "description": "\"document\" for solo talks, lectures, monologues; \"thread\" for interviews or multi-speaker conversations",
2120
+ "name": "type",
2121
+ "default": "document",
2122
+ "hasDynamicHelp": false,
2123
+ "multiple": false,
2124
+ "options": [
2125
+ "document",
2126
+ "thread"
2127
+ ],
2128
+ "type": "option"
2129
+ },
2130
+ "perspective": {
2131
+ "description": "\"first-person\" if the face is the speaker; \"third-person\" if the video is about the face",
2132
+ "name": "perspective",
2133
+ "default": "third-person",
2134
+ "hasDynamicHelp": false,
2135
+ "multiple": false,
2136
+ "options": [
2137
+ "first-person",
2138
+ "third-person"
2139
+ ],
2140
+ "type": "option"
2141
+ },
2142
+ "face-speaker": {
2143
+ "description": "For --type thread: AssemblyAI speaker label (e.g. \"A\") that corresponds to the face. Defaults to first detected speaker.",
2144
+ "name": "face-speaker",
2145
+ "hasDynamicHelp": false,
2146
+ "multiple": false,
2147
+ "type": "option"
2148
+ },
2149
+ "no-wait": {
2150
+ "description": "Return immediately after import starts (do not poll for transcription). Prints the ID for manual polling.",
2151
+ "name": "no-wait",
2180
2152
  "allowNo": false,
2181
2153
  "type": "boolean"
2182
2154
  }
2183
2155
  },
2184
2156
  "hasDynamicHelp": false,
2185
2157
  "hiddenAliases": [],
2186
- "id": "config:clear",
2158
+ "id": "compile:import",
2187
2159
  "pluginAlias": "faces-cli",
2188
2160
  "pluginName": "faces-cli",
2189
2161
  "pluginType": "core",
@@ -2193,25 +2165,14 @@
2193
2165
  "relativePath": [
2194
2166
  "dist",
2195
2167
  "commands",
2196
- "config",
2197
- "clear.js"
2168
+ "compile",
2169
+ "import.js"
2198
2170
  ]
2199
2171
  },
2200
- "config:set": {
2172
+ "compile:stats": {
2201
2173
  "aliases": [],
2202
- "args": {
2203
- "key": {
2204
- "description": "Config key",
2205
- "name": "key",
2206
- "required": true
2207
- },
2208
- "value": {
2209
- "description": "Config value",
2210
- "name": "value",
2211
- "required": true
2212
- }
2213
- },
2214
- "description": "Set a config value (e.g. base_url, api_key, token)",
2174
+ "args": {},
2175
+ "description": "Show compilation stats per face",
2215
2176
  "flags": {
2216
2177
  "json": {
2217
2178
  "description": "Format output as json.",
@@ -2247,7 +2208,7 @@
2247
2208
  },
2248
2209
  "hasDynamicHelp": false,
2249
2210
  "hiddenAliases": [],
2250
- "id": "config:set",
2211
+ "id": "compile:stats",
2251
2212
  "pluginAlias": "faces-cli",
2252
2213
  "pluginName": "faces-cli",
2253
2214
  "pluginType": "core",
@@ -2257,14 +2218,20 @@
2257
2218
  "relativePath": [
2258
2219
  "dist",
2259
2220
  "commands",
2260
- "config",
2261
- "set.js"
2221
+ "compile",
2222
+ "stats.js"
2262
2223
  ]
2263
2224
  },
2264
- "config:show": {
2225
+ "compile:upload": {
2265
2226
  "aliases": [],
2266
- "args": {},
2267
- "description": "Print current config (credentials are masked)",
2227
+ "args": {
2228
+ "alias": {
2229
+ "description": "Face alias",
2230
+ "name": "alias",
2231
+ "required": true
2232
+ }
2233
+ },
2234
+ "description": "Upload a file (text/PDF/audio/video) to compile into a face",
2268
2235
  "flags": {
2269
2236
  "json": {
2270
2237
  "description": "Format output as json.",
@@ -2296,11 +2263,56 @@
2296
2263
  "hasDynamicHelp": false,
2297
2264
  "multiple": false,
2298
2265
  "type": "option"
2266
+ },
2267
+ "file": {
2268
+ "description": "File to upload",
2269
+ "name": "file",
2270
+ "required": true,
2271
+ "hasDynamicHelp": false,
2272
+ "multiple": false,
2273
+ "type": "option"
2274
+ },
2275
+ "kind": {
2276
+ "description": "Upload kind: document or thread",
2277
+ "name": "kind",
2278
+ "default": "document",
2279
+ "hasDynamicHelp": false,
2280
+ "multiple": false,
2281
+ "options": [
2282
+ "document",
2283
+ "thread"
2284
+ ],
2285
+ "type": "option"
2286
+ },
2287
+ "perspective": {
2288
+ "description": "Perspective (document only)",
2289
+ "name": "perspective",
2290
+ "default": "third-person",
2291
+ "hasDynamicHelp": false,
2292
+ "multiple": false,
2293
+ "options": [
2294
+ "first-person",
2295
+ "third-person"
2296
+ ],
2297
+ "type": "option"
2298
+ },
2299
+ "face-speaker": {
2300
+ "description": "Speaker name to map to the face (thread only). If omitted, auto-detected from face name.",
2301
+ "name": "face-speaker",
2302
+ "hasDynamicHelp": false,
2303
+ "multiple": false,
2304
+ "type": "option"
2305
+ },
2306
+ "no-wait": {
2307
+ "description": "Return immediately after upload (do not poll for transcription). Prints the ID for manual polling.",
2308
+ "name": "no-wait",
2309
+ "allowNo": false,
2310
+ "type": "boolean"
2299
2311
  }
2300
2312
  },
2301
2313
  "hasDynamicHelp": false,
2302
2314
  "hiddenAliases": [],
2303
- "id": "config:show",
2315
+ "id": "compile:upload",
2304
2316
  "pluginAlias": "faces-cli",
2305
2317
  "pluginName": "faces-cli",
2306
2318
  "pluginType": "core",
@@ -2310,8 +2322,8 @@
2310
2322
  "relativePath": [
2311
2323
  "dist",
2312
2324
  "commands",
2313
- "config",
2314
- "show.js"
2325
+ "compile",
2326
+ "upload.js"
2315
2327
  ]
2316
2328
  },
2317
2329
  "keys:create": {
@@ -2606,16 +2618,10 @@
2606
2618
  "update.js"
2607
2619
  ]
2608
2620
  },
2609
- "team:add": {
2621
+ "face:attributes": {
2610
2622
  "aliases": [],
2611
- "args": {
2612
- "team_id": {
2613
- "description": "Team ID",
2614
- "name": "team_id",
2615
- "required": true
2616
- }
2617
- },
2618
- "description": "Add face(s) to a team",
2623
+ "args": {},
2624
+ "description": "List all supported attribute keys",
2619
2625
  "flags": {
2620
2626
  "json": {
2621
2627
  "description": "Format output as json.",
@@ -2647,19 +2653,11 @@
2647
2653
  "hasDynamicHelp": false,
2648
2654
  "multiple": false,
2649
2655
  "type": "option"
2650
- },
2651
- "face": {
2652
- "description": "Face alias to add (repeatable)",
2653
- "name": "face",
2654
- "required": true,
2655
- "hasDynamicHelp": false,
2656
- "multiple": true,
2657
- "type": "option"
2658
2656
  }
2659
2657
  },
2660
2658
  "hasDynamicHelp": false,
2661
2659
  "hiddenAliases": [],
2662
- "id": "team:add",
2660
+ "id": "face:attributes",
2663
2661
  "pluginAlias": "faces-cli",
2664
2662
  "pluginName": "faces-cli",
2665
2663
  "pluginType": "core",
@@ -2669,14 +2667,14 @@
2669
2667
  "relativePath": [
2670
2668
  "dist",
2671
2669
  "commands",
2672
- "team",
2673
- "add.js"
2670
+ "face",
2671
+ "attributes.js"
2674
2672
  ]
2675
2673
  },
2676
- "team:create": {
2674
+ "face:create": {
2677
2675
  "aliases": [],
2678
2676
  "args": {},
2679
- "description": "Create a new team",
2677
+ "description": "Create a new face",
2680
2678
  "flags": {
2681
2679
  "json": {
2682
2680
  "description": "Format output as json.",
@@ -2710,37 +2708,59 @@
2710
2708
  "type": "option"
2711
2709
  },
2712
2710
  "name": {
2713
- "description": "Team name",
2711
+ "description": "Display name",
2714
2712
  "name": "name",
2715
2713
  "required": true,
2716
2714
  "hasDynamicHelp": false,
2717
2715
  "multiple": false,
2718
2716
  "type": "option"
2719
2717
  },
2718
+ "alias": {
2719
+ "description": "Unique alias slug",
2720
+ "name": "alias",
2721
+ "required": true,
2722
+ "hasDynamicHelp": false,
2723
+ "multiple": false,
2724
+ "type": "option"
2725
+ },
2720
2726
  "description": {
2721
- "description": "Plain-text team description (max 1500 chars)",
2727
+ "description": "Plain-text description / bio (max 1500 chars)",
2722
2728
  "name": "description",
2723
2729
  "hasDynamicHelp": false,
2724
2730
  "multiple": false,
2725
2731
  "type": "option"
2726
2732
  },
2727
- "protocol": {
2728
- "description": "Protocol content (mermaid diagram or markdown, max 1000 words)",
2729
- "name": "protocol",
2733
+ "tag": {
2734
+ "description": "Tag label (repeatable, lowercase)",
2735
+ "name": "tag",
2736
+ "hasDynamicHelp": false,
2737
+ "multiple": true,
2738
+ "type": "option"
2739
+ },
2740
+ "default-model": {
2741
+ "description": "Default LLM for chat (e.g. gpt-4o-mini, claude-sonnet-4-6)",
2742
+ "name": "default-model",
2730
2743
  "hasDynamicHelp": false,
2731
2744
  "multiple": false,
2732
2745
  "type": "option"
2733
2746
  },
2734
- "protocol-file": {
2735
- "description": "Read protocol from file",
2736
- "name": "protocol-file",
2747
+ "formula": {
2748
+ "description": "Boolean formula over owned concrete face aliases (e.g. \"a | b\", \"(a | b) - c\"). Creates a composite face.",
2749
+ "name": "formula",
2737
2750
  "hasDynamicHelp": false,
2738
2751
  "multiple": false,
2739
2752
  "type": "option"
2740
2753
  },
2741
- "tag": {
2742
- "description": "Tag label (repeatable, lowercase)",
2743
- "name": "tag",
2754
+ "attr": {
2755
+ "description": "Attribute KEY=VALUE (repeatable)",
2756
+ "name": "attr",
2757
+ "hasDynamicHelp": false,
2758
+ "multiple": true,
2759
+ "type": "option"
2760
+ },
2761
+ "tool": {
2762
+ "description": "Tool name to enable (repeatable)",
2763
+ "name": "tool",
2744
2764
  "hasDynamicHelp": false,
2745
2765
  "multiple": true,
2746
2766
  "type": "option"
@@ -2748,7 +2768,7 @@
2748
2768
  },
2749
2769
  "hasDynamicHelp": false,
2750
2770
  "hiddenAliases": [],
2751
- "id": "team:create",
2771
+ "id": "face:create",
2752
2772
  "pluginAlias": "faces-cli",
2753
2773
  "pluginName": "faces-cli",
2754
2774
  "pluginType": "core",
@@ -2758,20 +2778,20 @@
2758
2778
  "relativePath": [
2759
2779
  "dist",
2760
2780
  "commands",
2761
- "team",
2781
+ "face",
2762
2782
  "create.js"
2763
2783
  ]
2764
2784
  },
2765
- "team:delete": {
2785
+ "face:delete": {
2766
2786
  "aliases": [],
2767
2787
  "args": {
2768
- "team_id": {
2769
- "description": "Team ID",
2770
- "name": "team_id",
2788
+ "face_id": {
2789
+ "description": "Face alias",
2790
+ "name": "face_id",
2771
2791
  "required": true
2772
2792
  }
2773
2793
  },
2774
- "description": "Delete a team",
2794
+ "description": "Delete a face permanently",
2775
2795
  "flags": {
2776
2796
  "json": {
2777
2797
  "description": "Format output as json.",
@@ -2813,7 +2833,7 @@
2813
2833
  },
2814
2834
  "hasDynamicHelp": false,
2815
2835
  "hiddenAliases": [],
2816
- "id": "team:delete",
2836
+ "id": "face:delete",
2817
2837
  "pluginAlias": "faces-cli",
2818
2838
  "pluginName": "faces-cli",
2819
2839
  "pluginType": "core",
@@ -2823,20 +2843,81 @@
2823
2843
  "relativePath": [
2824
2844
  "dist",
2825
2845
  "commands",
2826
- "team",
2846
+ "face",
2827
2847
  "delete.js"
2828
2848
  ]
2829
2849
  },
2830
- "team:edit": {
2850
+ "face:diff": {
2851
+ "aliases": [],
2852
+ "args": {},
2853
+ "description": "Compare owned faces pairwise across all centroid components",
2854
+ "flags": {
2855
+ "json": {
2856
+ "description": "Format output as json.",
2857
+ "helpGroup": "GLOBAL",
2858
+ "name": "json",
2859
+ "allowNo": false,
2860
+ "type": "boolean"
2861
+ },
2862
+ "base-url": {
2863
+ "description": "API base URL",
2864
+ "env": "FACES_BASE_URL",
2865
+ "name": "base-url",
2866
+ "hasDynamicHelp": false,
2867
+ "multiple": false,
2868
+ "type": "option"
2869
+ },
2870
+ "token": {
2871
+ "description": "JWT bearer token",
2872
+ "env": "FACES_TOKEN",
2873
+ "name": "token",
2874
+ "hasDynamicHelp": false,
2875
+ "multiple": false,
2876
+ "type": "option"
2877
+ },
2878
+ "api-key": {
2879
+ "description": "API key",
2880
+ "env": "FACES_API_KEY",
2881
+ "name": "api-key",
2882
+ "hasDynamicHelp": false,
2883
+ "multiple": false,
2884
+ "type": "option"
2885
+ },
2886
+ "face": {
2887
+ "description": "Face alias to include (repeatable, min 2)",
2888
+ "name": "face",
2889
+ "required": true,
2890
+ "hasDynamicHelp": false,
2891
+ "multiple": true,
2892
+ "type": "option"
2893
+ }
2894
+ },
2895
+ "hasDynamicHelp": false,
2896
+ "hiddenAliases": [],
2897
+ "id": "face:diff",
2898
+ "pluginAlias": "faces-cli",
2899
+ "pluginName": "faces-cli",
2900
+ "pluginType": "core",
2901
+ "strict": true,
2902
+ "enableJsonFlag": true,
2903
+ "isESM": true,
2904
+ "relativePath": [
2905
+ "dist",
2906
+ "commands",
2907
+ "face",
2908
+ "diff.js"
2909
+ ]
2910
+ },
2911
+ "face:edit": {
2831
2912
  "aliases": [],
2832
2913
  "args": {
2833
- "team_id": {
2834
- "description": "Team ID",
2835
- "name": "team_id",
2914
+ "face_id": {
2915
+ "description": "Face alias",
2916
+ "name": "face_id",
2836
2917
  "required": true
2837
2918
  }
2838
2919
  },
2839
- "description": "Edit a team",
2920
+ "description": "Edit a face's metadata",
2840
2921
  "flags": {
2841
2922
  "json": {
2842
2923
  "description": "Format output as json.",
@@ -2870,37 +2951,58 @@
2870
2951
  "type": "option"
2871
2952
  },
2872
2953
  "name": {
2873
- "description": "New team name",
2954
+ "description": "New display name",
2874
2955
  "name": "name",
2875
2956
  "hasDynamicHelp": false,
2876
2957
  "multiple": false,
2877
2958
  "type": "option"
2878
2959
  },
2879
- "description": {
2880
- "description": "New description (max 1500 chars)",
2881
- "name": "description",
2960
+ "description": {
2961
+ "description": "Plain-text description / bio (max 1500 chars)",
2962
+ "name": "description",
2963
+ "hasDynamicHelp": false,
2964
+ "multiple": false,
2965
+ "type": "option"
2966
+ },
2967
+ "tag": {
2968
+ "description": "Replace all tags (repeatable, lowercase)",
2969
+ "name": "tag",
2970
+ "hasDynamicHelp": false,
2971
+ "multiple": true,
2972
+ "type": "option"
2973
+ },
2974
+ "default-model": {
2975
+ "description": "Default LLM for chat (e.g. gpt-4o-mini, claude-sonnet-4-6)",
2976
+ "name": "default-model",
2977
+ "hasDynamicHelp": false,
2978
+ "multiple": false,
2979
+ "type": "option"
2980
+ },
2981
+ "formula": {
2982
+ "description": "New boolean formula (synthetic faces only)",
2983
+ "name": "formula",
2882
2984
  "hasDynamicHelp": false,
2883
2985
  "multiple": false,
2884
2986
  "type": "option"
2885
2987
  },
2886
- "protocol": {
2887
- "description": "New protocol content",
2888
- "name": "protocol",
2988
+ "attr": {
2989
+ "description": "Update attribute KEY=VALUE (repeatable)",
2990
+ "name": "attr",
2889
2991
  "hasDynamicHelp": false,
2890
- "multiple": false,
2992
+ "multiple": true,
2891
2993
  "type": "option"
2892
2994
  },
2893
- "protocol-file": {
2894
- "description": "Read protocol from file",
2895
- "name": "protocol-file",
2995
+ "tool": {
2996
+ "description": "Tool names to set (replaces list, repeatable)",
2997
+ "name": "tool",
2896
2998
  "hasDynamicHelp": false,
2897
- "multiple": false,
2999
+ "multiple": true,
2898
3000
  "type": "option"
2899
3001
  }
2900
3002
  },
2901
3003
  "hasDynamicHelp": false,
2902
3004
  "hiddenAliases": [],
2903
- "id": "team:edit",
3005
+ "id": "face:edit",
2904
3006
  "pluginAlias": "faces-cli",
2905
3007
  "pluginName": "faces-cli",
2906
3008
  "pluginType": "core",
@@ -2910,20 +3012,20 @@
2910
3012
  "relativePath": [
2911
3013
  "dist",
2912
3014
  "commands",
2913
- "team",
3015
+ "face",
2914
3016
  "edit.js"
2915
3017
  ]
2916
3018
  },
2917
- "team:get": {
3019
+ "face:get": {
2918
3020
  "aliases": [],
2919
3021
  "args": {
2920
- "team_id": {
2921
- "description": "Team ID",
2922
- "name": "team_id",
3022
+ "face_id": {
3023
+ "description": "Face alias",
3024
+ "name": "face_id",
2923
3025
  "required": true
2924
3026
  }
2925
3027
  },
2926
- "description": "Get a team by ID",
3028
+ "description": "Get details for a face by alias",
2927
3029
  "flags": {
2928
3030
  "json": {
2929
3031
  "description": "Format output as json.",
@@ -2955,11 +3057,18 @@
2955
3057
  "hasDynamicHelp": false,
2956
3058
  "multiple": false,
2957
3059
  "type": "option"
3060
+ },
3061
+ "include": {
3062
+ "description": "Include extra fields: tags, teams (comma-separated)",
3063
+ "name": "include",
3064
+ "hasDynamicHelp": false,
3065
+ "multiple": false,
3066
+ "type": "option"
2958
3067
  }
2959
3068
  },
2960
3069
  "hasDynamicHelp": false,
2961
3070
  "hiddenAliases": [],
2962
- "id": "team:get",
3071
+ "id": "face:get",
2963
3072
  "pluginAlias": "faces-cli",
2964
3073
  "pluginName": "faces-cli",
2965
3074
  "pluginType": "core",
@@ -2969,14 +3078,14 @@
2969
3078
  "relativePath": [
2970
3079
  "dist",
2971
3080
  "commands",
2972
- "team",
3081
+ "face",
2973
3082
  "get.js"
2974
3083
  ]
2975
3084
  },
2976
- "team:list": {
3085
+ "face:list": {
2977
3086
  "aliases": [],
2978
3087
  "args": {},
2979
- "description": "List your teams",
3088
+ "description": "List faces. By default lists owned faces; use --public to include published faces from other accounts.",
2980
3089
  "flags": {
2981
3090
  "json": {
2982
3091
  "description": "Format output as json.",
@@ -3008,11 +3117,58 @@
3008
3117
  "hasDynamicHelp": false,
3009
3118
  "multiple": false,
3010
3119
  "type": "option"
3120
+ },
3121
+ "tag": {
3122
+ "description": "Filter by tag (repeatable, AND logic)",
3123
+ "name": "tag",
3124
+ "hasDynamicHelp": false,
3125
+ "multiple": true,
3126
+ "type": "option"
3127
+ },
3128
+ "team": {
3129
+ "description": "Filter by team ID (repeatable, OR logic)",
3130
+ "name": "team",
3131
+ "hasDynamicHelp": false,
3132
+ "multiple": true,
3133
+ "type": "option"
3134
+ },
3135
+ "include": {
3136
+ "description": "Include extra fields: tags, teams (comma-separated)",
3137
+ "name": "include",
3138
+ "hasDynamicHelp": false,
3139
+ "multiple": false,
3140
+ "type": "option"
3141
+ },
3142
+ "public": {
3143
+ "description": "Include published faces from other accounts",
3144
+ "name": "public",
3145
+ "allowNo": false,
3146
+ "type": "boolean"
3147
+ },
3148
+ "system": {
3149
+ "description": "Show only the curated system faces (published faces owned by 'head')",
3150
+ "name": "system",
3151
+ "allowNo": false,
3152
+ "type": "boolean"
3153
+ },
3154
+ "from-users": {
3155
+ "description": "Only published faces from these owners (repeatable/comma-separated)",
3156
+ "name": "from-users",
3157
+ "hasDynamicHelp": false,
3158
+ "multiple": true,
3159
+ "type": "option"
3160
+ },
3161
+ "not-from-users": {
3162
+ "description": "Exclude published faces from these owners (repeatable/comma-separated)",
3163
+ "name": "not-from-users",
3164
+ "hasDynamicHelp": false,
3165
+ "multiple": true,
3166
+ "type": "option"
3011
3167
  }
3012
3168
  },
3013
3169
  "hasDynamicHelp": false,
3014
3170
  "hiddenAliases": [],
3015
- "id": "team:list",
3171
+ "id": "face:list",
3016
3172
  "pluginAlias": "faces-cli",
3017
3173
  "pluginName": "faces-cli",
3018
3174
  "pluginType": "core",
@@ -3022,20 +3178,20 @@
3022
3178
  "relativePath": [
3023
3179
  "dist",
3024
3180
  "commands",
3025
- "team",
3181
+ "face",
3026
3182
  "list.js"
3027
3183
  ]
3028
3184
  },
3029
- "team:members": {
3185
+ "face:neighbors": {
3030
3186
  "aliases": [],
3031
3187
  "args": {
3032
- "team_id": {
3033
- "description": "Team ID",
3034
- "name": "team_id",
3188
+ "face_id": {
3189
+ "description": "Face alias",
3190
+ "name": "face_id",
3035
3191
  "required": true
3036
3192
  }
3037
3193
  },
3038
- "description": "List members of a team",
3194
+ "description": "Find the most similar or dissimilar owned faces to a given face",
3039
3195
  "flags": {
3040
3196
  "json": {
3041
3197
  "description": "Format output as json.",
@@ -3067,75 +3223,45 @@
3067
3223
  "hasDynamicHelp": false,
3068
3224
  "multiple": false,
3069
3225
  "type": "option"
3070
- }
3071
- },
3072
- "hasDynamicHelp": false,
3073
- "hiddenAliases": [],
3074
- "id": "team:members",
3075
- "pluginAlias": "faces-cli",
3076
- "pluginName": "faces-cli",
3077
- "pluginType": "core",
3078
- "strict": true,
3079
- "enableJsonFlag": true,
3080
- "isESM": true,
3081
- "relativePath": [
3082
- "dist",
3083
- "commands",
3084
- "team",
3085
- "members.js"
3086
- ]
3087
- },
3088
- "team:remove": {
3089
- "aliases": [],
3090
- "args": {
3091
- "team_id": {
3092
- "description": "Team ID",
3093
- "name": "team_id",
3094
- "required": true
3095
- },
3096
- "alias": {
3097
- "description": "Face alias to remove",
3098
- "name": "alias",
3099
- "required": true
3100
- }
3101
- },
3102
- "description": "Remove a face from a team",
3103
- "flags": {
3104
- "json": {
3105
- "description": "Format output as json.",
3106
- "helpGroup": "GLOBAL",
3107
- "name": "json",
3108
- "allowNo": false,
3109
- "type": "boolean"
3110
3226
  },
3111
- "base-url": {
3112
- "description": "API base URL",
3113
- "env": "FACES_BASE_URL",
3114
- "name": "base-url",
3227
+ "k": {
3228
+ "description": "Number of results (1–20)",
3229
+ "name": "k",
3230
+ "default": 5,
3115
3231
  "hasDynamicHelp": false,
3116
3232
  "multiple": false,
3117
3233
  "type": "option"
3118
3234
  },
3119
- "token": {
3120
- "description": "JWT bearer token",
3121
- "env": "FACES_TOKEN",
3122
- "name": "token",
3235
+ "component": {
3236
+ "description": "Centroid component to rank on (beta, delta, epsilon are the principal components of a face; face is their composite)",
3237
+ "name": "component",
3238
+ "default": "face",
3123
3239
  "hasDynamicHelp": false,
3124
3240
  "multiple": false,
3241
+ "options": [
3242
+ "face",
3243
+ "beta",
3244
+ "delta",
3245
+ "epsilon"
3246
+ ],
3125
3247
  "type": "option"
3126
3248
  },
3127
- "api-key": {
3128
- "description": "API key",
3129
- "env": "FACES_API_KEY",
3130
- "name": "api-key",
3249
+ "direction": {
3250
+ "description": "nearest (most similar) or furthest (most dissimilar)",
3251
+ "name": "direction",
3252
+ "default": "nearest",
3131
3253
  "hasDynamicHelp": false,
3132
3254
  "multiple": false,
3255
+ "options": [
3256
+ "nearest",
3257
+ "furthest"
3258
+ ],
3133
3259
  "type": "option"
3134
3260
  }
3135
3261
  },
3136
3262
  "hasDynamicHelp": false,
3137
3263
  "hiddenAliases": [],
3138
- "id": "team:remove",
3264
+ "id": "face:neighbors",
3139
3265
  "pluginAlias": "faces-cli",
3140
3266
  "pluginName": "faces-cli",
3141
3267
  "pluginType": "core",
@@ -3145,14 +3271,14 @@
3145
3271
  "relativePath": [
3146
3272
  "dist",
3147
3273
  "commands",
3148
- "team",
3149
- "remove.js"
3274
+ "face",
3275
+ "neighbors.js"
3150
3276
  ]
3151
3277
  },
3152
- "face:attributes": {
3278
+ "face:stats": {
3153
3279
  "aliases": [],
3154
3280
  "args": {},
3155
- "description": "List all supported attribute keys",
3281
+ "description": "Compile and chat stats for all owned faces",
3156
3282
  "flags": {
3157
3283
  "json": {
3158
3284
  "description": "Format output as json.",
@@ -3188,7 +3314,7 @@
3188
3314
  },
3189
3315
  "hasDynamicHelp": false,
3190
3316
  "hiddenAliases": [],
3191
- "id": "face:attributes",
3317
+ "id": "face:stats",
3192
3318
  "pluginAlias": "faces-cli",
3193
3319
  "pluginName": "faces-cli",
3194
3320
  "pluginType": "core",
@@ -3199,13 +3325,19 @@
3199
3325
  "dist",
3200
3326
  "commands",
3201
3327
  "face",
3202
- "attributes.js"
3328
+ "stats.js"
3203
3329
  ]
3204
3330
  },
3205
- "face:create": {
3331
+ "face:teams": {
3206
3332
  "aliases": [],
3207
- "args": {},
3208
- "description": "Create a new face",
3333
+ "args": {
3334
+ "alias": {
3335
+ "description": "Face alias",
3336
+ "name": "alias",
3337
+ "required": true
3338
+ }
3339
+ },
3340
+ "description": "Set a face's team memberships (replaces all)",
3209
3341
  "flags": {
3210
3342
  "json": {
3211
3343
  "description": "Format output as json.",
@@ -3237,61 +3369,11 @@
3237
3369
  "hasDynamicHelp": false,
3238
3370
  "multiple": false,
3239
3371
  "type": "option"
3240
- },
3241
- "name": {
3242
- "description": "Display name",
3243
- "name": "name",
3244
- "required": true,
3245
- "hasDynamicHelp": false,
3246
- "multiple": false,
3247
- "type": "option"
3248
- },
3249
- "alias": {
3250
- "description": "Unique alias slug",
3251
- "name": "alias",
3252
- "required": true,
3253
- "hasDynamicHelp": false,
3254
- "multiple": false,
3255
- "type": "option"
3256
- },
3257
- "description": {
3258
- "description": "Plain-text description / bio (max 1500 chars)",
3259
- "name": "description",
3260
- "hasDynamicHelp": false,
3261
- "multiple": false,
3262
- "type": "option"
3263
- },
3264
- "tag": {
3265
- "description": "Tag label (repeatable, lowercase)",
3266
- "name": "tag",
3267
- "hasDynamicHelp": false,
3268
- "multiple": true,
3269
- "type": "option"
3270
- },
3271
- "default-model": {
3272
- "description": "Default LLM for chat (e.g. gpt-4o-mini, claude-sonnet-4-6)",
3273
- "name": "default-model",
3274
- "hasDynamicHelp": false,
3275
- "multiple": false,
3276
- "type": "option"
3277
- },
3278
- "formula": {
3279
- "description": "Boolean formula over owned concrete face aliases (e.g. \"a | b\", \"(a | b) - c\"). Creates a composite face.",
3280
- "name": "formula",
3281
- "hasDynamicHelp": false,
3282
- "multiple": false,
3283
- "type": "option"
3284
- },
3285
- "attr": {
3286
- "description": "Attribute KEY=VALUE (repeatable)",
3287
- "name": "attr",
3288
- "hasDynamicHelp": false,
3289
- "multiple": true,
3290
- "type": "option"
3291
- },
3292
- "tool": {
3293
- "description": "Tool name to enable (repeatable)",
3294
- "name": "tool",
3372
+ },
3373
+ "team": {
3374
+ "description": "Team ID (repeatable, replaces all memberships)",
3375
+ "name": "team",
3376
+ "required": true,
3295
3377
  "hasDynamicHelp": false,
3296
3378
  "multiple": true,
3297
3379
  "type": "option"
@@ -3299,7 +3381,7 @@
3299
3381
  },
3300
3382
  "hasDynamicHelp": false,
3301
3383
  "hiddenAliases": [],
3302
- "id": "face:create",
3384
+ "id": "face:teams",
3303
3385
  "pluginAlias": "faces-cli",
3304
3386
  "pluginName": "faces-cli",
3305
3387
  "pluginType": "core",
@@ -3310,10 +3392,10 @@
3310
3392
  "dist",
3311
3393
  "commands",
3312
3394
  "face",
3313
- "create.js"
3395
+ "teams.js"
3314
3396
  ]
3315
3397
  },
3316
- "face:delete": {
3398
+ "face:upload": {
3317
3399
  "aliases": [],
3318
3400
  "args": {
3319
3401
  "face_id": {
@@ -3322,7 +3404,7 @@
3322
3404
  "required": true
3323
3405
  }
3324
3406
  },
3325
- "description": "Delete a face permanently",
3407
+ "description": "Upload a file (text/PDF/audio/video) to a face",
3326
3408
  "flags": {
3327
3409
  "json": {
3328
3410
  "description": "Format output as json.",
@@ -3355,16 +3437,49 @@
3355
3437
  "multiple": false,
3356
3438
  "type": "option"
3357
3439
  },
3358
- "yes": {
3359
- "description": "Skip confirmation",
3360
- "name": "yes",
3361
- "allowNo": false,
3362
- "type": "boolean"
3440
+ "file": {
3441
+ "description": "File to upload",
3442
+ "name": "file",
3443
+ "required": true,
3444
+ "hasDynamicHelp": false,
3445
+ "multiple": false,
3446
+ "type": "option"
3447
+ },
3448
+ "kind": {
3449
+ "description": "Upload kind: document or thread",
3450
+ "name": "kind",
3451
+ "default": "document",
3452
+ "hasDynamicHelp": false,
3453
+ "multiple": false,
3454
+ "options": [
3455
+ "document",
3456
+ "thread"
3457
+ ],
3458
+ "type": "option"
3459
+ },
3460
+ "perspective": {
3461
+ "description": "Perspective (document only)",
3462
+ "name": "perspective",
3463
+ "default": "third-person",
3464
+ "hasDynamicHelp": false,
3465
+ "multiple": false,
3466
+ "options": [
3467
+ "first-person",
3468
+ "third-person"
3469
+ ],
3470
+ "type": "option"
3471
+ },
3472
+ "face-speaker": {
3473
+ "description": "Speaker name to map to the face (thread only). If omitted, first speaker is used.",
3474
+ "name": "face-speaker",
3475
+ "hasDynamicHelp": false,
3476
+ "multiple": false,
3477
+ "type": "option"
3363
3478
  }
3364
3479
  },
3365
3480
  "hasDynamicHelp": false,
3366
3481
  "hiddenAliases": [],
3367
- "id": "face:delete",
3482
+ "id": "face:upload",
3368
3483
  "pluginAlias": "faces-cli",
3369
3484
  "pluginName": "faces-cli",
3370
3485
  "pluginType": "core",
@@ -3375,13 +3490,19 @@
3375
3490
  "dist",
3376
3491
  "commands",
3377
3492
  "face",
3378
- "delete.js"
3493
+ "upload.js"
3379
3494
  ]
3380
3495
  },
3381
- "face:diff": {
3496
+ "team:add": {
3382
3497
  "aliases": [],
3383
- "args": {},
3384
- "description": "Compare owned faces pairwise across all centroid components",
3498
+ "args": {
3499
+ "team_id": {
3500
+ "description": "Team ID",
3501
+ "name": "team_id",
3502
+ "required": true
3503
+ }
3504
+ },
3505
+ "description": "Add face(s) to a team",
3385
3506
  "flags": {
3386
3507
  "json": {
3387
3508
  "description": "Format output as json.",
@@ -3415,7 +3536,7 @@
3415
3536
  "type": "option"
3416
3537
  },
3417
3538
  "face": {
3418
- "description": "Face alias to include (repeatable, min 2)",
3539
+ "description": "Face alias to add (repeatable)",
3419
3540
  "name": "face",
3420
3541
  "required": true,
3421
3542
  "hasDynamicHelp": false,
@@ -3425,7 +3546,7 @@
3425
3546
  },
3426
3547
  "hasDynamicHelp": false,
3427
3548
  "hiddenAliases": [],
3428
- "id": "face:diff",
3549
+ "id": "team:add",
3429
3550
  "pluginAlias": "faces-cli",
3430
3551
  "pluginName": "faces-cli",
3431
3552
  "pluginType": "core",
@@ -3435,20 +3556,14 @@
3435
3556
  "relativePath": [
3436
3557
  "dist",
3437
3558
  "commands",
3438
- "face",
3439
- "diff.js"
3559
+ "team",
3560
+ "add.js"
3440
3561
  ]
3441
3562
  },
3442
- "face:edit": {
3563
+ "team:create": {
3443
3564
  "aliases": [],
3444
- "args": {
3445
- "face_id": {
3446
- "description": "Face alias",
3447
- "name": "face_id",
3448
- "required": true
3449
- }
3450
- },
3451
- "description": "Edit a face's metadata",
3565
+ "args": {},
3566
+ "description": "Create a new team",
3452
3567
  "flags": {
3453
3568
  "json": {
3454
3569
  "description": "Format output as json.",
@@ -3482,50 +3597,37 @@
3482
3597
  "type": "option"
3483
3598
  },
3484
3599
  "name": {
3485
- "description": "New display name",
3600
+ "description": "Team name",
3486
3601
  "name": "name",
3602
+ "required": true,
3487
3603
  "hasDynamicHelp": false,
3488
3604
  "multiple": false,
3489
3605
  "type": "option"
3490
3606
  },
3491
3607
  "description": {
3492
- "description": "Plain-text description / bio (max 1500 chars)",
3608
+ "description": "Plain-text team description (max 1500 chars)",
3493
3609
  "name": "description",
3494
3610
  "hasDynamicHelp": false,
3495
3611
  "multiple": false,
3496
3612
  "type": "option"
3497
3613
  },
3498
- "tag": {
3499
- "description": "Replace all tags (repeatable, lowercase)",
3500
- "name": "tag",
3501
- "hasDynamicHelp": false,
3502
- "multiple": true,
3503
- "type": "option"
3504
- },
3505
- "default-model": {
3506
- "description": "Default LLM for chat (e.g. gpt-4o-mini, claude-sonnet-4-6)",
3507
- "name": "default-model",
3614
+ "protocol": {
3615
+ "description": "Protocol content (mermaid diagram or markdown, max 1000 words)",
3616
+ "name": "protocol",
3508
3617
  "hasDynamicHelp": false,
3509
3618
  "multiple": false,
3510
3619
  "type": "option"
3511
3620
  },
3512
- "formula": {
3513
- "description": "New boolean formula (synthetic faces only)",
3514
- "name": "formula",
3621
+ "protocol-file": {
3622
+ "description": "Read protocol from file",
3623
+ "name": "protocol-file",
3515
3624
  "hasDynamicHelp": false,
3516
3625
  "multiple": false,
3517
3626
  "type": "option"
3518
3627
  },
3519
- "attr": {
3520
- "description": "Update attribute KEY=VALUE (repeatable)",
3521
- "name": "attr",
3522
- "hasDynamicHelp": false,
3523
- "multiple": true,
3524
- "type": "option"
3525
- },
3526
- "tool": {
3527
- "description": "Tool names to set (replaces list, repeatable)",
3528
- "name": "tool",
3628
+ "tag": {
3629
+ "description": "Tag label (repeatable, lowercase)",
3630
+ "name": "tag",
3529
3631
  "hasDynamicHelp": false,
3530
3632
  "multiple": true,
3531
3633
  "type": "option"
@@ -3533,7 +3635,7 @@
3533
3635
  },
3534
3636
  "hasDynamicHelp": false,
3535
3637
  "hiddenAliases": [],
3536
- "id": "face:edit",
3638
+ "id": "team:create",
3537
3639
  "pluginAlias": "faces-cli",
3538
3640
  "pluginName": "faces-cli",
3539
3641
  "pluginType": "core",
@@ -3543,20 +3645,20 @@
3543
3645
  "relativePath": [
3544
3646
  "dist",
3545
3647
  "commands",
3546
- "face",
3547
- "edit.js"
3648
+ "team",
3649
+ "create.js"
3548
3650
  ]
3549
3651
  },
3550
- "face:get": {
3652
+ "team:delete": {
3551
3653
  "aliases": [],
3552
3654
  "args": {
3553
- "face_id": {
3554
- "description": "Face alias",
3555
- "name": "face_id",
3655
+ "team_id": {
3656
+ "description": "Team ID",
3657
+ "name": "team_id",
3556
3658
  "required": true
3557
3659
  }
3558
3660
  },
3559
- "description": "Get details for a face by alias",
3661
+ "description": "Delete a team",
3560
3662
  "flags": {
3561
3663
  "json": {
3562
3664
  "description": "Format output as json.",
@@ -3589,17 +3691,16 @@
3589
3691
  "multiple": false,
3590
3692
  "type": "option"
3591
3693
  },
3592
- "include": {
3593
- "description": "Include extra fields: tags, teams (comma-separated)",
3594
- "name": "include",
3595
- "hasDynamicHelp": false,
3596
- "multiple": false,
3597
- "type": "option"
3694
+ "yes": {
3695
+ "description": "Skip confirmation",
3696
+ "name": "yes",
3697
+ "allowNo": false,
3698
+ "type": "boolean"
3598
3699
  }
3599
3700
  },
3600
3701
  "hasDynamicHelp": false,
3601
3702
  "hiddenAliases": [],
3602
- "id": "face:get",
3703
+ "id": "team:delete",
3603
3704
  "pluginAlias": "faces-cli",
3604
3705
  "pluginName": "faces-cli",
3605
3706
  "pluginType": "core",
@@ -3609,14 +3710,20 @@
3609
3710
  "relativePath": [
3610
3711
  "dist",
3611
3712
  "commands",
3612
- "face",
3613
- "get.js"
3713
+ "team",
3714
+ "delete.js"
3614
3715
  ]
3615
3716
  },
3616
- "face:list": {
3717
+ "team:edit": {
3617
3718
  "aliases": [],
3618
- "args": {},
3619
- "description": "List all owned faces",
3719
+ "args": {
3720
+ "team_id": {
3721
+ "description": "Team ID",
3722
+ "name": "team_id",
3723
+ "required": true
3724
+ }
3725
+ },
3726
+ "description": "Edit a team",
3620
3727
  "flags": {
3621
3728
  "json": {
3622
3729
  "description": "Format output as json.",
@@ -3649,23 +3756,30 @@
3649
3756
  "multiple": false,
3650
3757
  "type": "option"
3651
3758
  },
3652
- "tag": {
3653
- "description": "Filter by tag (repeatable, AND logic)",
3654
- "name": "tag",
3759
+ "name": {
3760
+ "description": "New team name",
3761
+ "name": "name",
3655
3762
  "hasDynamicHelp": false,
3656
- "multiple": true,
3763
+ "multiple": false,
3657
3764
  "type": "option"
3658
3765
  },
3659
- "team": {
3660
- "description": "Filter by team ID (repeatable, OR logic)",
3661
- "name": "team",
3766
+ "description": {
3767
+ "description": "New description (max 1500 chars)",
3768
+ "name": "description",
3662
3769
  "hasDynamicHelp": false,
3663
- "multiple": true,
3770
+ "multiple": false,
3664
3771
  "type": "option"
3665
3772
  },
3666
- "include": {
3667
- "description": "Include extra fields: tags, teams (comma-separated)",
3668
- "name": "include",
3773
+ "protocol": {
3774
+ "description": "New protocol content",
3775
+ "name": "protocol",
3776
+ "hasDynamicHelp": false,
3777
+ "multiple": false,
3778
+ "type": "option"
3779
+ },
3780
+ "protocol-file": {
3781
+ "description": "Read protocol from file",
3782
+ "name": "protocol-file",
3669
3783
  "hasDynamicHelp": false,
3670
3784
  "multiple": false,
3671
3785
  "type": "option"
@@ -3673,7 +3787,7 @@
3673
3787
  },
3674
3788
  "hasDynamicHelp": false,
3675
3789
  "hiddenAliases": [],
3676
- "id": "face:list",
3790
+ "id": "team:edit",
3677
3791
  "pluginAlias": "faces-cli",
3678
3792
  "pluginName": "faces-cli",
3679
3793
  "pluginType": "core",
@@ -3683,20 +3797,20 @@
3683
3797
  "relativePath": [
3684
3798
  "dist",
3685
3799
  "commands",
3686
- "face",
3687
- "list.js"
3800
+ "team",
3801
+ "edit.js"
3688
3802
  ]
3689
3803
  },
3690
- "face:neighbors": {
3804
+ "team:get": {
3691
3805
  "aliases": [],
3692
3806
  "args": {
3693
- "face_id": {
3694
- "description": "Face alias",
3695
- "name": "face_id",
3807
+ "team_id": {
3808
+ "description": "Team ID",
3809
+ "name": "team_id",
3696
3810
  "required": true
3697
3811
  }
3698
3812
  },
3699
- "description": "Find the most similar or dissimilar owned faces to a given face",
3813
+ "description": "Get a team by ID",
3700
3814
  "flags": {
3701
3815
  "json": {
3702
3816
  "description": "Format output as json.",
@@ -3728,45 +3842,11 @@
3728
3842
  "hasDynamicHelp": false,
3729
3843
  "multiple": false,
3730
3844
  "type": "option"
3731
- },
3732
- "k": {
3733
- "description": "Number of results (1–20)",
3734
- "name": "k",
3735
- "default": 5,
3736
- "hasDynamicHelp": false,
3737
- "multiple": false,
3738
- "type": "option"
3739
- },
3740
- "component": {
3741
- "description": "Centroid component to rank on (beta, delta, epsilon are the principal components of a face; face is their composite)",
3742
- "name": "component",
3743
- "default": "face",
3744
- "hasDynamicHelp": false,
3745
- "multiple": false,
3746
- "options": [
3747
- "face",
3748
- "beta",
3749
- "delta",
3750
- "epsilon"
3751
- ],
3752
- "type": "option"
3753
- },
3754
- "direction": {
3755
- "description": "nearest (most similar) or furthest (most dissimilar)",
3756
- "name": "direction",
3757
- "default": "nearest",
3758
- "hasDynamicHelp": false,
3759
- "multiple": false,
3760
- "options": [
3761
- "nearest",
3762
- "furthest"
3763
- ],
3764
- "type": "option"
3765
3845
  }
3766
3846
  },
3767
3847
  "hasDynamicHelp": false,
3768
3848
  "hiddenAliases": [],
3769
- "id": "face:neighbors",
3849
+ "id": "team:get",
3770
3850
  "pluginAlias": "faces-cli",
3771
3851
  "pluginName": "faces-cli",
3772
3852
  "pluginType": "core",
@@ -3776,14 +3856,14 @@
3776
3856
  "relativePath": [
3777
3857
  "dist",
3778
3858
  "commands",
3779
- "face",
3780
- "neighbors.js"
3859
+ "team",
3860
+ "get.js"
3781
3861
  ]
3782
3862
  },
3783
- "face:stats": {
3863
+ "team:list": {
3784
3864
  "aliases": [],
3785
3865
  "args": {},
3786
- "description": "Compile and chat stats for all owned faces",
3866
+ "description": "List your teams",
3787
3867
  "flags": {
3788
3868
  "json": {
3789
3869
  "description": "Format output as json.",
@@ -3819,7 +3899,7 @@
3819
3899
  },
3820
3900
  "hasDynamicHelp": false,
3821
3901
  "hiddenAliases": [],
3822
- "id": "face:stats",
3902
+ "id": "team:list",
3823
3903
  "pluginAlias": "faces-cli",
3824
3904
  "pluginName": "faces-cli",
3825
3905
  "pluginType": "core",
@@ -3829,20 +3909,20 @@
3829
3909
  "relativePath": [
3830
3910
  "dist",
3831
3911
  "commands",
3832
- "face",
3833
- "stats.js"
3912
+ "team",
3913
+ "list.js"
3834
3914
  ]
3835
3915
  },
3836
- "face:teams": {
3916
+ "team:members": {
3837
3917
  "aliases": [],
3838
3918
  "args": {
3839
- "alias": {
3840
- "description": "Face alias",
3841
- "name": "alias",
3919
+ "team_id": {
3920
+ "description": "Team ID",
3921
+ "name": "team_id",
3842
3922
  "required": true
3843
3923
  }
3844
3924
  },
3845
- "description": "Set a face's team memberships (replaces all)",
3925
+ "description": "List members of a team",
3846
3926
  "flags": {
3847
3927
  "json": {
3848
3928
  "description": "Format output as json.",
@@ -3874,19 +3954,11 @@
3874
3954
  "hasDynamicHelp": false,
3875
3955
  "multiple": false,
3876
3956
  "type": "option"
3877
- },
3878
- "team": {
3879
- "description": "Team ID (repeatable, replaces all memberships)",
3880
- "name": "team",
3881
- "required": true,
3882
- "hasDynamicHelp": false,
3883
- "multiple": true,
3884
- "type": "option"
3885
3957
  }
3886
3958
  },
3887
3959
  "hasDynamicHelp": false,
3888
3960
  "hiddenAliases": [],
3889
- "id": "face:teams",
3961
+ "id": "team:members",
3890
3962
  "pluginAlias": "faces-cli",
3891
3963
  "pluginName": "faces-cli",
3892
3964
  "pluginType": "core",
@@ -3896,20 +3968,25 @@
3896
3968
  "relativePath": [
3897
3969
  "dist",
3898
3970
  "commands",
3899
- "face",
3900
- "teams.js"
3971
+ "team",
3972
+ "members.js"
3901
3973
  ]
3902
3974
  },
3903
- "face:upload": {
3975
+ "team:remove": {
3904
3976
  "aliases": [],
3905
3977
  "args": {
3906
- "face_id": {
3907
- "description": "Face alias",
3908
- "name": "face_id",
3978
+ "team_id": {
3979
+ "description": "Team ID",
3980
+ "name": "team_id",
3981
+ "required": true
3982
+ },
3983
+ "alias": {
3984
+ "description": "Face alias to remove",
3985
+ "name": "alias",
3909
3986
  "required": true
3910
3987
  }
3911
3988
  },
3912
- "description": "Upload a file (text/PDF/audio/video) to a face",
3989
+ "description": "Remove a face from a team",
3913
3990
  "flags": {
3914
3991
  "json": {
3915
3992
  "description": "Format output as json.",
@@ -3941,50 +4018,11 @@
3941
4018
  "hasDynamicHelp": false,
3942
4019
  "multiple": false,
3943
4020
  "type": "option"
3944
- },
3945
- "file": {
3946
- "description": "File to upload",
3947
- "name": "file",
3948
- "required": true,
3949
- "hasDynamicHelp": false,
3950
- "multiple": false,
3951
- "type": "option"
3952
- },
3953
- "kind": {
3954
- "description": "Upload kind: document or thread",
3955
- "name": "kind",
3956
- "default": "document",
3957
- "hasDynamicHelp": false,
3958
- "multiple": false,
3959
- "options": [
3960
- "document",
3961
- "thread"
3962
- ],
3963
- "type": "option"
3964
- },
3965
- "perspective": {
3966
- "description": "Perspective (document only)",
3967
- "name": "perspective",
3968
- "default": "third-person",
3969
- "hasDynamicHelp": false,
3970
- "multiple": false,
3971
- "options": [
3972
- "first-person",
3973
- "third-person"
3974
- ],
3975
- "type": "option"
3976
- },
3977
- "face-speaker": {
3978
- "description": "Speaker name to map to the face (thread only). If omitted, first speaker is used.",
3979
- "name": "face-speaker",
3980
- "hasDynamicHelp": false,
3981
- "multiple": false,
3982
- "type": "option"
3983
4021
  }
3984
4022
  },
3985
4023
  "hasDynamicHelp": false,
3986
4024
  "hiddenAliases": [],
3987
- "id": "face:upload",
4025
+ "id": "team:remove",
3988
4026
  "pluginAlias": "faces-cli",
3989
4027
  "pluginName": "faces-cli",
3990
4028
  "pluginType": "core",
@@ -3994,8 +4032,8 @@
3994
4032
  "relativePath": [
3995
4033
  "dist",
3996
4034
  "commands",
3997
- "face",
3998
- "upload.js"
4035
+ "team",
4036
+ "remove.js"
3999
4037
  ]
4000
4038
  },
4001
4039
  "billing:subscription:activate": {
@@ -5463,16 +5501,16 @@
5463
5501
  "sync.js"
5464
5502
  ]
5465
5503
  },
5466
- "team:tag:add": {
5504
+ "face:tag:add": {
5467
5505
  "aliases": [],
5468
5506
  "args": {
5469
- "team_id": {
5470
- "description": "Team ID",
5471
- "name": "team_id",
5507
+ "alias": {
5508
+ "description": "Face alias",
5509
+ "name": "alias",
5472
5510
  "required": true
5473
5511
  }
5474
5512
  },
5475
- "description": "Add tags to a team (appends, idempotent)",
5513
+ "description": "Add tags to a face (appends, idempotent)",
5476
5514
  "flags": {
5477
5515
  "json": {
5478
5516
  "description": "Format output as json.",
@@ -5516,7 +5554,7 @@
5516
5554
  },
5517
5555
  "hasDynamicHelp": false,
5518
5556
  "hiddenAliases": [],
5519
- "id": "team:tag:add",
5557
+ "id": "face:tag:add",
5520
5558
  "pluginAlias": "faces-cli",
5521
5559
  "pluginName": "faces-cli",
5522
5560
  "pluginType": "core",
@@ -5526,21 +5564,15 @@
5526
5564
  "relativePath": [
5527
5565
  "dist",
5528
5566
  "commands",
5529
- "team",
5567
+ "face",
5530
5568
  "tag",
5531
5569
  "add.js"
5532
5570
  ]
5533
5571
  },
5534
- "team:tag:list": {
5572
+ "face:tag:all": {
5535
5573
  "aliases": [],
5536
- "args": {
5537
- "team_id": {
5538
- "description": "Team ID",
5539
- "name": "team_id",
5540
- "required": true
5541
- }
5542
- },
5543
- "description": "List tags on a team",
5574
+ "args": {},
5575
+ "description": "List all tags across all your faces",
5544
5576
  "flags": {
5545
5577
  "json": {
5546
5578
  "description": "Format output as json.",
@@ -5576,7 +5608,7 @@
5576
5608
  },
5577
5609
  "hasDynamicHelp": false,
5578
5610
  "hiddenAliases": [],
5579
- "id": "team:tag:list",
5611
+ "id": "face:tag:all",
5580
5612
  "pluginAlias": "faces-cli",
5581
5613
  "pluginName": "faces-cli",
5582
5614
  "pluginType": "core",
@@ -5586,26 +5618,21 @@
5586
5618
  "relativePath": [
5587
5619
  "dist",
5588
5620
  "commands",
5589
- "team",
5621
+ "face",
5590
5622
  "tag",
5591
- "list.js"
5623
+ "all.js"
5592
5624
  ]
5593
5625
  },
5594
- "team:tag:remove": {
5626
+ "face:tag:list": {
5595
5627
  "aliases": [],
5596
5628
  "args": {
5597
- "team_id": {
5598
- "description": "Team ID",
5599
- "name": "team_id",
5600
- "required": true
5601
- },
5602
- "tag": {
5603
- "description": "Tag to remove",
5604
- "name": "tag",
5629
+ "alias": {
5630
+ "description": "Face alias",
5631
+ "name": "alias",
5605
5632
  "required": true
5606
5633
  }
5607
5634
  },
5608
- "description": "Remove a tag from a team",
5635
+ "description": "List tags on a face",
5609
5636
  "flags": {
5610
5637
  "json": {
5611
5638
  "description": "Format output as json.",
@@ -5641,7 +5668,7 @@
5641
5668
  },
5642
5669
  "hasDynamicHelp": false,
5643
5670
  "hiddenAliases": [],
5644
- "id": "team:tag:remove",
5671
+ "id": "face:tag:list",
5645
5672
  "pluginAlias": "faces-cli",
5646
5673
  "pluginName": "faces-cli",
5647
5674
  "pluginType": "core",
@@ -5651,21 +5678,26 @@
5651
5678
  "relativePath": [
5652
5679
  "dist",
5653
5680
  "commands",
5654
- "team",
5681
+ "face",
5655
5682
  "tag",
5656
- "remove.js"
5683
+ "list.js"
5657
5684
  ]
5658
5685
  },
5659
- "team:tag:set": {
5686
+ "face:tag:remove": {
5660
5687
  "aliases": [],
5661
5688
  "args": {
5662
- "team_id": {
5663
- "description": "Team ID",
5664
- "name": "team_id",
5689
+ "alias": {
5690
+ "description": "Face alias",
5691
+ "name": "alias",
5692
+ "required": true
5693
+ },
5694
+ "tag": {
5695
+ "description": "Tag to remove",
5696
+ "name": "tag",
5665
5697
  "required": true
5666
5698
  }
5667
5699
  },
5668
- "description": "Replace all tags on a team",
5700
+ "description": "Remove a tag from a face",
5669
5701
  "flags": {
5670
5702
  "json": {
5671
5703
  "description": "Format output as json.",
@@ -5697,19 +5729,11 @@
5697
5729
  "hasDynamicHelp": false,
5698
5730
  "multiple": false,
5699
5731
  "type": "option"
5700
- },
5701
- "tag": {
5702
- "description": "Tag to set (repeatable, replaces all)",
5703
- "name": "tag",
5704
- "required": true,
5705
- "hasDynamicHelp": false,
5706
- "multiple": true,
5707
- "type": "option"
5708
5732
  }
5709
5733
  },
5710
5734
  "hasDynamicHelp": false,
5711
5735
  "hiddenAliases": [],
5712
- "id": "team:tag:set",
5736
+ "id": "face:tag:remove",
5713
5737
  "pluginAlias": "faces-cli",
5714
5738
  "pluginName": "faces-cli",
5715
5739
  "pluginType": "core",
@@ -5719,12 +5743,12 @@
5719
5743
  "relativePath": [
5720
5744
  "dist",
5721
5745
  "commands",
5722
- "team",
5746
+ "face",
5723
5747
  "tag",
5724
- "set.js"
5748
+ "remove.js"
5725
5749
  ]
5726
5750
  },
5727
- "face:tag:add": {
5751
+ "face:tag:set": {
5728
5752
  "aliases": [],
5729
5753
  "args": {
5730
5754
  "alias": {
@@ -5733,7 +5757,7 @@
5733
5757
  "required": true
5734
5758
  }
5735
5759
  },
5736
- "description": "Add tags to a face (appends, idempotent)",
5760
+ "description": "Replace all tags on a face",
5737
5761
  "flags": {
5738
5762
  "json": {
5739
5763
  "description": "Format output as json.",
@@ -5767,7 +5791,7 @@
5767
5791
  "type": "option"
5768
5792
  },
5769
5793
  "tag": {
5770
- "description": "Tag to add (repeatable)",
5794
+ "description": "Tag to set (repeatable, replaces all)",
5771
5795
  "name": "tag",
5772
5796
  "required": true,
5773
5797
  "hasDynamicHelp": false,
@@ -5777,7 +5801,7 @@
5777
5801
  },
5778
5802
  "hasDynamicHelp": false,
5779
5803
  "hiddenAliases": [],
5780
- "id": "face:tag:add",
5804
+ "id": "face:tag:set",
5781
5805
  "pluginAlias": "faces-cli",
5782
5806
  "pluginName": "faces-cli",
5783
5807
  "pluginType": "core",
@@ -5789,13 +5813,19 @@
5789
5813
  "commands",
5790
5814
  "face",
5791
5815
  "tag",
5792
- "add.js"
5816
+ "set.js"
5793
5817
  ]
5794
5818
  },
5795
- "face:tag:all": {
5819
+ "team:tag:add": {
5796
5820
  "aliases": [],
5797
- "args": {},
5798
- "description": "List all tags across all your faces",
5821
+ "args": {
5822
+ "team_id": {
5823
+ "description": "Team ID",
5824
+ "name": "team_id",
5825
+ "required": true
5826
+ }
5827
+ },
5828
+ "description": "Add tags to a team (appends, idempotent)",
5799
5829
  "flags": {
5800
5830
  "json": {
5801
5831
  "description": "Format output as json.",
@@ -5827,11 +5857,19 @@
5827
5857
  "hasDynamicHelp": false,
5828
5858
  "multiple": false,
5829
5859
  "type": "option"
5860
+ },
5861
+ "tag": {
5862
+ "description": "Tag to add (repeatable)",
5863
+ "name": "tag",
5864
+ "required": true,
5865
+ "hasDynamicHelp": false,
5866
+ "multiple": true,
5867
+ "type": "option"
5830
5868
  }
5831
5869
  },
5832
5870
  "hasDynamicHelp": false,
5833
5871
  "hiddenAliases": [],
5834
- "id": "face:tag:all",
5872
+ "id": "team:tag:add",
5835
5873
  "pluginAlias": "faces-cli",
5836
5874
  "pluginName": "faces-cli",
5837
5875
  "pluginType": "core",
@@ -5841,21 +5879,21 @@
5841
5879
  "relativePath": [
5842
5880
  "dist",
5843
5881
  "commands",
5844
- "face",
5882
+ "team",
5845
5883
  "tag",
5846
- "all.js"
5884
+ "add.js"
5847
5885
  ]
5848
5886
  },
5849
- "face:tag:list": {
5887
+ "team:tag:list": {
5850
5888
  "aliases": [],
5851
5889
  "args": {
5852
- "alias": {
5853
- "description": "Face alias",
5854
- "name": "alias",
5890
+ "team_id": {
5891
+ "description": "Team ID",
5892
+ "name": "team_id",
5855
5893
  "required": true
5856
5894
  }
5857
5895
  },
5858
- "description": "List tags on a face",
5896
+ "description": "List tags on a team",
5859
5897
  "flags": {
5860
5898
  "json": {
5861
5899
  "description": "Format output as json.",
@@ -5891,7 +5929,7 @@
5891
5929
  },
5892
5930
  "hasDynamicHelp": false,
5893
5931
  "hiddenAliases": [],
5894
- "id": "face:tag:list",
5932
+ "id": "team:tag:list",
5895
5933
  "pluginAlias": "faces-cli",
5896
5934
  "pluginName": "faces-cli",
5897
5935
  "pluginType": "core",
@@ -5901,17 +5939,17 @@
5901
5939
  "relativePath": [
5902
5940
  "dist",
5903
5941
  "commands",
5904
- "face",
5942
+ "team",
5905
5943
  "tag",
5906
5944
  "list.js"
5907
5945
  ]
5908
5946
  },
5909
- "face:tag:remove": {
5947
+ "team:tag:remove": {
5910
5948
  "aliases": [],
5911
5949
  "args": {
5912
- "alias": {
5913
- "description": "Face alias",
5914
- "name": "alias",
5950
+ "team_id": {
5951
+ "description": "Team ID",
5952
+ "name": "team_id",
5915
5953
  "required": true
5916
5954
  },
5917
5955
  "tag": {
@@ -5920,7 +5958,7 @@
5920
5958
  "required": true
5921
5959
  }
5922
5960
  },
5923
- "description": "Remove a tag from a face",
5961
+ "description": "Remove a tag from a team",
5924
5962
  "flags": {
5925
5963
  "json": {
5926
5964
  "description": "Format output as json.",
@@ -5956,7 +5994,7 @@
5956
5994
  },
5957
5995
  "hasDynamicHelp": false,
5958
5996
  "hiddenAliases": [],
5959
- "id": "face:tag:remove",
5997
+ "id": "team:tag:remove",
5960
5998
  "pluginAlias": "faces-cli",
5961
5999
  "pluginName": "faces-cli",
5962
6000
  "pluginType": "core",
@@ -5966,21 +6004,21 @@
5966
6004
  "relativePath": [
5967
6005
  "dist",
5968
6006
  "commands",
5969
- "face",
6007
+ "team",
5970
6008
  "tag",
5971
6009
  "remove.js"
5972
6010
  ]
5973
6011
  },
5974
- "face:tag:set": {
6012
+ "team:tag:set": {
5975
6013
  "aliases": [],
5976
6014
  "args": {
5977
- "alias": {
5978
- "description": "Face alias",
5979
- "name": "alias",
6015
+ "team_id": {
6016
+ "description": "Team ID",
6017
+ "name": "team_id",
5980
6018
  "required": true
5981
6019
  }
5982
6020
  },
5983
- "description": "Replace all tags on a face",
6021
+ "description": "Replace all tags on a team",
5984
6022
  "flags": {
5985
6023
  "json": {
5986
6024
  "description": "Format output as json.",
@@ -6024,7 +6062,7 @@
6024
6062
  },
6025
6063
  "hasDynamicHelp": false,
6026
6064
  "hiddenAliases": [],
6027
- "id": "face:tag:set",
6065
+ "id": "team:tag:set",
6028
6066
  "pluginAlias": "faces-cli",
6029
6067
  "pluginName": "faces-cli",
6030
6068
  "pluginType": "core",
@@ -6034,11 +6072,11 @@
6034
6072
  "relativePath": [
6035
6073
  "dist",
6036
6074
  "commands",
6037
- "face",
6075
+ "team",
6038
6076
  "tag",
6039
6077
  "set.js"
6040
6078
  ]
6041
6079
  }
6042
6080
  },
6043
- "version": "1.7.0"
6081
+ "version": "1.7.2"
6044
6082
  }