faces-cli 1.8.0 → 1.8.1

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,23 +120,10 @@
120
120
  "state.js"
121
121
  ]
122
122
  },
123
- "auth:connect": {
123
+ "billing:balance": {
124
124
  "aliases": [],
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
- ],
125
+ "args": {},
126
+ "description": "Show credit balance and payment method status",
140
127
  "flags": {
141
128
  "json": {
142
129
  "description": "Format output as json.",
@@ -172,7 +159,7 @@
172
159
  },
173
160
  "hasDynamicHelp": false,
174
161
  "hiddenAliases": [],
175
- "id": "auth:connect",
162
+ "id": "billing:balance",
176
163
  "pluginAlias": "faces-cli",
177
164
  "pluginName": "faces-cli",
178
165
  "pluginType": "core",
@@ -182,18 +169,14 @@
182
169
  "relativePath": [
183
170
  "dist",
184
171
  "commands",
185
- "auth",
186
- "connect.js"
172
+ "billing",
173
+ "balance.js"
187
174
  ]
188
175
  },
189
- "auth:connections": {
176
+ "billing:card-setup": {
190
177
  "aliases": [],
191
178
  "args": {},
192
- "description": "List connected OAuth provider accounts",
193
- "examples": [
194
- "<%= config.bin %> auth connections",
195
- "<%= config.bin %> auth connections --json"
196
- ],
179
+ "description": "Get a Stripe card setup URL to save a payment method",
197
180
  "flags": {
198
181
  "json": {
199
182
  "description": "Format output as json.",
@@ -229,7 +212,7 @@
229
212
  },
230
213
  "hasDynamicHelp": false,
231
214
  "hiddenAliases": [],
232
- "id": "auth:connections",
215
+ "id": "billing:card-setup",
233
216
  "pluginAlias": "faces-cli",
234
217
  "pluginName": "faces-cli",
235
218
  "pluginType": "core",
@@ -239,26 +222,14 @@
239
222
  "relativePath": [
240
223
  "dist",
241
224
  "commands",
242
- "auth",
243
- "connections.js"
225
+ "billing",
226
+ "card-setup.js"
244
227
  ]
245
228
  },
246
- "auth:disconnect": {
229
+ "billing:llm-costs": {
247
230
  "aliases": [],
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
- ],
231
+ "args": {},
232
+ "description": "List available LLMs and their per-token costs",
262
233
  "flags": {
263
234
  "json": {
264
235
  "description": "Format output as json.",
@@ -290,11 +261,18 @@
290
261
  "hasDynamicHelp": false,
291
262
  "multiple": false,
292
263
  "type": "option"
264
+ },
265
+ "provider": {
266
+ "description": "Filter by provider (e.g. openai, anthropic)",
267
+ "name": "provider",
268
+ "hasDynamicHelp": false,
269
+ "multiple": false,
270
+ "type": "option"
293
271
  }
294
272
  },
295
273
  "hasDynamicHelp": false,
296
274
  "hiddenAliases": [],
297
- "id": "auth:disconnect",
275
+ "id": "billing:llm-costs",
298
276
  "pluginAlias": "faces-cli",
299
277
  "pluginName": "faces-cli",
300
278
  "pluginType": "core",
@@ -304,14 +282,14 @@
304
282
  "relativePath": [
305
283
  "dist",
306
284
  "commands",
307
- "auth",
308
- "disconnect.js"
285
+ "billing",
286
+ "llm-costs.js"
309
287
  ]
310
288
  },
311
- "auth:login": {
289
+ "billing:topup": {
312
290
  "aliases": [],
313
291
  "args": {},
314
- "description": "Login and save JWT credentials",
292
+ "description": "Top up credit balance using saved payment method",
315
293
  "flags": {
316
294
  "json": {
317
295
  "description": "Format output as json.",
@@ -344,18 +322,17 @@
344
322
  "multiple": false,
345
323
  "type": "option"
346
324
  },
347
- "email": {
348
- "description": "Account email",
349
- "name": "email",
325
+ "amount": {
326
+ "description": "Top-up amount in USD (min $1)",
327
+ "name": "amount",
350
328
  "required": true,
351
329
  "hasDynamicHelp": false,
352
330
  "multiple": false,
353
331
  "type": "option"
354
332
  },
355
- "password": {
356
- "description": "Account password",
357
- "name": "password",
358
- "required": true,
333
+ "payment-ref": {
334
+ "description": "Payment reference (admin/test path)",
335
+ "name": "payment-ref",
359
336
  "hasDynamicHelp": false,
360
337
  "multiple": false,
361
338
  "type": "option"
@@ -363,7 +340,7 @@
363
340
  },
364
341
  "hasDynamicHelp": false,
365
342
  "hiddenAliases": [],
366
- "id": "auth:login",
343
+ "id": "billing:topup",
367
344
  "pluginAlias": "faces-cli",
368
345
  "pluginName": "faces-cli",
369
346
  "pluginType": "core",
@@ -373,14 +350,14 @@
373
350
  "relativePath": [
374
351
  "dist",
375
352
  "commands",
376
- "auth",
377
- "login.js"
353
+ "billing",
354
+ "topup.js"
378
355
  ]
379
356
  },
380
- "auth:logout": {
357
+ "billing:usage": {
381
358
  "aliases": [],
382
359
  "args": {},
383
- "description": "Clear saved credentials",
360
+ "description": "Aggregated usage analytics",
384
361
  "flags": {
385
362
  "json": {
386
363
  "description": "Format output as json.",
@@ -412,11 +389,38 @@
412
389
  "hasDynamicHelp": false,
413
390
  "multiple": false,
414
391
  "type": "option"
392
+ },
393
+ "group-by": {
394
+ "description": "Group results",
395
+ "name": "group-by",
396
+ "hasDynamicHelp": false,
397
+ "multiple": false,
398
+ "options": [
399
+ "api_key",
400
+ "model",
401
+ "llm",
402
+ "date"
403
+ ],
404
+ "type": "option"
405
+ },
406
+ "from": {
407
+ "description": "Start date (YYYY-MM-DD)",
408
+ "name": "from",
409
+ "hasDynamicHelp": false,
410
+ "multiple": false,
411
+ "type": "option"
412
+ },
413
+ "to": {
414
+ "description": "End date (YYYY-MM-DD)",
415
+ "name": "to",
416
+ "hasDynamicHelp": false,
417
+ "multiple": false,
418
+ "type": "option"
415
419
  }
416
420
  },
417
421
  "hasDynamicHelp": false,
418
422
  "hiddenAliases": [],
419
- "id": "auth:logout",
423
+ "id": "billing:usage",
420
424
  "pluginAlias": "faces-cli",
421
425
  "pluginName": "faces-cli",
422
426
  "pluginType": "core",
@@ -426,14 +430,27 @@
426
430
  "relativePath": [
427
431
  "dist",
428
432
  "commands",
429
- "auth",
430
- "logout.js"
433
+ "billing",
434
+ "usage.js"
431
435
  ]
432
436
  },
433
- "auth:refresh": {
437
+ "auth:connect": {
434
438
  "aliases": [],
435
- "args": {},
436
- "description": "Exchange current JWT for a fresh one",
439
+ "args": {
440
+ "provider": {
441
+ "description": "OAuth provider to connect",
442
+ "name": "provider",
443
+ "options": [
444
+ "openai"
445
+ ],
446
+ "required": true
447
+ }
448
+ },
449
+ "description": "Connect your ChatGPT account to Faces via device-code authorization (Subscription Connect plan)",
450
+ "examples": [
451
+ "<%= config.bin %> auth connect openai",
452
+ "<%= config.bin %> auth connect openai --json"
453
+ ],
437
454
  "flags": {
438
455
  "json": {
439
456
  "description": "Format output as json.",
@@ -469,7 +486,7 @@
469
486
  },
470
487
  "hasDynamicHelp": false,
471
488
  "hiddenAliases": [],
472
- "id": "auth:refresh",
489
+ "id": "auth:connect",
473
490
  "pluginAlias": "faces-cli",
474
491
  "pluginName": "faces-cli",
475
492
  "pluginType": "core",
@@ -480,13 +497,17 @@
480
497
  "dist",
481
498
  "commands",
482
499
  "auth",
483
- "refresh.js"
500
+ "connect.js"
484
501
  ]
485
502
  },
486
- "auth:register": {
503
+ "auth:connections": {
487
504
  "aliases": [],
488
505
  "args": {},
489
- "description": "Create a new Faces account",
506
+ "description": "List connected OAuth provider accounts",
507
+ "examples": [
508
+ "<%= config.bin %> auth connections",
509
+ "<%= config.bin %> auth connections --json"
510
+ ],
490
511
  "flags": {
491
512
  "json": {
492
513
  "description": "Format output as json.",
@@ -518,54 +539,11 @@
518
539
  "hasDynamicHelp": false,
519
540
  "multiple": false,
520
541
  "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"
564
542
  }
565
543
  },
566
544
  "hasDynamicHelp": false,
567
545
  "hiddenAliases": [],
568
- "id": "auth:register",
546
+ "id": "auth:connections",
569
547
  "pluginAlias": "faces-cli",
570
548
  "pluginName": "faces-cli",
571
549
  "pluginType": "core",
@@ -576,13 +554,25 @@
576
554
  "dist",
577
555
  "commands",
578
556
  "auth",
579
- "register.js"
557
+ "connections.js"
580
558
  ]
581
559
  },
582
- "auth:whoami": {
560
+ "auth:disconnect": {
583
561
  "aliases": [],
584
- "args": {},
585
- "description": "Print current user profile and auth diagnostic",
562
+ "args": {
563
+ "provider": {
564
+ "description": "OAuth provider to disconnect",
565
+ "name": "provider",
566
+ "options": [
567
+ "openai"
568
+ ],
569
+ "required": true
570
+ }
571
+ },
572
+ "description": "Disconnect a linked OAuth provider account",
573
+ "examples": [
574
+ "<%= config.bin %> auth disconnect openai"
575
+ ],
586
576
  "flags": {
587
577
  "json": {
588
578
  "description": "Format output as json.",
@@ -618,7 +608,7 @@
618
608
  },
619
609
  "hasDynamicHelp": false,
620
610
  "hiddenAliases": [],
621
- "id": "auth:whoami",
611
+ "id": "auth:disconnect",
622
612
  "pluginAlias": "faces-cli",
623
613
  "pluginName": "faces-cli",
624
614
  "pluginType": "core",
@@ -629,13 +619,13 @@
629
619
  "dist",
630
620
  "commands",
631
621
  "auth",
632
- "whoami.js"
622
+ "disconnect.js"
633
623
  ]
634
624
  },
635
- "billing:balance": {
625
+ "auth:login": {
636
626
  "aliases": [],
637
627
  "args": {},
638
- "description": "Show credit balance and payment method status",
628
+ "description": "Login and save JWT credentials",
639
629
  "flags": {
640
630
  "json": {
641
631
  "description": "Format output as json.",
@@ -667,11 +657,27 @@
667
657
  "hasDynamicHelp": false,
668
658
  "multiple": false,
669
659
  "type": "option"
660
+ },
661
+ "email": {
662
+ "description": "Account email",
663
+ "name": "email",
664
+ "required": true,
665
+ "hasDynamicHelp": false,
666
+ "multiple": false,
667
+ "type": "option"
668
+ },
669
+ "password": {
670
+ "description": "Account password",
671
+ "name": "password",
672
+ "required": true,
673
+ "hasDynamicHelp": false,
674
+ "multiple": false,
675
+ "type": "option"
670
676
  }
671
677
  },
672
678
  "hasDynamicHelp": false,
673
679
  "hiddenAliases": [],
674
- "id": "billing:balance",
680
+ "id": "auth:login",
675
681
  "pluginAlias": "faces-cli",
676
682
  "pluginName": "faces-cli",
677
683
  "pluginType": "core",
@@ -681,14 +687,14 @@
681
687
  "relativePath": [
682
688
  "dist",
683
689
  "commands",
684
- "billing",
685
- "balance.js"
690
+ "auth",
691
+ "login.js"
686
692
  ]
687
693
  },
688
- "billing:card-setup": {
694
+ "auth:logout": {
689
695
  "aliases": [],
690
696
  "args": {},
691
- "description": "Get a Stripe card setup URL to save a payment method",
697
+ "description": "Clear saved credentials",
692
698
  "flags": {
693
699
  "json": {
694
700
  "description": "Format output as json.",
@@ -724,7 +730,7 @@
724
730
  },
725
731
  "hasDynamicHelp": false,
726
732
  "hiddenAliases": [],
727
- "id": "billing:card-setup",
733
+ "id": "auth:logout",
728
734
  "pluginAlias": "faces-cli",
729
735
  "pluginName": "faces-cli",
730
736
  "pluginType": "core",
@@ -734,14 +740,14 @@
734
740
  "relativePath": [
735
741
  "dist",
736
742
  "commands",
737
- "billing",
738
- "card-setup.js"
743
+ "auth",
744
+ "logout.js"
739
745
  ]
740
746
  },
741
- "billing:llm-costs": {
747
+ "auth:refresh": {
742
748
  "aliases": [],
743
749
  "args": {},
744
- "description": "List available LLMs and their per-token costs",
750
+ "description": "Exchange current JWT for a fresh one",
745
751
  "flags": {
746
752
  "json": {
747
753
  "description": "Format output as json.",
@@ -773,18 +779,11 @@
773
779
  "hasDynamicHelp": false,
774
780
  "multiple": false,
775
781
  "type": "option"
776
- },
777
- "provider": {
778
- "description": "Filter by provider (e.g. openai, anthropic)",
779
- "name": "provider",
780
- "hasDynamicHelp": false,
781
- "multiple": false,
782
- "type": "option"
783
782
  }
784
783
  },
785
784
  "hasDynamicHelp": false,
786
785
  "hiddenAliases": [],
787
- "id": "billing:llm-costs",
786
+ "id": "auth:refresh",
788
787
  "pluginAlias": "faces-cli",
789
788
  "pluginName": "faces-cli",
790
789
  "pluginType": "core",
@@ -794,14 +793,14 @@
794
793
  "relativePath": [
795
794
  "dist",
796
795
  "commands",
797
- "billing",
798
- "llm-costs.js"
796
+ "auth",
797
+ "refresh.js"
799
798
  ]
800
799
  },
801
- "billing:topup": {
800
+ "auth:register": {
802
801
  "aliases": [],
803
802
  "args": {},
804
- "description": "Top up credit balance using saved payment method",
803
+ "description": "Create a new Faces account",
805
804
  "flags": {
806
805
  "json": {
807
806
  "description": "Format output as json.",
@@ -834,25 +833,53 @@
834
833
  "multiple": false,
835
834
  "type": "option"
836
835
  },
837
- "amount": {
838
- "description": "Top-up amount in USD (min $1)",
839
- "name": "amount",
836
+ "email": {
837
+ "description": "Email address",
838
+ "name": "email",
840
839
  "required": true,
841
840
  "hasDynamicHelp": false,
842
841
  "multiple": false,
843
842
  "type": "option"
844
843
  },
845
- "payment-ref": {
846
- "description": "Payment reference (admin/test path)",
847
- "name": "payment-ref",
844
+ "password": {
845
+ "description": "Password",
846
+ "name": "password",
847
+ "required": true,
848
+ "hasDynamicHelp": false,
849
+ "multiple": false,
850
+ "type": "option"
851
+ },
852
+ "username": {
853
+ "description": "Username (lowercase, dashes, numbers)",
854
+ "name": "username",
855
+ "required": true,
856
+ "hasDynamicHelp": false,
857
+ "multiple": false,
858
+ "type": "option"
859
+ },
860
+ "invite-key": {
861
+ "description": "Invite key (if required)",
862
+ "name": "invite-key",
863
+ "hasDynamicHelp": false,
864
+ "multiple": false,
865
+ "type": "option"
866
+ },
867
+ "plan": {
868
+ "description": "Plan to subscribe to: \"free\" ($5 activation) or \"connect\" ($17/mo, no activation fee)",
869
+ "name": "plan",
870
+ "default": "free",
848
871
  "hasDynamicHelp": false,
849
872
  "multiple": false,
873
+ "options": [
874
+ "free",
875
+ "connect"
876
+ ],
850
877
  "type": "option"
851
878
  }
852
879
  },
853
880
  "hasDynamicHelp": false,
854
881
  "hiddenAliases": [],
855
- "id": "billing:topup",
882
+ "id": "auth:register",
856
883
  "pluginAlias": "faces-cli",
857
884
  "pluginName": "faces-cli",
858
885
  "pluginType": "core",
@@ -862,14 +889,14 @@
862
889
  "relativePath": [
863
890
  "dist",
864
891
  "commands",
865
- "billing",
866
- "topup.js"
892
+ "auth",
893
+ "register.js"
867
894
  ]
868
895
  },
869
- "billing:usage": {
896
+ "auth:whoami": {
870
897
  "aliases": [],
871
898
  "args": {},
872
- "description": "Aggregated usage analytics",
899
+ "description": "Print current user profile and auth diagnostic",
873
900
  "flags": {
874
901
  "json": {
875
902
  "description": "Format output as json.",
@@ -901,38 +928,11 @@
901
928
  "hasDynamicHelp": false,
902
929
  "multiple": false,
903
930
  "type": "option"
904
- },
905
- "group-by": {
906
- "description": "Group results",
907
- "name": "group-by",
908
- "hasDynamicHelp": false,
909
- "multiple": false,
910
- "options": [
911
- "api_key",
912
- "model",
913
- "llm",
914
- "date"
915
- ],
916
- "type": "option"
917
- },
918
- "from": {
919
- "description": "Start date (YYYY-MM-DD)",
920
- "name": "from",
921
- "hasDynamicHelp": false,
922
- "multiple": false,
923
- "type": "option"
924
- },
925
- "to": {
926
- "description": "End date (YYYY-MM-DD)",
927
- "name": "to",
928
- "hasDynamicHelp": false,
929
- "multiple": false,
930
- "type": "option"
931
931
  }
932
932
  },
933
933
  "hasDynamicHelp": false,
934
934
  "hiddenAliases": [],
935
- "id": "billing:usage",
935
+ "id": "auth:whoami",
936
936
  "pluginAlias": "faces-cli",
937
937
  "pluginName": "faces-cli",
938
938
  "pluginType": "core",
@@ -942,8 +942,8 @@
942
942
  "relativePath": [
943
943
  "dist",
944
944
  "commands",
945
- "billing",
946
- "usage.js"
945
+ "auth",
946
+ "whoami.js"
947
947
  ]
948
948
  },
949
949
  "catalog:backup": {
@@ -1750,10 +1750,10 @@
1750
1750
  "thread.js"
1751
1751
  ]
1752
1752
  },
1753
- "compile:all": {
1753
+ "config:clear": {
1754
1754
  "aliases": [],
1755
1755
  "args": {},
1756
- "description": "Compile all uncompiled documents and threads across all faces",
1756
+ "description": "Delete all saved credentials and config",
1757
1757
  "flags": {
1758
1758
  "json": {
1759
1759
  "description": "Format output as json.",
@@ -1786,18 +1786,16 @@
1786
1786
  "multiple": false,
1787
1787
  "type": "option"
1788
1788
  },
1789
- "timeout": {
1790
- "description": "Per-item compile timeout in seconds (default: 600)",
1791
- "name": "timeout",
1792
- "default": 600,
1793
- "hasDynamicHelp": false,
1794
- "multiple": false,
1795
- "type": "option"
1789
+ "yes": {
1790
+ "description": "Skip confirmation",
1791
+ "name": "yes",
1792
+ "allowNo": false,
1793
+ "type": "boolean"
1796
1794
  }
1797
1795
  },
1798
1796
  "hasDynamicHelp": false,
1799
1797
  "hiddenAliases": [],
1800
- "id": "compile:all",
1798
+ "id": "config:clear",
1801
1799
  "pluginAlias": "faces-cli",
1802
1800
  "pluginName": "faces-cli",
1803
1801
  "pluginType": "core",
@@ -1807,20 +1805,25 @@
1807
1805
  "relativePath": [
1808
1806
  "dist",
1809
1807
  "commands",
1810
- "compile",
1811
- "all.js"
1808
+ "config",
1809
+ "clear.js"
1812
1810
  ]
1813
1811
  },
1814
- "compile:import": {
1812
+ "config:set": {
1815
1813
  "aliases": [],
1816
1814
  "args": {
1817
- "face_id": {
1818
- "description": "Face alias",
1819
- "name": "face_id",
1815
+ "key": {
1816
+ "description": "Config key",
1817
+ "name": "key",
1818
+ "required": true
1819
+ },
1820
+ "value": {
1821
+ "description": "Config value",
1822
+ "name": "value",
1820
1823
  "required": true
1821
1824
  }
1822
1825
  },
1823
- "description": "Import a YouTube video into a face via server-side download and transcription",
1826
+ "description": "Set a config value (e.g. base_url, api_key, token)",
1824
1827
  "flags": {
1825
1828
  "json": {
1826
1829
  "description": "Format output as json.",
@@ -1852,56 +1855,64 @@
1852
1855
  "hasDynamicHelp": false,
1853
1856
  "multiple": false,
1854
1857
  "type": "option"
1858
+ }
1859
+ },
1860
+ "hasDynamicHelp": false,
1861
+ "hiddenAliases": [],
1862
+ "id": "config:set",
1863
+ "pluginAlias": "faces-cli",
1864
+ "pluginName": "faces-cli",
1865
+ "pluginType": "core",
1866
+ "strict": true,
1867
+ "enableJsonFlag": true,
1868
+ "isESM": true,
1869
+ "relativePath": [
1870
+ "dist",
1871
+ "commands",
1872
+ "config",
1873
+ "set.js"
1874
+ ]
1875
+ },
1876
+ "config:show": {
1877
+ "aliases": [],
1878
+ "args": {},
1879
+ "description": "Print current config (credentials are masked)",
1880
+ "flags": {
1881
+ "json": {
1882
+ "description": "Format output as json.",
1883
+ "helpGroup": "GLOBAL",
1884
+ "name": "json",
1885
+ "allowNo": false,
1886
+ "type": "boolean"
1855
1887
  },
1856
- "url": {
1857
- "description": "YouTube URL (youtube.com/watch?v=... or youtu.be/...)",
1858
- "name": "url",
1859
- "required": true,
1860
- "hasDynamicHelp": false,
1861
- "multiple": false,
1862
- "type": "option"
1863
- },
1864
- "type": {
1865
- "description": "\"document\" for solo talks, lectures, monologues; \"thread\" for interviews or multi-speaker conversations",
1866
- "name": "type",
1867
- "default": "document",
1888
+ "base-url": {
1889
+ "description": "API base URL",
1890
+ "env": "FACES_BASE_URL",
1891
+ "name": "base-url",
1868
1892
  "hasDynamicHelp": false,
1869
1893
  "multiple": false,
1870
- "options": [
1871
- "document",
1872
- "thread"
1873
- ],
1874
1894
  "type": "option"
1875
1895
  },
1876
- "perspective": {
1877
- "description": "\"first-person\" if the face is the speaker; \"third-person\" if the video is about the face",
1878
- "name": "perspective",
1879
- "default": "third-person",
1896
+ "token": {
1897
+ "description": "JWT bearer token",
1898
+ "env": "FACES_TOKEN",
1899
+ "name": "token",
1880
1900
  "hasDynamicHelp": false,
1881
1901
  "multiple": false,
1882
- "options": [
1883
- "first-person",
1884
- "third-person"
1885
- ],
1886
1902
  "type": "option"
1887
1903
  },
1888
- "face-speaker": {
1889
- "description": "For --type thread: AssemblyAI speaker label (e.g. \"A\") that corresponds to the face. Defaults to first detected speaker.",
1890
- "name": "face-speaker",
1904
+ "api-key": {
1905
+ "description": "API key",
1906
+ "env": "FACES_API_KEY",
1907
+ "name": "api-key",
1891
1908
  "hasDynamicHelp": false,
1892
1909
  "multiple": false,
1893
1910
  "type": "option"
1894
- },
1895
- "no-wait": {
1896
- "description": "Return immediately after import starts (do not poll for transcription). Prints the ID for manual polling.",
1897
- "name": "no-wait",
1898
- "allowNo": false,
1899
- "type": "boolean"
1900
1911
  }
1901
1912
  },
1902
1913
  "hasDynamicHelp": false,
1903
1914
  "hiddenAliases": [],
1904
- "id": "compile:import",
1915
+ "id": "config:show",
1905
1916
  "pluginAlias": "faces-cli",
1906
1917
  "pluginName": "faces-cli",
1907
1918
  "pluginType": "core",
@@ -1911,14 +1922,14 @@
1911
1922
  "relativePath": [
1912
1923
  "dist",
1913
1924
  "commands",
1914
- "compile",
1915
- "import.js"
1925
+ "config",
1926
+ "show.js"
1916
1927
  ]
1917
1928
  },
1918
- "compile:stats": {
1929
+ "face:attributes": {
1919
1930
  "aliases": [],
1920
1931
  "args": {},
1921
- "description": "Show compilation stats per face",
1932
+ "description": "List all supported attribute keys",
1922
1933
  "flags": {
1923
1934
  "json": {
1924
1935
  "description": "Format output as json.",
@@ -1954,7 +1965,7 @@
1954
1965
  },
1955
1966
  "hasDynamicHelp": false,
1956
1967
  "hiddenAliases": [],
1957
- "id": "compile:stats",
1968
+ "id": "face:attributes",
1958
1969
  "pluginAlias": "faces-cli",
1959
1970
  "pluginName": "faces-cli",
1960
1971
  "pluginType": "core",
@@ -1964,354 +1975,14 @@
1964
1975
  "relativePath": [
1965
1976
  "dist",
1966
1977
  "commands",
1967
- "compile",
1968
- "stats.js"
1978
+ "face",
1979
+ "attributes.js"
1969
1980
  ]
1970
1981
  },
1971
- "compile:upload": {
1982
+ "face:create": {
1972
1983
  "aliases": [],
1973
- "args": {
1974
- "alias": {
1975
- "description": "Face alias",
1976
- "name": "alias",
1977
- "required": true
1978
- }
1979
- },
1980
- "description": "Upload a file (text/PDF/Word .docx/audio/video) to compile into a face",
1981
- "flags": {
1982
- "json": {
1983
- "description": "Format output as json.",
1984
- "helpGroup": "GLOBAL",
1985
- "name": "json",
1986
- "allowNo": false,
1987
- "type": "boolean"
1988
- },
1989
- "base-url": {
1990
- "description": "API base URL",
1991
- "env": "FACES_BASE_URL",
1992
- "name": "base-url",
1993
- "hasDynamicHelp": false,
1994
- "multiple": false,
1995
- "type": "option"
1996
- },
1997
- "token": {
1998
- "description": "JWT bearer token",
1999
- "env": "FACES_TOKEN",
2000
- "name": "token",
2001
- "hasDynamicHelp": false,
2002
- "multiple": false,
2003
- "type": "option"
2004
- },
2005
- "api-key": {
2006
- "description": "API key",
2007
- "env": "FACES_API_KEY",
2008
- "name": "api-key",
2009
- "hasDynamicHelp": false,
2010
- "multiple": false,
2011
- "type": "option"
2012
- },
2013
- "file": {
2014
- "description": "File to upload",
2015
- "name": "file",
2016
- "required": true,
2017
- "hasDynamicHelp": false,
2018
- "multiple": false,
2019
- "type": "option"
2020
- },
2021
- "kind": {
2022
- "description": "Upload kind: document or thread",
2023
- "name": "kind",
2024
- "default": "document",
2025
- "hasDynamicHelp": false,
2026
- "multiple": false,
2027
- "options": [
2028
- "document",
2029
- "thread"
2030
- ],
2031
- "type": "option"
2032
- },
2033
- "perspective": {
2034
- "description": "Perspective (document only)",
2035
- "name": "perspective",
2036
- "default": "third-person",
2037
- "hasDynamicHelp": false,
2038
- "multiple": false,
2039
- "options": [
2040
- "first-person",
2041
- "third-person"
2042
- ],
2043
- "type": "option"
2044
- },
2045
- "medium": {
2046
- "description": "What sort of writing this is — e.g. email, text message, social post, essay, academic paper, blog post, legal document, thread reply, conversation (covers speech: transcripts, interviews, calls). Common synonyms fold automatically. Omit it if you do not know: a wrong declaration is worse than none, because a declaration is trusted and an absence is not. Only valid with --kind document.",
2047
- "name": "medium",
2048
- "hasDynamicHelp": false,
2049
- "multiple": false,
2050
- "type": "option"
2051
- },
2052
- "face-speaker": {
2053
- "description": "Speaker name to map to the face (thread only). If omitted, auto-detected from face name.",
2054
- "name": "face-speaker",
2055
- "hasDynamicHelp": false,
2056
- "multiple": false,
2057
- "type": "option"
2058
- },
2059
- "no-wait": {
2060
- "description": "Return immediately after upload (do not poll for transcription). Prints the ID for manual polling.",
2061
- "name": "no-wait",
2062
- "allowNo": false,
2063
- "type": "boolean"
2064
- }
2065
- },
2066
- "hasDynamicHelp": false,
2067
- "hiddenAliases": [],
2068
- "id": "compile:upload",
2069
- "pluginAlias": "faces-cli",
2070
- "pluginName": "faces-cli",
2071
- "pluginType": "core",
2072
- "strict": true,
2073
- "enableJsonFlag": true,
2074
- "isESM": true,
2075
- "relativePath": [
2076
- "dist",
2077
- "commands",
2078
- "compile",
2079
- "upload.js"
2080
- ]
2081
- },
2082
- "config:clear": {
2083
- "aliases": [],
2084
- "args": {},
2085
- "description": "Delete all saved credentials and config",
2086
- "flags": {
2087
- "json": {
2088
- "description": "Format output as json.",
2089
- "helpGroup": "GLOBAL",
2090
- "name": "json",
2091
- "allowNo": false,
2092
- "type": "boolean"
2093
- },
2094
- "base-url": {
2095
- "description": "API base URL",
2096
- "env": "FACES_BASE_URL",
2097
- "name": "base-url",
2098
- "hasDynamicHelp": false,
2099
- "multiple": false,
2100
- "type": "option"
2101
- },
2102
- "token": {
2103
- "description": "JWT bearer token",
2104
- "env": "FACES_TOKEN",
2105
- "name": "token",
2106
- "hasDynamicHelp": false,
2107
- "multiple": false,
2108
- "type": "option"
2109
- },
2110
- "api-key": {
2111
- "description": "API key",
2112
- "env": "FACES_API_KEY",
2113
- "name": "api-key",
2114
- "hasDynamicHelp": false,
2115
- "multiple": false,
2116
- "type": "option"
2117
- },
2118
- "yes": {
2119
- "description": "Skip confirmation",
2120
- "name": "yes",
2121
- "allowNo": false,
2122
- "type": "boolean"
2123
- }
2124
- },
2125
- "hasDynamicHelp": false,
2126
- "hiddenAliases": [],
2127
- "id": "config:clear",
2128
- "pluginAlias": "faces-cli",
2129
- "pluginName": "faces-cli",
2130
- "pluginType": "core",
2131
- "strict": true,
2132
- "enableJsonFlag": true,
2133
- "isESM": true,
2134
- "relativePath": [
2135
- "dist",
2136
- "commands",
2137
- "config",
2138
- "clear.js"
2139
- ]
2140
- },
2141
- "config:set": {
2142
- "aliases": [],
2143
- "args": {
2144
- "key": {
2145
- "description": "Config key",
2146
- "name": "key",
2147
- "required": true
2148
- },
2149
- "value": {
2150
- "description": "Config value",
2151
- "name": "value",
2152
- "required": true
2153
- }
2154
- },
2155
- "description": "Set a config value (e.g. base_url, api_key, token)",
2156
- "flags": {
2157
- "json": {
2158
- "description": "Format output as json.",
2159
- "helpGroup": "GLOBAL",
2160
- "name": "json",
2161
- "allowNo": false,
2162
- "type": "boolean"
2163
- },
2164
- "base-url": {
2165
- "description": "API base URL",
2166
- "env": "FACES_BASE_URL",
2167
- "name": "base-url",
2168
- "hasDynamicHelp": false,
2169
- "multiple": false,
2170
- "type": "option"
2171
- },
2172
- "token": {
2173
- "description": "JWT bearer token",
2174
- "env": "FACES_TOKEN",
2175
- "name": "token",
2176
- "hasDynamicHelp": false,
2177
- "multiple": false,
2178
- "type": "option"
2179
- },
2180
- "api-key": {
2181
- "description": "API key",
2182
- "env": "FACES_API_KEY",
2183
- "name": "api-key",
2184
- "hasDynamicHelp": false,
2185
- "multiple": false,
2186
- "type": "option"
2187
- }
2188
- },
2189
- "hasDynamicHelp": false,
2190
- "hiddenAliases": [],
2191
- "id": "config:set",
2192
- "pluginAlias": "faces-cli",
2193
- "pluginName": "faces-cli",
2194
- "pluginType": "core",
2195
- "strict": true,
2196
- "enableJsonFlag": true,
2197
- "isESM": true,
2198
- "relativePath": [
2199
- "dist",
2200
- "commands",
2201
- "config",
2202
- "set.js"
2203
- ]
2204
- },
2205
- "config:show": {
2206
- "aliases": [],
2207
- "args": {},
2208
- "description": "Print current config (credentials are masked)",
2209
- "flags": {
2210
- "json": {
2211
- "description": "Format output as json.",
2212
- "helpGroup": "GLOBAL",
2213
- "name": "json",
2214
- "allowNo": false,
2215
- "type": "boolean"
2216
- },
2217
- "base-url": {
2218
- "description": "API base URL",
2219
- "env": "FACES_BASE_URL",
2220
- "name": "base-url",
2221
- "hasDynamicHelp": false,
2222
- "multiple": false,
2223
- "type": "option"
2224
- },
2225
- "token": {
2226
- "description": "JWT bearer token",
2227
- "env": "FACES_TOKEN",
2228
- "name": "token",
2229
- "hasDynamicHelp": false,
2230
- "multiple": false,
2231
- "type": "option"
2232
- },
2233
- "api-key": {
2234
- "description": "API key",
2235
- "env": "FACES_API_KEY",
2236
- "name": "api-key",
2237
- "hasDynamicHelp": false,
2238
- "multiple": false,
2239
- "type": "option"
2240
- }
2241
- },
2242
- "hasDynamicHelp": false,
2243
- "hiddenAliases": [],
2244
- "id": "config:show",
2245
- "pluginAlias": "faces-cli",
2246
- "pluginName": "faces-cli",
2247
- "pluginType": "core",
2248
- "strict": true,
2249
- "enableJsonFlag": true,
2250
- "isESM": true,
2251
- "relativePath": [
2252
- "dist",
2253
- "commands",
2254
- "config",
2255
- "show.js"
2256
- ]
2257
- },
2258
- "face:attributes": {
2259
- "aliases": [],
2260
- "args": {},
2261
- "description": "List all supported attribute keys",
2262
- "flags": {
2263
- "json": {
2264
- "description": "Format output as json.",
2265
- "helpGroup": "GLOBAL",
2266
- "name": "json",
2267
- "allowNo": false,
2268
- "type": "boolean"
2269
- },
2270
- "base-url": {
2271
- "description": "API base URL",
2272
- "env": "FACES_BASE_URL",
2273
- "name": "base-url",
2274
- "hasDynamicHelp": false,
2275
- "multiple": false,
2276
- "type": "option"
2277
- },
2278
- "token": {
2279
- "description": "JWT bearer token",
2280
- "env": "FACES_TOKEN",
2281
- "name": "token",
2282
- "hasDynamicHelp": false,
2283
- "multiple": false,
2284
- "type": "option"
2285
- },
2286
- "api-key": {
2287
- "description": "API key",
2288
- "env": "FACES_API_KEY",
2289
- "name": "api-key",
2290
- "hasDynamicHelp": false,
2291
- "multiple": false,
2292
- "type": "option"
2293
- }
2294
- },
2295
- "hasDynamicHelp": false,
2296
- "hiddenAliases": [],
2297
- "id": "face:attributes",
2298
- "pluginAlias": "faces-cli",
2299
- "pluginName": "faces-cli",
2300
- "pluginType": "core",
2301
- "strict": true,
2302
- "enableJsonFlag": true,
2303
- "isESM": true,
2304
- "relativePath": [
2305
- "dist",
2306
- "commands",
2307
- "face",
2308
- "attributes.js"
2309
- ]
2310
- },
2311
- "face:create": {
2312
- "aliases": [],
2313
- "args": {},
2314
- "description": "Create a new face",
1984
+ "args": {},
1985
+ "description": "Create a new face",
2315
1986
  "flags": {
2316
1987
  "json": {
2317
1988
  "description": "Format output as json.",
@@ -3273,13 +2944,264 @@
3273
2944
  "dist",
3274
2945
  "commands",
3275
2946
  "face",
3276
- "sources.js"
2947
+ "sources.js"
2948
+ ]
2949
+ },
2950
+ "face:stats": {
2951
+ "aliases": [],
2952
+ "args": {},
2953
+ "description": "Compile and chat stats for all owned faces",
2954
+ "flags": {
2955
+ "json": {
2956
+ "description": "Format output as json.",
2957
+ "helpGroup": "GLOBAL",
2958
+ "name": "json",
2959
+ "allowNo": false,
2960
+ "type": "boolean"
2961
+ },
2962
+ "base-url": {
2963
+ "description": "API base URL",
2964
+ "env": "FACES_BASE_URL",
2965
+ "name": "base-url",
2966
+ "hasDynamicHelp": false,
2967
+ "multiple": false,
2968
+ "type": "option"
2969
+ },
2970
+ "token": {
2971
+ "description": "JWT bearer token",
2972
+ "env": "FACES_TOKEN",
2973
+ "name": "token",
2974
+ "hasDynamicHelp": false,
2975
+ "multiple": false,
2976
+ "type": "option"
2977
+ },
2978
+ "api-key": {
2979
+ "description": "API key",
2980
+ "env": "FACES_API_KEY",
2981
+ "name": "api-key",
2982
+ "hasDynamicHelp": false,
2983
+ "multiple": false,
2984
+ "type": "option"
2985
+ }
2986
+ },
2987
+ "hasDynamicHelp": false,
2988
+ "hiddenAliases": [],
2989
+ "id": "face:stats",
2990
+ "pluginAlias": "faces-cli",
2991
+ "pluginName": "faces-cli",
2992
+ "pluginType": "core",
2993
+ "strict": true,
2994
+ "enableJsonFlag": true,
2995
+ "isESM": true,
2996
+ "relativePath": [
2997
+ "dist",
2998
+ "commands",
2999
+ "face",
3000
+ "stats.js"
3001
+ ]
3002
+ },
3003
+ "face:teams": {
3004
+ "aliases": [],
3005
+ "args": {
3006
+ "alias": {
3007
+ "description": "Face alias",
3008
+ "name": "alias",
3009
+ "required": true
3010
+ }
3011
+ },
3012
+ "description": "Set a face's team memberships (replaces all)",
3013
+ "flags": {
3014
+ "json": {
3015
+ "description": "Format output as json.",
3016
+ "helpGroup": "GLOBAL",
3017
+ "name": "json",
3018
+ "allowNo": false,
3019
+ "type": "boolean"
3020
+ },
3021
+ "base-url": {
3022
+ "description": "API base URL",
3023
+ "env": "FACES_BASE_URL",
3024
+ "name": "base-url",
3025
+ "hasDynamicHelp": false,
3026
+ "multiple": false,
3027
+ "type": "option"
3028
+ },
3029
+ "token": {
3030
+ "description": "JWT bearer token",
3031
+ "env": "FACES_TOKEN",
3032
+ "name": "token",
3033
+ "hasDynamicHelp": false,
3034
+ "multiple": false,
3035
+ "type": "option"
3036
+ },
3037
+ "api-key": {
3038
+ "description": "API key",
3039
+ "env": "FACES_API_KEY",
3040
+ "name": "api-key",
3041
+ "hasDynamicHelp": false,
3042
+ "multiple": false,
3043
+ "type": "option"
3044
+ },
3045
+ "team": {
3046
+ "description": "Team ID (repeatable, replaces all memberships)",
3047
+ "name": "team",
3048
+ "required": true,
3049
+ "hasDynamicHelp": false,
3050
+ "multiple": true,
3051
+ "type": "option"
3052
+ }
3053
+ },
3054
+ "hasDynamicHelp": false,
3055
+ "hiddenAliases": [],
3056
+ "id": "face:teams",
3057
+ "pluginAlias": "faces-cli",
3058
+ "pluginName": "faces-cli",
3059
+ "pluginType": "core",
3060
+ "strict": true,
3061
+ "enableJsonFlag": true,
3062
+ "isESM": true,
3063
+ "relativePath": [
3064
+ "dist",
3065
+ "commands",
3066
+ "face",
3067
+ "teams.js"
3068
+ ]
3069
+ },
3070
+ "face:unlock": {
3071
+ "aliases": [],
3072
+ "args": {
3073
+ "face_id": {
3074
+ "description": "Face alias",
3075
+ "name": "face_id",
3076
+ "required": true
3077
+ }
3078
+ },
3079
+ "description": "Unlock a face (make it writable again). Thaws the face and everything it owns (documents, threads, voiceprint).",
3080
+ "examples": [
3081
+ "<%= config.bin %> <%= command.id %> socrates"
3082
+ ],
3083
+ "flags": {
3084
+ "json": {
3085
+ "description": "Format output as json.",
3086
+ "helpGroup": "GLOBAL",
3087
+ "name": "json",
3088
+ "allowNo": false,
3089
+ "type": "boolean"
3090
+ },
3091
+ "base-url": {
3092
+ "description": "API base URL",
3093
+ "env": "FACES_BASE_URL",
3094
+ "name": "base-url",
3095
+ "hasDynamicHelp": false,
3096
+ "multiple": false,
3097
+ "type": "option"
3098
+ },
3099
+ "token": {
3100
+ "description": "JWT bearer token",
3101
+ "env": "FACES_TOKEN",
3102
+ "name": "token",
3103
+ "hasDynamicHelp": false,
3104
+ "multiple": false,
3105
+ "type": "option"
3106
+ },
3107
+ "api-key": {
3108
+ "description": "API key",
3109
+ "env": "FACES_API_KEY",
3110
+ "name": "api-key",
3111
+ "hasDynamicHelp": false,
3112
+ "multiple": false,
3113
+ "type": "option"
3114
+ }
3115
+ },
3116
+ "hasDynamicHelp": false,
3117
+ "hiddenAliases": [],
3118
+ "id": "face:unlock",
3119
+ "pluginAlias": "faces-cli",
3120
+ "pluginName": "faces-cli",
3121
+ "pluginType": "core",
3122
+ "strict": true,
3123
+ "enableJsonFlag": true,
3124
+ "isESM": true,
3125
+ "relativePath": [
3126
+ "dist",
3127
+ "commands",
3128
+ "face",
3129
+ "unlock.js"
3130
+ ]
3131
+ },
3132
+ "face:unpublish": {
3133
+ "aliases": [],
3134
+ "args": {
3135
+ "alias": {
3136
+ "description": "Face alias",
3137
+ "name": "alias",
3138
+ "required": true
3139
+ }
3140
+ },
3141
+ "description": "Stop publishing a face. Anyone it is individually shared with keeps their access — publishing is an override on top of sharing, not a replacement for it.",
3142
+ "flags": {
3143
+ "json": {
3144
+ "description": "Format output as json.",
3145
+ "helpGroup": "GLOBAL",
3146
+ "name": "json",
3147
+ "allowNo": false,
3148
+ "type": "boolean"
3149
+ },
3150
+ "base-url": {
3151
+ "description": "API base URL",
3152
+ "env": "FACES_BASE_URL",
3153
+ "name": "base-url",
3154
+ "hasDynamicHelp": false,
3155
+ "multiple": false,
3156
+ "type": "option"
3157
+ },
3158
+ "token": {
3159
+ "description": "JWT bearer token",
3160
+ "env": "FACES_TOKEN",
3161
+ "name": "token",
3162
+ "hasDynamicHelp": false,
3163
+ "multiple": false,
3164
+ "type": "option"
3165
+ },
3166
+ "api-key": {
3167
+ "description": "API key",
3168
+ "env": "FACES_API_KEY",
3169
+ "name": "api-key",
3170
+ "hasDynamicHelp": false,
3171
+ "multiple": false,
3172
+ "type": "option"
3173
+ }
3174
+ },
3175
+ "hasDynamicHelp": false,
3176
+ "hiddenAliases": [],
3177
+ "id": "face:unpublish",
3178
+ "pluginAlias": "faces-cli",
3179
+ "pluginName": "faces-cli",
3180
+ "pluginType": "core",
3181
+ "strict": true,
3182
+ "enableJsonFlag": true,
3183
+ "isESM": true,
3184
+ "relativePath": [
3185
+ "dist",
3186
+ "commands",
3187
+ "face",
3188
+ "unpublish.js"
3277
3189
  ]
3278
3190
  },
3279
- "face:stats": {
3191
+ "face:unshare": {
3280
3192
  "aliases": [],
3281
- "args": {},
3282
- "description": "Compile and chat stats for all owned faces",
3193
+ "args": {
3194
+ "alias": {
3195
+ "description": "Face alias",
3196
+ "name": "alias",
3197
+ "required": true
3198
+ }
3199
+ },
3200
+ "description": "Revoke access to a shared face. Takes effect immediately — there is no grace period.",
3201
+ "examples": [
3202
+ "<%= config.bin %> <%= command.id %> alice --from dana --yes",
3203
+ "<%= config.bin %> <%= command.id %> alice --all --yes"
3204
+ ],
3283
3205
  "flags": {
3284
3206
  "json": {
3285
3207
  "description": "Format output as json.",
@@ -3311,11 +3233,36 @@
3311
3233
  "hasDynamicHelp": false,
3312
3234
  "multiple": false,
3313
3235
  "type": "option"
3236
+ },
3237
+ "from": {
3238
+ "description": "Account to revoke (repeatable)",
3239
+ "exclusive": [
3240
+ "all"
3241
+ ],
3242
+ "name": "from",
3243
+ "hasDynamicHelp": false,
3244
+ "multiple": true,
3245
+ "type": "option"
3246
+ },
3247
+ "all": {
3248
+ "description": "Revoke everyone",
3249
+ "exclusive": [
3250
+ "from"
3251
+ ],
3252
+ "name": "all",
3253
+ "allowNo": false,
3254
+ "type": "boolean"
3255
+ },
3256
+ "yes": {
3257
+ "description": "Skip confirmation",
3258
+ "name": "yes",
3259
+ "allowNo": false,
3260
+ "type": "boolean"
3314
3261
  }
3315
3262
  },
3316
3263
  "hasDynamicHelp": false,
3317
3264
  "hiddenAliases": [],
3318
- "id": "face:stats",
3265
+ "id": "face:unshare",
3319
3266
  "pluginAlias": "faces-cli",
3320
3267
  "pluginName": "faces-cli",
3321
3268
  "pluginType": "core",
@@ -3326,19 +3273,13 @@
3326
3273
  "dist",
3327
3274
  "commands",
3328
3275
  "face",
3329
- "stats.js"
3276
+ "unshare.js"
3330
3277
  ]
3331
3278
  },
3332
- "face:teams": {
3279
+ "keys:create": {
3333
3280
  "aliases": [],
3334
- "args": {
3335
- "alias": {
3336
- "description": "Face alias",
3337
- "name": "alias",
3338
- "required": true
3339
- }
3340
- },
3341
- "description": "Set a face's team memberships (replaces all)",
3281
+ "args": {},
3282
+ "description": "Create a new API key (JWT required). The new key is saved to ~/.faces/config.json as api_key by default; pass --no-save to skip.",
3342
3283
  "flags": {
3343
3284
  "json": {
3344
3285
  "description": "Format output as json.",
@@ -3371,18 +3312,52 @@
3371
3312
  "multiple": false,
3372
3313
  "type": "option"
3373
3314
  },
3374
- "team": {
3375
- "description": "Team ID (repeatable, replaces all memberships)",
3376
- "name": "team",
3315
+ "name": {
3316
+ "description": "Key name/label",
3317
+ "name": "name",
3377
3318
  "required": true,
3378
3319
  "hasDynamicHelp": false,
3320
+ "multiple": false,
3321
+ "type": "option"
3322
+ },
3323
+ "expires-days": {
3324
+ "description": "Expiry in days (omit for no expiry)",
3325
+ "name": "expires-days",
3326
+ "hasDynamicHelp": false,
3327
+ "multiple": false,
3328
+ "type": "option"
3329
+ },
3330
+ "budget": {
3331
+ "description": "Spend budget in USD",
3332
+ "name": "budget",
3333
+ "hasDynamicHelp": false,
3334
+ "multiple": false,
3335
+ "type": "option"
3336
+ },
3337
+ "face": {
3338
+ "description": "Allowed face alias (repeatable)",
3339
+ "name": "face",
3340
+ "hasDynamicHelp": false,
3341
+ "multiple": true,
3342
+ "type": "option"
3343
+ },
3344
+ "model": {
3345
+ "description": "Allowed model name (repeatable)",
3346
+ "name": "model",
3347
+ "hasDynamicHelp": false,
3379
3348
  "multiple": true,
3380
3349
  "type": "option"
3350
+ },
3351
+ "save": {
3352
+ "description": "Save the new key to ~/.faces/config.json as api_key (default: true; use --no-save to skip)",
3353
+ "name": "save",
3354
+ "allowNo": true,
3355
+ "type": "boolean"
3381
3356
  }
3382
3357
  },
3383
3358
  "hasDynamicHelp": false,
3384
3359
  "hiddenAliases": [],
3385
- "id": "face:teams",
3360
+ "id": "keys:create",
3386
3361
  "pluginAlias": "faces-cli",
3387
3362
  "pluginName": "faces-cli",
3388
3363
  "pluginType": "core",
@@ -3392,23 +3367,14 @@
3392
3367
  "relativePath": [
3393
3368
  "dist",
3394
3369
  "commands",
3395
- "face",
3396
- "teams.js"
3370
+ "keys",
3371
+ "create.js"
3397
3372
  ]
3398
3373
  },
3399
- "face:unlock": {
3374
+ "keys:list": {
3400
3375
  "aliases": [],
3401
- "args": {
3402
- "face_id": {
3403
- "description": "Face alias",
3404
- "name": "face_id",
3405
- "required": true
3406
- }
3407
- },
3408
- "description": "Unlock a face (make it writable again). Thaws the face and everything it owns (documents, threads, voiceprint).",
3409
- "examples": [
3410
- "<%= config.bin %> <%= command.id %> socrates"
3411
- ],
3376
+ "args": {},
3377
+ "description": "List all API keys (JWT required)",
3412
3378
  "flags": {
3413
3379
  "json": {
3414
3380
  "description": "Format output as json.",
@@ -3444,7 +3410,7 @@
3444
3410
  },
3445
3411
  "hasDynamicHelp": false,
3446
3412
  "hiddenAliases": [],
3447
- "id": "face:unlock",
3413
+ "id": "keys:list",
3448
3414
  "pluginAlias": "faces-cli",
3449
3415
  "pluginName": "faces-cli",
3450
3416
  "pluginType": "core",
@@ -3454,20 +3420,20 @@
3454
3420
  "relativePath": [
3455
3421
  "dist",
3456
3422
  "commands",
3457
- "face",
3458
- "unlock.js"
3423
+ "keys",
3424
+ "list.js"
3459
3425
  ]
3460
3426
  },
3461
- "face:unpublish": {
3427
+ "keys:revoke": {
3462
3428
  "aliases": [],
3463
3429
  "args": {
3464
- "alias": {
3465
- "description": "Face alias",
3466
- "name": "alias",
3430
+ "key_id": {
3431
+ "description": "Key ID",
3432
+ "name": "key_id",
3467
3433
  "required": true
3468
3434
  }
3469
3435
  },
3470
- "description": "Stop publishing a face. Anyone it is individually shared with keeps their access — publishing is an override on top of sharing, not a replacement for it.",
3436
+ "description": "Revoke an API key (JWT required)",
3471
3437
  "flags": {
3472
3438
  "json": {
3473
3439
  "description": "Format output as json.",
@@ -3499,11 +3465,17 @@
3499
3465
  "hasDynamicHelp": false,
3500
3466
  "multiple": false,
3501
3467
  "type": "option"
3468
+ },
3469
+ "yes": {
3470
+ "description": "Skip confirmation",
3471
+ "name": "yes",
3472
+ "allowNo": false,
3473
+ "type": "boolean"
3502
3474
  }
3503
3475
  },
3504
3476
  "hasDynamicHelp": false,
3505
3477
  "hiddenAliases": [],
3506
- "id": "face:unpublish",
3478
+ "id": "keys:revoke",
3507
3479
  "pluginAlias": "faces-cli",
3508
3480
  "pluginName": "faces-cli",
3509
3481
  "pluginType": "core",
@@ -3513,24 +3485,20 @@
3513
3485
  "relativePath": [
3514
3486
  "dist",
3515
3487
  "commands",
3516
- "face",
3517
- "unpublish.js"
3488
+ "keys",
3489
+ "revoke.js"
3518
3490
  ]
3519
3491
  },
3520
- "face:unshare": {
3492
+ "keys:update": {
3521
3493
  "aliases": [],
3522
3494
  "args": {
3523
- "alias": {
3524
- "description": "Face alias",
3525
- "name": "alias",
3495
+ "key_id": {
3496
+ "description": "Key ID",
3497
+ "name": "key_id",
3526
3498
  "required": true
3527
3499
  }
3528
3500
  },
3529
- "description": "Revoke access to a shared face. Takes effect immediately — there is no grace period.",
3530
- "examples": [
3531
- "<%= config.bin %> <%= command.id %> alice --from dana --yes",
3532
- "<%= config.bin %> <%= command.id %> alice --all --yes"
3533
- ],
3501
+ "description": "Update API key metadata (JWT required)",
3534
3502
  "flags": {
3535
3503
  "json": {
3536
3504
  "description": "Format output as json.",
@@ -3563,35 +3531,30 @@
3563
3531
  "multiple": false,
3564
3532
  "type": "option"
3565
3533
  },
3566
- "from": {
3567
- "description": "Account to revoke (repeatable)",
3568
- "exclusive": [
3569
- "all"
3570
- ],
3571
- "name": "from",
3534
+ "name": {
3535
+ "description": "New key name",
3536
+ "name": "name",
3572
3537
  "hasDynamicHelp": false,
3573
- "multiple": true,
3538
+ "multiple": false,
3574
3539
  "type": "option"
3575
3540
  },
3576
- "all": {
3577
- "description": "Revoke everyone",
3578
- "exclusive": [
3579
- "from"
3580
- ],
3581
- "name": "all",
3582
- "allowNo": false,
3583
- "type": "boolean"
3541
+ "budget": {
3542
+ "description": "New spend budget in USD",
3543
+ "name": "budget",
3544
+ "hasDynamicHelp": false,
3545
+ "multiple": false,
3546
+ "type": "option"
3584
3547
  },
3585
- "yes": {
3586
- "description": "Skip confirmation",
3587
- "name": "yes",
3548
+ "reset-spent": {
3549
+ "description": "Reset spent amount to zero",
3550
+ "name": "reset-spent",
3588
3551
  "allowNo": false,
3589
3552
  "type": "boolean"
3590
3553
  }
3591
3554
  },
3592
3555
  "hasDynamicHelp": false,
3593
3556
  "hiddenAliases": [],
3594
- "id": "face:unshare",
3557
+ "id": "keys:update",
3595
3558
  "pluginAlias": "faces-cli",
3596
3559
  "pluginName": "faces-cli",
3597
3560
  "pluginType": "core",
@@ -3601,14 +3564,24 @@
3601
3564
  "relativePath": [
3602
3565
  "dist",
3603
3566
  "commands",
3604
- "face",
3605
- "unshare.js"
3567
+ "keys",
3568
+ "update.js"
3606
3569
  ]
3607
3570
  },
3608
- "keys:create": {
3571
+ "style:delete": {
3609
3572
  "aliases": [],
3610
- "args": {},
3611
- "description": "Create a new API key (JWT required). The new key is saved to ~/.faces/config.json as api_key by default; pass --no-save to skip.",
3573
+ "args": {
3574
+ "alias": {
3575
+ "description": "Face alias",
3576
+ "name": "alias",
3577
+ "required": true
3578
+ }
3579
+ },
3580
+ "description": "Delete a face's captured style. The material it was learned from is kept, so the style can be captured again without re-uploading. This never deletes documents or threads: remove those with compile:doc:delete or compile:thread:delete.",
3581
+ "examples": [
3582
+ "<%= config.bin %> <%= command.id %> alice",
3583
+ "<%= config.bin %> <%= command.id %> alice --yes"
3584
+ ],
3612
3585
  "flags": {
3613
3586
  "json": {
3614
3587
  "description": "Format output as json.",
@@ -3639,54 +3612,18 @@
3639
3612
  "name": "api-key",
3640
3613
  "hasDynamicHelp": false,
3641
3614
  "multiple": false,
3642
- "type": "option"
3643
- },
3644
- "name": {
3645
- "description": "Key name/label",
3646
- "name": "name",
3647
- "required": true,
3648
- "hasDynamicHelp": false,
3649
- "multiple": false,
3650
- "type": "option"
3651
- },
3652
- "expires-days": {
3653
- "description": "Expiry in days (omit for no expiry)",
3654
- "name": "expires-days",
3655
- "hasDynamicHelp": false,
3656
- "multiple": false,
3657
- "type": "option"
3658
- },
3659
- "budget": {
3660
- "description": "Spend budget in USD",
3661
- "name": "budget",
3662
- "hasDynamicHelp": false,
3663
- "multiple": false,
3664
- "type": "option"
3665
- },
3666
- "face": {
3667
- "description": "Allowed face alias (repeatable)",
3668
- "name": "face",
3669
- "hasDynamicHelp": false,
3670
- "multiple": true,
3671
- "type": "option"
3672
- },
3673
- "model": {
3674
- "description": "Allowed model name (repeatable)",
3675
- "name": "model",
3676
- "hasDynamicHelp": false,
3677
- "multiple": true,
3678
- "type": "option"
3679
- },
3680
- "save": {
3681
- "description": "Save the new key to ~/.faces/config.json as api_key (default: true; use --no-save to skip)",
3682
- "name": "save",
3683
- "allowNo": true,
3615
+ "type": "option"
3616
+ },
3617
+ "yes": {
3618
+ "description": "Skip confirmation",
3619
+ "name": "yes",
3620
+ "allowNo": false,
3684
3621
  "type": "boolean"
3685
3622
  }
3686
3623
  },
3687
3624
  "hasDynamicHelp": false,
3688
3625
  "hiddenAliases": [],
3689
- "id": "keys:create",
3626
+ "id": "style:delete",
3690
3627
  "pluginAlias": "faces-cli",
3691
3628
  "pluginName": "faces-cli",
3692
3629
  "pluginType": "core",
@@ -3696,14 +3633,26 @@
3696
3633
  "relativePath": [
3697
3634
  "dist",
3698
3635
  "commands",
3699
- "keys",
3700
- "create.js"
3636
+ "style",
3637
+ "delete.js"
3701
3638
  ]
3702
3639
  },
3703
- "keys:list": {
3640
+ "style:make": {
3704
3641
  "aliases": [],
3705
- "args": {},
3706
- "description": "List all API keys (JWT required)",
3642
+ "args": {
3643
+ "alias": {
3644
+ "description": "Face alias",
3645
+ "name": "alias",
3646
+ "required": true
3647
+ }
3648
+ },
3649
+ "description": "Capture how a face writes, from its own material, and install it. This is style, not knowledge: compile teaches a face what it knows, style teaches it how it sounds. Name the sources to learn from with --source, or take everything ready with --all.",
3650
+ "examples": [
3651
+ "<%= config.bin %> <%= command.id %> alice --all",
3652
+ "<%= config.bin %> <%= command.id %> alice --source 1a2b3c4d --source 5e6f7a8b",
3653
+ "<%= config.bin %> <%= command.id %> alice --source 1a2b3c4d:essay",
3654
+ "<%= config.bin %> <%= command.id %> alice --all --medium essay --no-wait"
3655
+ ],
3707
3656
  "flags": {
3708
3657
  "json": {
3709
3658
  "description": "Format output as json.",
@@ -3735,11 +3684,71 @@
3735
3684
  "hasDynamicHelp": false,
3736
3685
  "multiple": false,
3737
3686
  "type": "option"
3687
+ },
3688
+ "source": {
3689
+ "description": "A document or thread to learn from, by id (repeatable). Append :<medium> to declare what it is, e.g. --source 1a2b3c4d:essay, when the source does not already say.",
3690
+ "name": "source",
3691
+ "hasDynamicHelp": false,
3692
+ "multiple": true,
3693
+ "type": "option"
3694
+ },
3695
+ "all": {
3696
+ "description": "Use every source on the face that is ready. Anything skipped is listed.",
3697
+ "name": "all",
3698
+ "allowNo": false,
3699
+ "type": "boolean"
3700
+ },
3701
+ "medium": {
3702
+ "description": "Medium for any selected source that does not declare one. Each medium is analysed on its own, so an essay never teaches a rule about email.",
3703
+ "name": "medium",
3704
+ "hasDynamicHelp": false,
3705
+ "multiple": false,
3706
+ "type": "option"
3707
+ },
3708
+ "model": {
3709
+ "description": "Analyst model (default: gpt-5.6-terra)",
3710
+ "name": "model",
3711
+ "hasDynamicHelp": false,
3712
+ "multiple": false,
3713
+ "type": "option"
3714
+ },
3715
+ "allow-paid": {
3716
+ "description": "Permit a build that bills. Without this a build is free or it does not run. Needed for any model outside the free tier, and to allow the paid route when a free quota is exhausted.",
3717
+ "name": "allow-paid",
3718
+ "allowNo": false,
3719
+ "type": "boolean"
3720
+ },
3721
+ "compile": {
3722
+ "description": "Compile any named source that is not compiled yet, before capturing style. On by default. --no-compile captures style from what is already compiled and never bills for compilation.",
3723
+ "name": "compile",
3724
+ "allowNo": true,
3725
+ "type": "boolean"
3726
+ },
3727
+ "best-of": {
3728
+ "description": "Generate N candidates and keep the best (1-5, default 1)",
3729
+ "name": "best-of",
3730
+ "hasDynamicHelp": false,
3731
+ "multiple": false,
3732
+ "type": "option"
3733
+ },
3734
+ "no-wait": {
3735
+ "description": "Start the build and return the job id without polling.",
3736
+ "name": "no-wait",
3737
+ "allowNo": false,
3738
+ "type": "boolean"
3739
+ },
3740
+ "timeout": {
3741
+ "description": "How long to wait, in seconds (default: 3600)",
3742
+ "name": "timeout",
3743
+ "default": 3600,
3744
+ "hasDynamicHelp": false,
3745
+ "multiple": false,
3746
+ "type": "option"
3738
3747
  }
3739
3748
  },
3740
3749
  "hasDynamicHelp": false,
3741
3750
  "hiddenAliases": [],
3742
- "id": "keys:list",
3751
+ "id": "style:make",
3743
3752
  "pluginAlias": "faces-cli",
3744
3753
  "pluginName": "faces-cli",
3745
3754
  "pluginType": "core",
@@ -3749,20 +3758,23 @@
3749
3758
  "relativePath": [
3750
3759
  "dist",
3751
3760
  "commands",
3752
- "keys",
3753
- "list.js"
3761
+ "style",
3762
+ "make.js"
3754
3763
  ]
3755
3764
  },
3756
- "keys:revoke": {
3765
+ "style:revert": {
3757
3766
  "aliases": [],
3758
3767
  "args": {
3759
- "key_id": {
3760
- "description": "Key ID",
3761
- "name": "key_id",
3768
+ "alias": {
3769
+ "description": "Face alias",
3770
+ "name": "alias",
3762
3771
  "required": true
3763
3772
  }
3764
3773
  },
3765
- "description": "Revoke an API key (JWT required)",
3774
+ "description": "Go back to the style a face had before the last style:make. It steps backwards through the kept versions and there is no step forward, so the way to undo a revert is to capture the style again. It changes how the face writes immediately, so it asks first.",
3775
+ "examples": [
3776
+ "<%= config.bin %> <%= command.id %> alice --yes"
3777
+ ],
3766
3778
  "flags": {
3767
3779
  "json": {
3768
3780
  "description": "Format output as json.",
@@ -3804,7 +3816,7 @@
3804
3816
  },
3805
3817
  "hasDynamicHelp": false,
3806
3818
  "hiddenAliases": [],
3807
- "id": "keys:revoke",
3819
+ "id": "style:revert",
3808
3820
  "pluginAlias": "faces-cli",
3809
3821
  "pluginName": "faces-cli",
3810
3822
  "pluginType": "core",
@@ -3814,20 +3826,25 @@
3814
3826
  "relativePath": [
3815
3827
  "dist",
3816
3828
  "commands",
3817
- "keys",
3818
- "revoke.js"
3829
+ "style",
3830
+ "revert.js"
3819
3831
  ]
3820
3832
  },
3821
- "keys:update": {
3833
+ "style:status": {
3822
3834
  "aliases": [],
3823
3835
  "args": {
3824
- "key_id": {
3825
- "description": "Key ID",
3826
- "name": "key_id",
3827
- "required": true
3836
+ "job_id": {
3837
+ "description": "Build job id",
3838
+ "name": "job_id",
3839
+ "required": false
3828
3840
  }
3829
3841
  },
3830
- "description": "Update API key metadata (JWT required)",
3842
+ "description": "Read a style build. Give a job id for one build, or --face to list a face's recent builds. Listing is how you find a job id you no longer have.",
3843
+ "examples": [
3844
+ "<%= config.bin %> <%= command.id %> 7a8b9c0d",
3845
+ "<%= config.bin %> <%= command.id %> --face alice",
3846
+ "<%= config.bin %> <%= command.id %> 7a8b9c0d --wait"
3847
+ ],
3831
3848
  "flags": {
3832
3849
  "json": {
3833
3850
  "description": "Format output as json.",
@@ -3860,30 +3877,39 @@
3860
3877
  "multiple": false,
3861
3878
  "type": "option"
3862
3879
  },
3863
- "name": {
3864
- "description": "New key name",
3865
- "name": "name",
3880
+ "face": {
3881
+ "description": "List recent builds for this face instead of reading one job",
3882
+ "name": "face",
3866
3883
  "hasDynamicHelp": false,
3867
3884
  "multiple": false,
3868
3885
  "type": "option"
3869
3886
  },
3870
- "budget": {
3871
- "description": "New spend budget in USD",
3872
- "name": "budget",
3887
+ "limit": {
3888
+ "description": "How many builds to list with --face (default: 10)",
3889
+ "name": "limit",
3890
+ "default": 10,
3873
3891
  "hasDynamicHelp": false,
3874
3892
  "multiple": false,
3875
3893
  "type": "option"
3876
3894
  },
3877
- "reset-spent": {
3878
- "description": "Reset spent amount to zero",
3879
- "name": "reset-spent",
3895
+ "wait": {
3896
+ "description": "Block until the job finishes",
3897
+ "name": "wait",
3880
3898
  "allowNo": false,
3881
3899
  "type": "boolean"
3900
+ },
3901
+ "timeout": {
3902
+ "description": "How long to wait with --wait, in seconds (default: 3600)",
3903
+ "name": "timeout",
3904
+ "default": 3600,
3905
+ "hasDynamicHelp": false,
3906
+ "multiple": false,
3907
+ "type": "option"
3882
3908
  }
3883
3909
  },
3884
3910
  "hasDynamicHelp": false,
3885
3911
  "hiddenAliases": [],
3886
- "id": "keys:update",
3912
+ "id": "style:status",
3887
3913
  "pluginAlias": "faces-cli",
3888
3914
  "pluginName": "faces-cli",
3889
3915
  "pluginType": "core",
@@ -3893,23 +3919,29 @@
3893
3919
  "relativePath": [
3894
3920
  "dist",
3895
3921
  "commands",
3896
- "keys",
3897
- "update.js"
3922
+ "style",
3923
+ "status.js"
3898
3924
  ]
3899
3925
  },
3900
- "style:delete": {
3926
+ "style:upload": {
3901
3927
  "aliases": [],
3902
3928
  "args": {
3903
3929
  "alias": {
3904
3930
  "description": "Face alias",
3905
3931
  "name": "alias",
3906
3932
  "required": true
3933
+ },
3934
+ "file": {
3935
+ "description": "Corpus file",
3936
+ "name": "file",
3937
+ "required": true
3907
3938
  }
3908
3939
  },
3909
- "description": "Delete a face's captured style. --scope map forgets the style and keeps the material it came from. --scope all deletes the uploaded material too, permanently. There is no default because the two differ by whether your material survives.",
3940
+ "description": "Load a corpus of a person's own writing (a mail export, a message archive) as source material for style capture. This only stores the material: nothing is compiled and nothing is billed. Capture the style afterwards with style:make.",
3910
3941
  "examples": [
3911
- "<%= config.bin %> <%= command.id %> alice --scope map",
3912
- "<%= config.bin %> <%= command.id %> alice --scope all --yes"
3942
+ "<%= config.bin %> <%= command.id %> alice ./mail.jsonl",
3943
+ "<%= config.bin %> <%= command.id %> alice ./thread.json --type thread_json",
3944
+ "<%= config.bin %> <%= command.id %> alice ./mail.jsonl --messages-per-room 100 --strict"
3913
3945
  ],
3914
3946
  "flags": {
3915
3947
  "json": {
@@ -3943,28 +3975,36 @@
3943
3975
  "multiple": false,
3944
3976
  "type": "option"
3945
3977
  },
3946
- "scope": {
3947
- "description": "map: forget the style, keep the material. all: delete the material with it, permanently.",
3948
- "name": "scope",
3949
- "required": true,
3978
+ "type": {
3979
+ "description": "email_jsonl: one message per line, split across several rooms. thread_json: a JSON array that becomes a single room.",
3980
+ "name": "type",
3981
+ "default": "email_jsonl",
3950
3982
  "hasDynamicHelp": false,
3951
3983
  "multiple": false,
3952
3984
  "options": [
3953
- "map",
3954
- "all"
3985
+ "email_jsonl",
3986
+ "thread_json"
3955
3987
  ],
3956
3988
  "type": "option"
3957
3989
  },
3958
- "yes": {
3959
- "description": "Skip confirmation",
3960
- "name": "yes",
3990
+ "messages-per-room": {
3991
+ "description": "How many messages per room when the type is email_jsonl (1-1000, default: 50)",
3992
+ "name": "messages-per-room",
3993
+ "default": 50,
3994
+ "hasDynamicHelp": false,
3995
+ "multiple": false,
3996
+ "type": "option"
3997
+ },
3998
+ "strict": {
3999
+ "description": "Reject the whole upload if any message is invalid. By default invalid messages are skipped and reported, because a corpus is statistical and a few bad lines are not worth losing the rest.",
4000
+ "name": "strict",
3961
4001
  "allowNo": false,
3962
4002
  "type": "boolean"
3963
4003
  }
3964
4004
  },
3965
4005
  "hasDynamicHelp": false,
3966
4006
  "hiddenAliases": [],
3967
- "id": "style:delete",
4007
+ "id": "style:upload",
3968
4008
  "pluginAlias": "faces-cli",
3969
4009
  "pluginName": "faces-cli",
3970
4010
  "pluginType": "core",
@@ -3975,10 +4015,10 @@
3975
4015
  "dist",
3976
4016
  "commands",
3977
4017
  "style",
3978
- "delete.js"
4018
+ "upload.js"
3979
4019
  ]
3980
4020
  },
3981
- "style:make": {
4021
+ "style:versions": {
3982
4022
  "aliases": [],
3983
4023
  "args": {
3984
4024
  "alias": {
@@ -3987,12 +4027,10 @@
3987
4027
  "required": true
3988
4028
  }
3989
4029
  },
3990
- "description": "Capture how a face writes, from its own material, and install it. This is style, not knowledge: compile teaches a face what it knows, style teaches it how it sounds. Name the sources to learn from with --source, or take everything ready with --all.",
4030
+ "description": "List the styles captured for a face, and which one it is writing in now. Each style:make keeps the previous one, so this is what style:revert has to go back to.",
3991
4031
  "examples": [
3992
- "<%= config.bin %> <%= command.id %> alice --all",
3993
- "<%= config.bin %> <%= command.id %> alice --source 1a2b3c4d --source 5e6f7a8b",
3994
- "<%= config.bin %> <%= command.id %> alice --source 1a2b3c4d:essay",
3995
- "<%= config.bin %> <%= command.id %> alice --all --medium essay --no-wait"
4032
+ "<%= config.bin %> <%= command.id %> alice",
4033
+ "<%= config.bin %> <%= command.id %> alice --json"
3996
4034
  ],
3997
4035
  "flags": {
3998
4036
  "json": {
@@ -4002,86 +4040,26 @@
4002
4040
  "allowNo": false,
4003
4041
  "type": "boolean"
4004
4042
  },
4005
- "base-url": {
4006
- "description": "API base URL",
4007
- "env": "FACES_BASE_URL",
4008
- "name": "base-url",
4009
- "hasDynamicHelp": false,
4010
- "multiple": false,
4011
- "type": "option"
4012
- },
4013
- "token": {
4014
- "description": "JWT bearer token",
4015
- "env": "FACES_TOKEN",
4016
- "name": "token",
4017
- "hasDynamicHelp": false,
4018
- "multiple": false,
4019
- "type": "option"
4020
- },
4021
- "api-key": {
4022
- "description": "API key",
4023
- "env": "FACES_API_KEY",
4024
- "name": "api-key",
4025
- "hasDynamicHelp": false,
4026
- "multiple": false,
4027
- "type": "option"
4028
- },
4029
- "source": {
4030
- "description": "A document or thread to learn from, by id (repeatable). Append :<medium> to declare what it is, e.g. --source 1a2b3c4d:essay, when the source does not already say.",
4031
- "name": "source",
4032
- "hasDynamicHelp": false,
4033
- "multiple": true,
4034
- "type": "option"
4035
- },
4036
- "all": {
4037
- "description": "Use every source on the face that is ready. Anything skipped is listed.",
4038
- "name": "all",
4039
- "allowNo": false,
4040
- "type": "boolean"
4041
- },
4042
- "medium": {
4043
- "description": "Medium for any selected source that does not declare one. Each medium is analysed on its own, so an essay never teaches a rule about email.",
4044
- "name": "medium",
4045
- "hasDynamicHelp": false,
4046
- "multiple": false,
4047
- "type": "option"
4048
- },
4049
- "model": {
4050
- "description": "Analyst model (default: gpt-5.6-terra)",
4051
- "name": "model",
4043
+ "base-url": {
4044
+ "description": "API base URL",
4045
+ "env": "FACES_BASE_URL",
4046
+ "name": "base-url",
4052
4047
  "hasDynamicHelp": false,
4053
4048
  "multiple": false,
4054
4049
  "type": "option"
4055
4050
  },
4056
- "allow-paid": {
4057
- "description": "Permit a build that bills. Without this a build is free or it does not run. Needed for any model outside the free tier, and to allow the paid route when a free quota is exhausted.",
4058
- "name": "allow-paid",
4059
- "allowNo": false,
4060
- "type": "boolean"
4061
- },
4062
- "compile": {
4063
- "description": "Compile any named source that is not compiled yet, before capturing style. On by default. --no-compile captures style from what is already compiled and never bills for compilation.",
4064
- "name": "compile",
4065
- "allowNo": true,
4066
- "type": "boolean"
4067
- },
4068
- "best-of": {
4069
- "description": "Generate N candidates and keep the best (1-5, default 1)",
4070
- "name": "best-of",
4051
+ "token": {
4052
+ "description": "JWT bearer token",
4053
+ "env": "FACES_TOKEN",
4054
+ "name": "token",
4071
4055
  "hasDynamicHelp": false,
4072
4056
  "multiple": false,
4073
4057
  "type": "option"
4074
4058
  },
4075
- "no-wait": {
4076
- "description": "Start the build and return the job id without polling.",
4077
- "name": "no-wait",
4078
- "allowNo": false,
4079
- "type": "boolean"
4080
- },
4081
- "timeout": {
4082
- "description": "How long to wait, in seconds (default: 3600)",
4083
- "name": "timeout",
4084
- "default": 3600,
4059
+ "api-key": {
4060
+ "description": "API key",
4061
+ "env": "FACES_API_KEY",
4062
+ "name": "api-key",
4085
4063
  "hasDynamicHelp": false,
4086
4064
  "multiple": false,
4087
4065
  "type": "option"
@@ -4089,7 +4067,7 @@
4089
4067
  },
4090
4068
  "hasDynamicHelp": false,
4091
4069
  "hiddenAliases": [],
4092
- "id": "style:make",
4070
+ "id": "style:versions",
4093
4071
  "pluginAlias": "faces-cli",
4094
4072
  "pluginName": "faces-cli",
4095
4073
  "pluginType": "core",
@@ -4100,22 +4078,19 @@
4100
4078
  "dist",
4101
4079
  "commands",
4102
4080
  "style",
4103
- "make.js"
4081
+ "versions.js"
4104
4082
  ]
4105
4083
  },
4106
- "style:revert": {
4084
+ "team:add": {
4107
4085
  "aliases": [],
4108
4086
  "args": {
4109
- "alias": {
4110
- "description": "Face alias",
4111
- "name": "alias",
4087
+ "team_id": {
4088
+ "description": "Team ID",
4089
+ "name": "team_id",
4112
4090
  "required": true
4113
4091
  }
4114
4092
  },
4115
- "description": "Go back to the style a face had before the last style:make. It steps backwards through the kept versions and there is no step forward, so the way to undo a revert is to capture the style again. It changes how the face writes immediately, so it asks first.",
4116
- "examples": [
4117
- "<%= config.bin %> <%= command.id %> alice --yes"
4118
- ],
4093
+ "description": "Add face(s) to a team",
4119
4094
  "flags": {
4120
4095
  "json": {
4121
4096
  "description": "Format output as json.",
@@ -4148,16 +4123,18 @@
4148
4123
  "multiple": false,
4149
4124
  "type": "option"
4150
4125
  },
4151
- "yes": {
4152
- "description": "Skip confirmation",
4153
- "name": "yes",
4154
- "allowNo": false,
4155
- "type": "boolean"
4126
+ "face": {
4127
+ "description": "Face alias to add (repeatable)",
4128
+ "name": "face",
4129
+ "required": true,
4130
+ "hasDynamicHelp": false,
4131
+ "multiple": true,
4132
+ "type": "option"
4156
4133
  }
4157
4134
  },
4158
4135
  "hasDynamicHelp": false,
4159
4136
  "hiddenAliases": [],
4160
- "id": "style:revert",
4137
+ "id": "team:add",
4161
4138
  "pluginAlias": "faces-cli",
4162
4139
  "pluginName": "faces-cli",
4163
4140
  "pluginType": "core",
@@ -4167,25 +4144,14 @@
4167
4144
  "relativePath": [
4168
4145
  "dist",
4169
4146
  "commands",
4170
- "style",
4171
- "revert.js"
4147
+ "team",
4148
+ "add.js"
4172
4149
  ]
4173
4150
  },
4174
- "style:status": {
4151
+ "team:create": {
4175
4152
  "aliases": [],
4176
- "args": {
4177
- "job_id": {
4178
- "description": "Build job id",
4179
- "name": "job_id",
4180
- "required": false
4181
- }
4182
- },
4183
- "description": "Read a style build. Give a job id for one build, or --face to list a face's recent builds. Listing is how you find a job id you no longer have.",
4184
- "examples": [
4185
- "<%= config.bin %> <%= command.id %> 7a8b9c0d",
4186
- "<%= config.bin %> <%= command.id %> --face alice",
4187
- "<%= config.bin %> <%= command.id %> 7a8b9c0d --wait"
4188
- ],
4153
+ "args": {},
4154
+ "description": "Create a new team",
4189
4155
  "flags": {
4190
4156
  "json": {
4191
4157
  "description": "Format output as json.",
@@ -4218,39 +4184,46 @@
4218
4184
  "multiple": false,
4219
4185
  "type": "option"
4220
4186
  },
4221
- "face": {
4222
- "description": "List recent builds for this face instead of reading one job",
4223
- "name": "face",
4187
+ "name": {
4188
+ "description": "Team name",
4189
+ "name": "name",
4190
+ "required": true,
4224
4191
  "hasDynamicHelp": false,
4225
4192
  "multiple": false,
4226
4193
  "type": "option"
4227
4194
  },
4228
- "limit": {
4229
- "description": "How many builds to list with --face (default: 10)",
4230
- "name": "limit",
4231
- "default": 10,
4195
+ "description": {
4196
+ "description": "Plain-text team description (max 1500 chars)",
4197
+ "name": "description",
4232
4198
  "hasDynamicHelp": false,
4233
4199
  "multiple": false,
4234
4200
  "type": "option"
4235
4201
  },
4236
- "wait": {
4237
- "description": "Block until the job finishes",
4238
- "name": "wait",
4239
- "allowNo": false,
4240
- "type": "boolean"
4202
+ "protocol": {
4203
+ "description": "Protocol content (mermaid diagram or markdown, max 1000 words)",
4204
+ "name": "protocol",
4205
+ "hasDynamicHelp": false,
4206
+ "multiple": false,
4207
+ "type": "option"
4241
4208
  },
4242
- "timeout": {
4243
- "description": "How long to wait with --wait, in seconds (default: 3600)",
4244
- "name": "timeout",
4245
- "default": 3600,
4209
+ "protocol-file": {
4210
+ "description": "Read protocol from file",
4211
+ "name": "protocol-file",
4246
4212
  "hasDynamicHelp": false,
4247
4213
  "multiple": false,
4248
4214
  "type": "option"
4215
+ },
4216
+ "tag": {
4217
+ "description": "Tag label (repeatable, lowercase)",
4218
+ "name": "tag",
4219
+ "hasDynamicHelp": false,
4220
+ "multiple": true,
4221
+ "type": "option"
4249
4222
  }
4250
4223
  },
4251
4224
  "hasDynamicHelp": false,
4252
4225
  "hiddenAliases": [],
4253
- "id": "style:status",
4226
+ "id": "team:create",
4254
4227
  "pluginAlias": "faces-cli",
4255
4228
  "pluginName": "faces-cli",
4256
4229
  "pluginType": "core",
@@ -4260,30 +4233,20 @@
4260
4233
  "relativePath": [
4261
4234
  "dist",
4262
4235
  "commands",
4263
- "style",
4264
- "status.js"
4236
+ "team",
4237
+ "create.js"
4265
4238
  ]
4266
4239
  },
4267
- "style:upload": {
4240
+ "team:delete": {
4268
4241
  "aliases": [],
4269
4242
  "args": {
4270
- "alias": {
4271
- "description": "Face alias",
4272
- "name": "alias",
4273
- "required": true
4274
- },
4275
- "file": {
4276
- "description": "Corpus file",
4277
- "name": "file",
4243
+ "team_id": {
4244
+ "description": "Team ID",
4245
+ "name": "team_id",
4278
4246
  "required": true
4279
4247
  }
4280
4248
  },
4281
- "description": "Load a corpus of a person's own writing (a mail export, a message archive) as source material for style capture. This only stores the material: nothing is compiled and nothing is billed. Capture the style afterwards with style:make.",
4282
- "examples": [
4283
- "<%= config.bin %> <%= command.id %> alice ./mail.jsonl",
4284
- "<%= config.bin %> <%= command.id %> alice ./thread.json --type thread_json",
4285
- "<%= config.bin %> <%= command.id %> alice ./mail.jsonl --messages-per-room 100 --strict"
4286
- ],
4249
+ "description": "Delete a team",
4287
4250
  "flags": {
4288
4251
  "json": {
4289
4252
  "description": "Format output as json.",
@@ -4316,36 +4279,16 @@
4316
4279
  "multiple": false,
4317
4280
  "type": "option"
4318
4281
  },
4319
- "type": {
4320
- "description": "email_jsonl: one message per line, split across several rooms. thread_json: a JSON array that becomes a single room.",
4321
- "name": "type",
4322
- "default": "email_jsonl",
4323
- "hasDynamicHelp": false,
4324
- "multiple": false,
4325
- "options": [
4326
- "email_jsonl",
4327
- "thread_json"
4328
- ],
4329
- "type": "option"
4330
- },
4331
- "messages-per-room": {
4332
- "description": "How many messages per room when the type is email_jsonl (1-1000, default: 50)",
4333
- "name": "messages-per-room",
4334
- "default": 50,
4335
- "hasDynamicHelp": false,
4336
- "multiple": false,
4337
- "type": "option"
4338
- },
4339
- "strict": {
4340
- "description": "Reject the whole upload if any message is invalid. By default invalid messages are skipped and reported, because a corpus is statistical and a few bad lines are not worth losing the rest.",
4341
- "name": "strict",
4282
+ "yes": {
4283
+ "description": "Skip confirmation",
4284
+ "name": "yes",
4342
4285
  "allowNo": false,
4343
4286
  "type": "boolean"
4344
4287
  }
4345
4288
  },
4346
4289
  "hasDynamicHelp": false,
4347
4290
  "hiddenAliases": [],
4348
- "id": "style:upload",
4291
+ "id": "team:delete",
4349
4292
  "pluginAlias": "faces-cli",
4350
4293
  "pluginName": "faces-cli",
4351
4294
  "pluginType": "core",
@@ -4355,24 +4298,20 @@
4355
4298
  "relativePath": [
4356
4299
  "dist",
4357
4300
  "commands",
4358
- "style",
4359
- "upload.js"
4301
+ "team",
4302
+ "delete.js"
4360
4303
  ]
4361
4304
  },
4362
- "style:versions": {
4305
+ "team:edit": {
4363
4306
  "aliases": [],
4364
4307
  "args": {
4365
- "alias": {
4366
- "description": "Face alias",
4367
- "name": "alias",
4308
+ "team_id": {
4309
+ "description": "Team ID",
4310
+ "name": "team_id",
4368
4311
  "required": true
4369
4312
  }
4370
4313
  },
4371
- "description": "List the styles captured for a face, and which one it is writing in now. Each style:make keeps the previous one, so this is what style:revert has to go back to.",
4372
- "examples": [
4373
- "<%= config.bin %> <%= command.id %> alice",
4374
- "<%= config.bin %> <%= command.id %> alice --json"
4375
- ],
4314
+ "description": "Edit a team",
4376
4315
  "flags": {
4377
4316
  "json": {
4378
4317
  "description": "Format output as json.",
@@ -4404,11 +4343,39 @@
4404
4343
  "hasDynamicHelp": false,
4405
4344
  "multiple": false,
4406
4345
  "type": "option"
4346
+ },
4347
+ "name": {
4348
+ "description": "New team name",
4349
+ "name": "name",
4350
+ "hasDynamicHelp": false,
4351
+ "multiple": false,
4352
+ "type": "option"
4353
+ },
4354
+ "description": {
4355
+ "description": "New description (max 1500 chars)",
4356
+ "name": "description",
4357
+ "hasDynamicHelp": false,
4358
+ "multiple": false,
4359
+ "type": "option"
4360
+ },
4361
+ "protocol": {
4362
+ "description": "New protocol content",
4363
+ "name": "protocol",
4364
+ "hasDynamicHelp": false,
4365
+ "multiple": false,
4366
+ "type": "option"
4367
+ },
4368
+ "protocol-file": {
4369
+ "description": "Read protocol from file",
4370
+ "name": "protocol-file",
4371
+ "hasDynamicHelp": false,
4372
+ "multiple": false,
4373
+ "type": "option"
4407
4374
  }
4408
4375
  },
4409
4376
  "hasDynamicHelp": false,
4410
4377
  "hiddenAliases": [],
4411
- "id": "style:versions",
4378
+ "id": "team:edit",
4412
4379
  "pluginAlias": "faces-cli",
4413
4380
  "pluginName": "faces-cli",
4414
4381
  "pluginType": "core",
@@ -4418,11 +4385,11 @@
4418
4385
  "relativePath": [
4419
4386
  "dist",
4420
4387
  "commands",
4421
- "style",
4422
- "versions.js"
4388
+ "team",
4389
+ "edit.js"
4423
4390
  ]
4424
4391
  },
4425
- "team:add": {
4392
+ "team:get": {
4426
4393
  "aliases": [],
4427
4394
  "args": {
4428
4395
  "team_id": {
@@ -4431,7 +4398,7 @@
4431
4398
  "required": true
4432
4399
  }
4433
4400
  },
4434
- "description": "Add face(s) to a team",
4401
+ "description": "Get a team by ID",
4435
4402
  "flags": {
4436
4403
  "json": {
4437
4404
  "description": "Format output as json.",
@@ -4463,19 +4430,11 @@
4463
4430
  "hasDynamicHelp": false,
4464
4431
  "multiple": false,
4465
4432
  "type": "option"
4466
- },
4467
- "face": {
4468
- "description": "Face alias to add (repeatable)",
4469
- "name": "face",
4470
- "required": true,
4471
- "hasDynamicHelp": false,
4472
- "multiple": true,
4473
- "type": "option"
4474
4433
  }
4475
4434
  },
4476
4435
  "hasDynamicHelp": false,
4477
4436
  "hiddenAliases": [],
4478
- "id": "team:add",
4437
+ "id": "team:get",
4479
4438
  "pluginAlias": "faces-cli",
4480
4439
  "pluginName": "faces-cli",
4481
4440
  "pluginType": "core",
@@ -4486,13 +4445,13 @@
4486
4445
  "dist",
4487
4446
  "commands",
4488
4447
  "team",
4489
- "add.js"
4448
+ "get.js"
4490
4449
  ]
4491
4450
  },
4492
- "team:create": {
4451
+ "team:list": {
4493
4452
  "aliases": [],
4494
4453
  "args": {},
4495
- "description": "Create a new team",
4454
+ "description": "List your teams",
4496
4455
  "flags": {
4497
4456
  "json": {
4498
4457
  "description": "Format output as json.",
@@ -4524,47 +4483,11 @@
4524
4483
  "hasDynamicHelp": false,
4525
4484
  "multiple": false,
4526
4485
  "type": "option"
4527
- },
4528
- "name": {
4529
- "description": "Team name",
4530
- "name": "name",
4531
- "required": true,
4532
- "hasDynamicHelp": false,
4533
- "multiple": false,
4534
- "type": "option"
4535
- },
4536
- "description": {
4537
- "description": "Plain-text team description (max 1500 chars)",
4538
- "name": "description",
4539
- "hasDynamicHelp": false,
4540
- "multiple": false,
4541
- "type": "option"
4542
- },
4543
- "protocol": {
4544
- "description": "Protocol content (mermaid diagram or markdown, max 1000 words)",
4545
- "name": "protocol",
4546
- "hasDynamicHelp": false,
4547
- "multiple": false,
4548
- "type": "option"
4549
- },
4550
- "protocol-file": {
4551
- "description": "Read protocol from file",
4552
- "name": "protocol-file",
4553
- "hasDynamicHelp": false,
4554
- "multiple": false,
4555
- "type": "option"
4556
- },
4557
- "tag": {
4558
- "description": "Tag label (repeatable, lowercase)",
4559
- "name": "tag",
4560
- "hasDynamicHelp": false,
4561
- "multiple": true,
4562
- "type": "option"
4563
4486
  }
4564
4487
  },
4565
4488
  "hasDynamicHelp": false,
4566
4489
  "hiddenAliases": [],
4567
- "id": "team:create",
4490
+ "id": "team:list",
4568
4491
  "pluginAlias": "faces-cli",
4569
4492
  "pluginName": "faces-cli",
4570
4493
  "pluginType": "core",
@@ -4575,10 +4498,10 @@
4575
4498
  "dist",
4576
4499
  "commands",
4577
4500
  "team",
4578
- "create.js"
4501
+ "list.js"
4579
4502
  ]
4580
4503
  },
4581
- "team:delete": {
4504
+ "team:members": {
4582
4505
  "aliases": [],
4583
4506
  "args": {
4584
4507
  "team_id": {
@@ -4587,7 +4510,7 @@
4587
4510
  "required": true
4588
4511
  }
4589
4512
  },
4590
- "description": "Delete a team",
4513
+ "description": "List members of a team",
4591
4514
  "flags": {
4592
4515
  "json": {
4593
4516
  "description": "Format output as json.",
@@ -4619,17 +4542,11 @@
4619
4542
  "hasDynamicHelp": false,
4620
4543
  "multiple": false,
4621
4544
  "type": "option"
4622
- },
4623
- "yes": {
4624
- "description": "Skip confirmation",
4625
- "name": "yes",
4626
- "allowNo": false,
4627
- "type": "boolean"
4628
4545
  }
4629
4546
  },
4630
4547
  "hasDynamicHelp": false,
4631
4548
  "hiddenAliases": [],
4632
- "id": "team:delete",
4549
+ "id": "team:members",
4633
4550
  "pluginAlias": "faces-cli",
4634
4551
  "pluginName": "faces-cli",
4635
4552
  "pluginType": "core",
@@ -4640,19 +4557,24 @@
4640
4557
  "dist",
4641
4558
  "commands",
4642
4559
  "team",
4643
- "delete.js"
4560
+ "members.js"
4644
4561
  ]
4645
4562
  },
4646
- "team:edit": {
4563
+ "team:remove": {
4647
4564
  "aliases": [],
4648
4565
  "args": {
4649
4566
  "team_id": {
4650
4567
  "description": "Team ID",
4651
4568
  "name": "team_id",
4652
4569
  "required": true
4570
+ },
4571
+ "alias": {
4572
+ "description": "Face alias to remove",
4573
+ "name": "alias",
4574
+ "required": true
4653
4575
  }
4654
4576
  },
4655
- "description": "Edit a team",
4577
+ "description": "Remove a face from a team",
4656
4578
  "flags": {
4657
4579
  "json": {
4658
4580
  "description": "Format output as json.",
@@ -4684,39 +4606,11 @@
4684
4606
  "hasDynamicHelp": false,
4685
4607
  "multiple": false,
4686
4608
  "type": "option"
4687
- },
4688
- "name": {
4689
- "description": "New team name",
4690
- "name": "name",
4691
- "hasDynamicHelp": false,
4692
- "multiple": false,
4693
- "type": "option"
4694
- },
4695
- "description": {
4696
- "description": "New description (max 1500 chars)",
4697
- "name": "description",
4698
- "hasDynamicHelp": false,
4699
- "multiple": false,
4700
- "type": "option"
4701
- },
4702
- "protocol": {
4703
- "description": "New protocol content",
4704
- "name": "protocol",
4705
- "hasDynamicHelp": false,
4706
- "multiple": false,
4707
- "type": "option"
4708
- },
4709
- "protocol-file": {
4710
- "description": "Read protocol from file",
4711
- "name": "protocol-file",
4712
- "hasDynamicHelp": false,
4713
- "multiple": false,
4714
- "type": "option"
4715
4609
  }
4716
4610
  },
4717
4611
  "hasDynamicHelp": false,
4718
4612
  "hiddenAliases": [],
4719
- "id": "team:edit",
4613
+ "id": "team:remove",
4720
4614
  "pluginAlias": "faces-cli",
4721
4615
  "pluginName": "faces-cli",
4722
4616
  "pluginType": "core",
@@ -4727,19 +4621,13 @@
4727
4621
  "dist",
4728
4622
  "commands",
4729
4623
  "team",
4730
- "edit.js"
4624
+ "remove.js"
4731
4625
  ]
4732
4626
  },
4733
- "team:get": {
4627
+ "compile:all": {
4734
4628
  "aliases": [],
4735
- "args": {
4736
- "team_id": {
4737
- "description": "Team ID",
4738
- "name": "team_id",
4739
- "required": true
4740
- }
4741
- },
4742
- "description": "Get a team by ID",
4629
+ "args": {},
4630
+ "description": "Compile all uncompiled documents and threads across all faces",
4743
4631
  "flags": {
4744
4632
  "json": {
4745
4633
  "description": "Format output as json.",
@@ -4771,11 +4659,19 @@
4771
4659
  "hasDynamicHelp": false,
4772
4660
  "multiple": false,
4773
4661
  "type": "option"
4662
+ },
4663
+ "timeout": {
4664
+ "description": "Per-item compile timeout in seconds (default: 600)",
4665
+ "name": "timeout",
4666
+ "default": 600,
4667
+ "hasDynamicHelp": false,
4668
+ "multiple": false,
4669
+ "type": "option"
4774
4670
  }
4775
4671
  },
4776
4672
  "hasDynamicHelp": false,
4777
4673
  "hiddenAliases": [],
4778
- "id": "team:get",
4674
+ "id": "compile:all",
4779
4675
  "pluginAlias": "faces-cli",
4780
4676
  "pluginName": "faces-cli",
4781
4677
  "pluginType": "core",
@@ -4785,14 +4681,20 @@
4785
4681
  "relativePath": [
4786
4682
  "dist",
4787
4683
  "commands",
4788
- "team",
4789
- "get.js"
4684
+ "compile",
4685
+ "all.js"
4790
4686
  ]
4791
4687
  },
4792
- "team:list": {
4688
+ "compile:import": {
4793
4689
  "aliases": [],
4794
- "args": {},
4795
- "description": "List your teams",
4690
+ "args": {
4691
+ "face_id": {
4692
+ "description": "Face alias",
4693
+ "name": "face_id",
4694
+ "required": true
4695
+ }
4696
+ },
4697
+ "description": "Import a YouTube video into a face via server-side download and transcription",
4796
4698
  "flags": {
4797
4699
  "json": {
4798
4700
  "description": "Format output as json.",
@@ -4824,11 +4726,56 @@
4824
4726
  "hasDynamicHelp": false,
4825
4727
  "multiple": false,
4826
4728
  "type": "option"
4729
+ },
4730
+ "url": {
4731
+ "description": "YouTube URL (youtube.com/watch?v=... or youtu.be/...)",
4732
+ "name": "url",
4733
+ "required": true,
4734
+ "hasDynamicHelp": false,
4735
+ "multiple": false,
4736
+ "type": "option"
4737
+ },
4738
+ "type": {
4739
+ "description": "\"document\" for solo talks, lectures, monologues; \"thread\" for interviews or multi-speaker conversations",
4740
+ "name": "type",
4741
+ "default": "document",
4742
+ "hasDynamicHelp": false,
4743
+ "multiple": false,
4744
+ "options": [
4745
+ "document",
4746
+ "thread"
4747
+ ],
4748
+ "type": "option"
4749
+ },
4750
+ "perspective": {
4751
+ "description": "\"first-person\" if the face is the speaker; \"third-person\" if the video is about the face",
4752
+ "name": "perspective",
4753
+ "default": "third-person",
4754
+ "hasDynamicHelp": false,
4755
+ "multiple": false,
4756
+ "options": [
4757
+ "first-person",
4758
+ "third-person"
4759
+ ],
4760
+ "type": "option"
4761
+ },
4762
+ "face-speaker": {
4763
+ "description": "For --type thread: AssemblyAI speaker label (e.g. \"A\") that corresponds to the face. Defaults to first detected speaker.",
4764
+ "name": "face-speaker",
4765
+ "hasDynamicHelp": false,
4766
+ "multiple": false,
4767
+ "type": "option"
4768
+ },
4769
+ "no-wait": {
4770
+ "description": "Return immediately after import starts (do not poll for transcription). Prints the ID for manual polling.",
4771
+ "name": "no-wait",
4772
+ "allowNo": false,
4773
+ "type": "boolean"
4827
4774
  }
4828
4775
  },
4829
4776
  "hasDynamicHelp": false,
4830
4777
  "hiddenAliases": [],
4831
- "id": "team:list",
4778
+ "id": "compile:import",
4832
4779
  "pluginAlias": "faces-cli",
4833
4780
  "pluginName": "faces-cli",
4834
4781
  "pluginType": "core",
@@ -4838,20 +4785,14 @@
4838
4785
  "relativePath": [
4839
4786
  "dist",
4840
4787
  "commands",
4841
- "team",
4842
- "list.js"
4788
+ "compile",
4789
+ "import.js"
4843
4790
  ]
4844
4791
  },
4845
- "team:members": {
4792
+ "compile:stats": {
4846
4793
  "aliases": [],
4847
- "args": {
4848
- "team_id": {
4849
- "description": "Team ID",
4850
- "name": "team_id",
4851
- "required": true
4852
- }
4853
- },
4854
- "description": "List members of a team",
4794
+ "args": {},
4795
+ "description": "Show compilation stats per face",
4855
4796
  "flags": {
4856
4797
  "json": {
4857
4798
  "description": "Format output as json.",
@@ -4887,7 +4828,7 @@
4887
4828
  },
4888
4829
  "hasDynamicHelp": false,
4889
4830
  "hiddenAliases": [],
4890
- "id": "team:members",
4831
+ "id": "compile:stats",
4891
4832
  "pluginAlias": "faces-cli",
4892
4833
  "pluginName": "faces-cli",
4893
4834
  "pluginType": "core",
@@ -4897,25 +4838,20 @@
4897
4838
  "relativePath": [
4898
4839
  "dist",
4899
4840
  "commands",
4900
- "team",
4901
- "members.js"
4841
+ "compile",
4842
+ "stats.js"
4902
4843
  ]
4903
4844
  },
4904
- "team:remove": {
4845
+ "compile:upload": {
4905
4846
  "aliases": [],
4906
4847
  "args": {
4907
- "team_id": {
4908
- "description": "Team ID",
4909
- "name": "team_id",
4910
- "required": true
4911
- },
4912
4848
  "alias": {
4913
- "description": "Face alias to remove",
4849
+ "description": "Face alias",
4914
4850
  "name": "alias",
4915
4851
  "required": true
4916
4852
  }
4917
4853
  },
4918
- "description": "Remove a face from a team",
4854
+ "description": "Upload a file (text/PDF/Word .docx/audio/video) to compile into a face",
4919
4855
  "flags": {
4920
4856
  "json": {
4921
4857
  "description": "Format output as json.",
@@ -4940,18 +4876,70 @@
4940
4876
  "multiple": false,
4941
4877
  "type": "option"
4942
4878
  },
4943
- "api-key": {
4944
- "description": "API key",
4945
- "env": "FACES_API_KEY",
4946
- "name": "api-key",
4879
+ "api-key": {
4880
+ "description": "API key",
4881
+ "env": "FACES_API_KEY",
4882
+ "name": "api-key",
4883
+ "hasDynamicHelp": false,
4884
+ "multiple": false,
4885
+ "type": "option"
4886
+ },
4887
+ "file": {
4888
+ "description": "File to upload",
4889
+ "name": "file",
4890
+ "required": true,
4891
+ "hasDynamicHelp": false,
4892
+ "multiple": false,
4893
+ "type": "option"
4894
+ },
4895
+ "kind": {
4896
+ "description": "Upload kind: document or thread",
4897
+ "name": "kind",
4898
+ "default": "document",
4899
+ "hasDynamicHelp": false,
4900
+ "multiple": false,
4901
+ "options": [
4902
+ "document",
4903
+ "thread"
4904
+ ],
4905
+ "type": "option"
4906
+ },
4907
+ "perspective": {
4908
+ "description": "Perspective (document only)",
4909
+ "name": "perspective",
4910
+ "default": "third-person",
4911
+ "hasDynamicHelp": false,
4912
+ "multiple": false,
4913
+ "options": [
4914
+ "first-person",
4915
+ "third-person"
4916
+ ],
4917
+ "type": "option"
4918
+ },
4919
+ "medium": {
4920
+ "description": "What sort of writing this is — e.g. email, text message, social post, essay, academic paper, blog post, legal document, thread reply, conversation (covers speech: transcripts, interviews, calls). Common synonyms fold automatically. Omit it if you do not know: a wrong declaration is worse than none, because a declaration is trusted and an absence is not. Only valid with --kind document.",
4921
+ "name": "medium",
4922
+ "hasDynamicHelp": false,
4923
+ "multiple": false,
4924
+ "type": "option"
4925
+ },
4926
+ "face-speaker": {
4927
+ "description": "Speaker name to map to the face (thread only). If omitted, auto-detected from face name.",
4928
+ "name": "face-speaker",
4947
4929
  "hasDynamicHelp": false,
4948
4930
  "multiple": false,
4949
4931
  "type": "option"
4932
+ },
4933
+ "no-wait": {
4934
+ "description": "Return immediately after upload (do not poll for transcription). Prints the ID for manual polling.",
4935
+ "name": "no-wait",
4936
+ "allowNo": false,
4937
+ "type": "boolean"
4950
4938
  }
4951
4939
  },
4952
4940
  "hasDynamicHelp": false,
4953
4941
  "hiddenAliases": [],
4954
- "id": "team:remove",
4942
+ "id": "compile:upload",
4955
4943
  "pluginAlias": "faces-cli",
4956
4944
  "pluginName": "faces-cli",
4957
4945
  "pluginType": "core",
@@ -4961,8 +4949,8 @@
4961
4949
  "relativePath": [
4962
4950
  "dist",
4963
4951
  "commands",
4964
- "team",
4965
- "remove.js"
4952
+ "compile",
4953
+ "upload.js"
4966
4954
  ]
4967
4955
  },
4968
4956
  "billing:subscription:activate": {
@@ -5144,16 +5132,16 @@
5144
5132
  "index.js"
5145
5133
  ]
5146
5134
  },
5147
- "compile:doc:create": {
5135
+ "face:tag:add": {
5148
5136
  "aliases": [],
5149
5137
  "args": {
5150
- "face_id": {
5138
+ "alias": {
5151
5139
  "description": "Face alias",
5152
- "name": "face_id",
5140
+ "name": "alias",
5153
5141
  "required": true
5154
5142
  }
5155
5143
  },
5156
- "description": "Submit a document to a face",
5144
+ "description": "Add tags to a face (appends, idempotent)",
5157
5145
  "flags": {
5158
5146
  "json": {
5159
5147
  "description": "Format output as json.",
@@ -5186,50 +5174,18 @@
5186
5174
  "multiple": false,
5187
5175
  "type": "option"
5188
5176
  },
5189
- "label": {
5190
- "description": "Document label/title",
5191
- "name": "label",
5192
- "hasDynamicHelp": false,
5193
- "multiple": false,
5194
- "type": "option"
5195
- },
5196
- "content": {
5197
- "description": "Inline text content",
5198
- "name": "content",
5199
- "hasDynamicHelp": false,
5200
- "multiple": false,
5201
- "type": "option"
5202
- },
5203
- "file": {
5204
- "description": "Read content from file",
5205
- "name": "file",
5206
- "hasDynamicHelp": false,
5207
- "multiple": false,
5208
- "type": "option"
5209
- },
5210
- "medium": {
5211
- "description": "What sort of writing this is — e.g. email, text message, social post, essay, academic paper, blog post, legal document, thread reply, conversation (covers speech: transcripts, interviews, calls). Common synonyms fold automatically. Omit it if you do not know: a wrong declaration is worse than none, because a declaration is trusted and an absence is not.",
5212
- "name": "medium",
5213
- "hasDynamicHelp": false,
5214
- "multiple": false,
5215
- "type": "option"
5216
- },
5217
- "perspective": {
5218
- "description": "Perspective (first-person or third-person)",
5219
- "name": "perspective",
5220
- "default": "first-person",
5177
+ "tag": {
5178
+ "description": "Tag to add (repeatable)",
5179
+ "name": "tag",
5180
+ "required": true,
5221
5181
  "hasDynamicHelp": false,
5222
- "multiple": false,
5223
- "options": [
5224
- "first-person",
5225
- "third-person"
5226
- ],
5182
+ "multiple": true,
5227
5183
  "type": "option"
5228
5184
  }
5229
5185
  },
5230
5186
  "hasDynamicHelp": false,
5231
5187
  "hiddenAliases": [],
5232
- "id": "compile:doc:create",
5188
+ "id": "face:tag:add",
5233
5189
  "pluginAlias": "faces-cli",
5234
5190
  "pluginName": "faces-cli",
5235
5191
  "pluginType": "core",
@@ -5239,21 +5195,15 @@
5239
5195
  "relativePath": [
5240
5196
  "dist",
5241
5197
  "commands",
5242
- "compile",
5243
- "doc",
5244
- "create.js"
5198
+ "face",
5199
+ "tag",
5200
+ "add.js"
5245
5201
  ]
5246
5202
  },
5247
- "compile:doc:delete": {
5203
+ "face:tag:all": {
5248
5204
  "aliases": [],
5249
- "args": {
5250
- "doc_id": {
5251
- "description": "Document ID",
5252
- "name": "doc_id",
5253
- "required": true
5254
- }
5255
- },
5256
- "description": "Delete a document",
5205
+ "args": {},
5206
+ "description": "List all tags across all your faces",
5257
5207
  "flags": {
5258
5208
  "json": {
5259
5209
  "description": "Format output as json.",
@@ -5289,7 +5239,7 @@
5289
5239
  },
5290
5240
  "hasDynamicHelp": false,
5291
5241
  "hiddenAliases": [],
5292
- "id": "compile:doc:delete",
5242
+ "id": "face:tag:all",
5293
5243
  "pluginAlias": "faces-cli",
5294
5244
  "pluginName": "faces-cli",
5295
5245
  "pluginType": "core",
@@ -5299,21 +5249,21 @@
5299
5249
  "relativePath": [
5300
5250
  "dist",
5301
5251
  "commands",
5302
- "compile",
5303
- "doc",
5304
- "delete.js"
5252
+ "face",
5253
+ "tag",
5254
+ "all.js"
5305
5255
  ]
5306
5256
  },
5307
- "compile:doc:edit": {
5257
+ "face:tag:list": {
5308
5258
  "aliases": [],
5309
5259
  "args": {
5310
- "doc_id": {
5311
- "description": "Document ID",
5312
- "name": "doc_id",
5260
+ "alias": {
5261
+ "description": "Face alias",
5262
+ "name": "alias",
5313
5263
  "required": true
5314
5264
  }
5315
5265
  },
5316
- "description": "Edit a document (label, content, or perspective)",
5266
+ "description": "List tags on a face",
5317
5267
  "flags": {
5318
5268
  "json": {
5319
5269
  "description": "Format output as json.",
@@ -5345,50 +5295,11 @@
5345
5295
  "hasDynamicHelp": false,
5346
5296
  "multiple": false,
5347
5297
  "type": "option"
5348
- },
5349
- "label": {
5350
- "description": "New label/title",
5351
- "name": "label",
5352
- "hasDynamicHelp": false,
5353
- "multiple": false,
5354
- "type": "option"
5355
- },
5356
- "content": {
5357
- "description": "New inline text content",
5358
- "name": "content",
5359
- "hasDynamicHelp": false,
5360
- "multiple": false,
5361
- "type": "option"
5362
- },
5363
- "file": {
5364
- "description": "Read new content from file",
5365
- "name": "file",
5366
- "hasDynamicHelp": false,
5367
- "multiple": false,
5368
- "type": "option"
5369
- },
5370
- "medium": {
5371
- "description": "What sort of writing this is — e.g. email, text message, social post, essay, academic paper, blog post, legal document, thread reply, conversation (covers speech: transcripts, interviews, calls). Common synonyms fold automatically. Omit it if you do not know: a wrong declaration is worse than none, because a declaration is trusted and an absence is not.",
5372
- "name": "medium",
5373
- "hasDynamicHelp": false,
5374
- "multiple": false,
5375
- "type": "option"
5376
- },
5377
- "perspective": {
5378
- "description": "Perspective (first-person or third-person)",
5379
- "name": "perspective",
5380
- "hasDynamicHelp": false,
5381
- "multiple": false,
5382
- "options": [
5383
- "first-person",
5384
- "third-person"
5385
- ],
5386
- "type": "option"
5387
5298
  }
5388
5299
  },
5389
5300
  "hasDynamicHelp": false,
5390
5301
  "hiddenAliases": [],
5391
- "id": "compile:doc:edit",
5302
+ "id": "face:tag:list",
5392
5303
  "pluginAlias": "faces-cli",
5393
5304
  "pluginName": "faces-cli",
5394
5305
  "pluginType": "core",
@@ -5398,21 +5309,26 @@
5398
5309
  "relativePath": [
5399
5310
  "dist",
5400
5311
  "commands",
5401
- "compile",
5402
- "doc",
5403
- "edit.js"
5312
+ "face",
5313
+ "tag",
5314
+ "list.js"
5404
5315
  ]
5405
5316
  },
5406
- "compile:doc:get": {
5317
+ "face:tag:remove": {
5407
5318
  "aliases": [],
5408
5319
  "args": {
5409
- "doc_id": {
5410
- "description": "Document ID",
5411
- "name": "doc_id",
5320
+ "alias": {
5321
+ "description": "Face alias",
5322
+ "name": "alias",
5323
+ "required": true
5324
+ },
5325
+ "tag": {
5326
+ "description": "Tag to remove",
5327
+ "name": "tag",
5412
5328
  "required": true
5413
5329
  }
5414
5330
  },
5415
- "description": "Get a document by ID",
5331
+ "description": "Remove a tag from a face",
5416
5332
  "flags": {
5417
5333
  "json": {
5418
5334
  "description": "Format output as json.",
@@ -5448,7 +5364,7 @@
5448
5364
  },
5449
5365
  "hasDynamicHelp": false,
5450
5366
  "hiddenAliases": [],
5451
- "id": "compile:doc:get",
5367
+ "id": "face:tag:remove",
5452
5368
  "pluginAlias": "faces-cli",
5453
5369
  "pluginName": "faces-cli",
5454
5370
  "pluginType": "core",
@@ -5458,25 +5374,21 @@
5458
5374
  "relativePath": [
5459
5375
  "dist",
5460
5376
  "commands",
5461
- "compile",
5462
- "doc",
5463
- "get.js"
5377
+ "face",
5378
+ "tag",
5379
+ "remove.js"
5464
5380
  ]
5465
5381
  },
5466
- "compile:doc": {
5382
+ "face:tag:set": {
5467
5383
  "aliases": [],
5468
5384
  "args": {
5469
- "face_id": {
5385
+ "alias": {
5470
5386
  "description": "Face alias",
5471
- "name": "face_id",
5387
+ "name": "alias",
5472
5388
  "required": true
5473
5389
  }
5474
5390
  },
5475
- "description": "Compile one or more documents into a face (create → make in one step). Repeat --file to submit several documents in a single command; each file becomes its own document rather than being concatenated.",
5476
- "examples": [
5477
- "<%= config.bin %> <%= command.id %> alice --file notes.txt",
5478
- "<%= config.bin %> <%= command.id %> alice --file a.txt --file b.txt --file c.txt --no-wait --json"
5479
- ],
5391
+ "description": "Replace all tags on a face",
5480
5392
  "flags": {
5481
5393
  "json": {
5482
5394
  "description": "Format output as json.",
@@ -5509,67 +5421,18 @@
5509
5421
  "multiple": false,
5510
5422
  "type": "option"
5511
5423
  },
5512
- "label": {
5513
- "description": "Document label/title (single document only; with several files each is labelled by its filename)",
5514
- "name": "label",
5515
- "hasDynamicHelp": false,
5516
- "multiple": false,
5517
- "type": "option"
5518
- },
5519
- "content": {
5520
- "description": "Inline text content",
5521
- "exclusive": [
5522
- "file"
5523
- ],
5524
- "name": "content",
5525
- "hasDynamicHelp": false,
5526
- "multiple": false,
5527
- "type": "option"
5528
- },
5529
- "file": {
5530
- "description": "Read content from file (repeatable — each file becomes its own document)",
5531
- "name": "file",
5424
+ "tag": {
5425
+ "description": "Tag to set (repeatable, replaces all)",
5426
+ "name": "tag",
5427
+ "required": true,
5532
5428
  "hasDynamicHelp": false,
5533
5429
  "multiple": true,
5534
5430
  "type": "option"
5535
- },
5536
- "medium": {
5537
- "description": "What sort of writing this is — e.g. email, text message, social post, essay, academic paper, blog post, legal document, thread reply, conversation (covers speech: transcripts, interviews, calls). Common synonyms fold automatically. Omit it if you do not know: a wrong declaration is worse than none, because a declaration is trusted and an absence is not.",
5538
- "name": "medium",
5539
- "hasDynamicHelp": false,
5540
- "multiple": false,
5541
- "type": "option"
5542
- },
5543
- "perspective": {
5544
- "description": "Perspective",
5545
- "name": "perspective",
5546
- "default": "first-person",
5547
- "hasDynamicHelp": false,
5548
- "multiple": false,
5549
- "options": [
5550
- "first-person",
5551
- "third-person"
5552
- ],
5553
- "type": "option"
5554
- },
5555
- "timeout": {
5556
- "description": "Compile timeout in seconds, per document (default: 600)",
5557
- "name": "timeout",
5558
- "default": 600,
5559
- "hasDynamicHelp": false,
5560
- "multiple": false,
5561
- "type": "option"
5562
- },
5563
- "no-wait": {
5564
- "description": "Create and trigger compilation, then return immediately without polling.",
5565
- "name": "no-wait",
5566
- "allowNo": false,
5567
- "type": "boolean"
5568
5431
  }
5569
5432
  },
5570
5433
  "hasDynamicHelp": false,
5571
5434
  "hiddenAliases": [],
5572
- "id": "compile:doc",
5435
+ "id": "face:tag:set",
5573
5436
  "pluginAlias": "faces-cli",
5574
5437
  "pluginName": "faces-cli",
5575
5438
  "pluginType": "core",
@@ -5579,21 +5442,21 @@
5579
5442
  "relativePath": [
5580
5443
  "dist",
5581
5444
  "commands",
5582
- "compile",
5583
- "doc",
5584
- "index.js"
5445
+ "face",
5446
+ "tag",
5447
+ "set.js"
5585
5448
  ]
5586
5449
  },
5587
- "compile:doc:list": {
5450
+ "team:tag:add": {
5588
5451
  "aliases": [],
5589
5452
  "args": {
5590
- "face_id": {
5591
- "description": "Face alias",
5592
- "name": "face_id",
5453
+ "team_id": {
5454
+ "description": "Team ID",
5455
+ "name": "team_id",
5593
5456
  "required": true
5594
5457
  }
5595
5458
  },
5596
- "description": "List documents for a face. Each document's full text is omitted unless --verbose, so a face with a real corpus stays readable. For a table of every source, documents and threads together, use face:sources.",
5459
+ "description": "Add tags to a team (appends, idempotent)",
5597
5460
  "flags": {
5598
5461
  "json": {
5599
5462
  "description": "Format output as json.",
@@ -5626,16 +5489,18 @@
5626
5489
  "multiple": false,
5627
5490
  "type": "option"
5628
5491
  },
5629
- "verbose": {
5630
- "description": "Include each document's full text",
5631
- "name": "verbose",
5632
- "allowNo": false,
5633
- "type": "boolean"
5492
+ "tag": {
5493
+ "description": "Tag to add (repeatable)",
5494
+ "name": "tag",
5495
+ "required": true,
5496
+ "hasDynamicHelp": false,
5497
+ "multiple": true,
5498
+ "type": "option"
5634
5499
  }
5635
5500
  },
5636
5501
  "hasDynamicHelp": false,
5637
5502
  "hiddenAliases": [],
5638
- "id": "compile:doc:list",
5503
+ "id": "team:tag:add",
5639
5504
  "pluginAlias": "faces-cli",
5640
5505
  "pluginName": "faces-cli",
5641
5506
  "pluginType": "core",
@@ -5645,21 +5510,21 @@
5645
5510
  "relativePath": [
5646
5511
  "dist",
5647
5512
  "commands",
5648
- "compile",
5649
- "doc",
5650
- "list.js"
5513
+ "team",
5514
+ "tag",
5515
+ "add.js"
5651
5516
  ]
5652
5517
  },
5653
- "compile:doc:make": {
5518
+ "team:tag:list": {
5654
5519
  "aliases": [],
5655
5520
  "args": {
5656
- "doc_id": {
5657
- "description": "Document ID",
5658
- "name": "doc_id",
5521
+ "team_id": {
5522
+ "description": "Team ID",
5523
+ "name": "team_id",
5659
5524
  "required": true
5660
5525
  }
5661
5526
  },
5662
- "description": "Compile an existing document (prepare + sync in one step)",
5527
+ "description": "List tags on a team",
5663
5528
  "flags": {
5664
5529
  "json": {
5665
5530
  "description": "Format output as json.",
@@ -5691,25 +5556,11 @@
5691
5556
  "hasDynamicHelp": false,
5692
5557
  "multiple": false,
5693
5558
  "type": "option"
5694
- },
5695
- "timeout": {
5696
- "description": "Compile timeout in seconds (default: 600)",
5697
- "name": "timeout",
5698
- "default": 600,
5699
- "hasDynamicHelp": false,
5700
- "multiple": false,
5701
- "type": "option"
5702
- },
5703
- "no-wait": {
5704
- "description": "Return immediately after triggering compilation. Prints the document ID for manual polling.",
5705
- "name": "no-wait",
5706
- "allowNo": false,
5707
- "type": "boolean"
5708
5559
  }
5709
5560
  },
5710
5561
  "hasDynamicHelp": false,
5711
5562
  "hiddenAliases": [],
5712
- "id": "compile:doc:make",
5563
+ "id": "team:tag:list",
5713
5564
  "pluginAlias": "faces-cli",
5714
5565
  "pluginName": "faces-cli",
5715
5566
  "pluginType": "core",
@@ -5719,21 +5570,26 @@
5719
5570
  "relativePath": [
5720
5571
  "dist",
5721
5572
  "commands",
5722
- "compile",
5723
- "doc",
5724
- "make.js"
5573
+ "team",
5574
+ "tag",
5575
+ "list.js"
5725
5576
  ]
5726
5577
  },
5727
- "compile:doc:pause": {
5578
+ "team:tag:remove": {
5728
5579
  "aliases": [],
5729
5580
  "args": {
5730
- "doc_id": {
5731
- "description": "Document ID",
5732
- "name": "doc_id",
5581
+ "team_id": {
5582
+ "description": "Team ID",
5583
+ "name": "team_id",
5584
+ "required": true
5585
+ },
5586
+ "tag": {
5587
+ "description": "Tag to remove",
5588
+ "name": "tag",
5733
5589
  "required": true
5734
5590
  }
5735
5591
  },
5736
- "description": "Ask a running document compilation to stop (preserves progress, resume with make). The compile stops at the next chunk boundary; this waits for it unless --no-wait.",
5592
+ "description": "Remove a tag from a team",
5737
5593
  "flags": {
5738
5594
  "json": {
5739
5595
  "description": "Format output as json.",
@@ -5765,25 +5621,11 @@
5765
5621
  "hasDynamicHelp": false,
5766
5622
  "multiple": false,
5767
5623
  "type": "option"
5768
- },
5769
- "no-wait": {
5770
- "description": "Return as soon as the pause is accepted, without waiting for the compile to stop.",
5771
- "name": "no-wait",
5772
- "allowNo": false,
5773
- "type": "boolean"
5774
- },
5775
- "timeout": {
5776
- "description": "Seconds to wait for the compile to stop (default: 60)",
5777
- "name": "timeout",
5778
- "default": 60,
5779
- "hasDynamicHelp": false,
5780
- "multiple": false,
5781
- "type": "option"
5782
5624
  }
5783
5625
  },
5784
5626
  "hasDynamicHelp": false,
5785
5627
  "hiddenAliases": [],
5786
- "id": "compile:doc:pause",
5628
+ "id": "team:tag:remove",
5787
5629
  "pluginAlias": "faces-cli",
5788
5630
  "pluginName": "faces-cli",
5789
5631
  "pluginType": "core",
@@ -5793,21 +5635,21 @@
5793
5635
  "relativePath": [
5794
5636
  "dist",
5795
5637
  "commands",
5796
- "compile",
5797
- "doc",
5798
- "pause.js"
5638
+ "team",
5639
+ "tag",
5640
+ "remove.js"
5799
5641
  ]
5800
5642
  },
5801
- "compile:doc:reset": {
5643
+ "team:tag:set": {
5802
5644
  "aliases": [],
5803
5645
  "args": {
5804
- "doc_id": {
5805
- "description": "Document ID",
5806
- "name": "doc_id",
5646
+ "team_id": {
5647
+ "description": "Team ID",
5648
+ "name": "team_id",
5807
5649
  "required": true
5808
5650
  }
5809
5651
  },
5810
- "description": "Reset document compilation progress (wipe extraction, keep content)",
5652
+ "description": "Replace all tags on a team",
5811
5653
  "flags": {
5812
5654
  "json": {
5813
5655
  "description": "Format output as json.",
@@ -5840,16 +5682,18 @@
5840
5682
  "multiple": false,
5841
5683
  "type": "option"
5842
5684
  },
5843
- "yes": {
5844
- "description": "Skip confirmation",
5845
- "name": "yes",
5846
- "allowNo": false,
5847
- "type": "boolean"
5685
+ "tag": {
5686
+ "description": "Tag to set (repeatable, replaces all)",
5687
+ "name": "tag",
5688
+ "required": true,
5689
+ "hasDynamicHelp": false,
5690
+ "multiple": true,
5691
+ "type": "option"
5848
5692
  }
5849
5693
  },
5850
5694
  "hasDynamicHelp": false,
5851
5695
  "hiddenAliases": [],
5852
- "id": "compile:doc:reset",
5696
+ "id": "team:tag:set",
5853
5697
  "pluginAlias": "faces-cli",
5854
5698
  "pluginName": "faces-cli",
5855
5699
  "pluginType": "core",
@@ -5859,21 +5703,21 @@
5859
5703
  "relativePath": [
5860
5704
  "dist",
5861
5705
  "commands",
5862
- "compile",
5863
- "doc",
5864
- "reset.js"
5706
+ "team",
5707
+ "tag",
5708
+ "set.js"
5865
5709
  ]
5866
5710
  },
5867
- "face:tag:add": {
5711
+ "compile:doc:create": {
5868
5712
  "aliases": [],
5869
5713
  "args": {
5870
- "alias": {
5714
+ "face_id": {
5871
5715
  "description": "Face alias",
5872
- "name": "alias",
5716
+ "name": "face_id",
5873
5717
  "required": true
5874
5718
  }
5875
5719
  },
5876
- "description": "Add tags to a face (appends, idempotent)",
5720
+ "description": "Submit a document to a face",
5877
5721
  "flags": {
5878
5722
  "json": {
5879
5723
  "description": "Format output as json.",
@@ -5906,18 +5750,50 @@
5906
5750
  "multiple": false,
5907
5751
  "type": "option"
5908
5752
  },
5909
- "tag": {
5910
- "description": "Tag to add (repeatable)",
5911
- "name": "tag",
5912
- "required": true,
5753
+ "label": {
5754
+ "description": "Document label/title",
5755
+ "name": "label",
5913
5756
  "hasDynamicHelp": false,
5914
- "multiple": true,
5757
+ "multiple": false,
5758
+ "type": "option"
5759
+ },
5760
+ "content": {
5761
+ "description": "Inline text content",
5762
+ "name": "content",
5763
+ "hasDynamicHelp": false,
5764
+ "multiple": false,
5765
+ "type": "option"
5766
+ },
5767
+ "file": {
5768
+ "description": "Read content from file",
5769
+ "name": "file",
5770
+ "hasDynamicHelp": false,
5771
+ "multiple": false,
5772
+ "type": "option"
5773
+ },
5774
+ "medium": {
5775
+ "description": "What sort of writing this is — e.g. email, text message, social post, essay, academic paper, blog post, legal document, thread reply, conversation (covers speech: transcripts, interviews, calls). Common synonyms fold automatically. Omit it if you do not know: a wrong declaration is worse than none, because a declaration is trusted and an absence is not.",
5776
+ "name": "medium",
5777
+ "hasDynamicHelp": false,
5778
+ "multiple": false,
5779
+ "type": "option"
5780
+ },
5781
+ "perspective": {
5782
+ "description": "Perspective (first-person or third-person)",
5783
+ "name": "perspective",
5784
+ "default": "first-person",
5785
+ "hasDynamicHelp": false,
5786
+ "multiple": false,
5787
+ "options": [
5788
+ "first-person",
5789
+ "third-person"
5790
+ ],
5915
5791
  "type": "option"
5916
5792
  }
5917
5793
  },
5918
5794
  "hasDynamicHelp": false,
5919
5795
  "hiddenAliases": [],
5920
- "id": "face:tag:add",
5796
+ "id": "compile:doc:create",
5921
5797
  "pluginAlias": "faces-cli",
5922
5798
  "pluginName": "faces-cli",
5923
5799
  "pluginType": "core",
@@ -5927,15 +5803,21 @@
5927
5803
  "relativePath": [
5928
5804
  "dist",
5929
5805
  "commands",
5930
- "face",
5931
- "tag",
5932
- "add.js"
5806
+ "compile",
5807
+ "doc",
5808
+ "create.js"
5933
5809
  ]
5934
5810
  },
5935
- "face:tag:all": {
5811
+ "compile:doc:delete": {
5936
5812
  "aliases": [],
5937
- "args": {},
5938
- "description": "List all tags across all your faces",
5813
+ "args": {
5814
+ "doc_id": {
5815
+ "description": "Document ID",
5816
+ "name": "doc_id",
5817
+ "required": true
5818
+ }
5819
+ },
5820
+ "description": "Delete a document",
5939
5821
  "flags": {
5940
5822
  "json": {
5941
5823
  "description": "Format output as json.",
@@ -5971,7 +5853,7 @@
5971
5853
  },
5972
5854
  "hasDynamicHelp": false,
5973
5855
  "hiddenAliases": [],
5974
- "id": "face:tag:all",
5856
+ "id": "compile:doc:delete",
5975
5857
  "pluginAlias": "faces-cli",
5976
5858
  "pluginName": "faces-cli",
5977
5859
  "pluginType": "core",
@@ -5981,21 +5863,21 @@
5981
5863
  "relativePath": [
5982
5864
  "dist",
5983
5865
  "commands",
5984
- "face",
5985
- "tag",
5986
- "all.js"
5866
+ "compile",
5867
+ "doc",
5868
+ "delete.js"
5987
5869
  ]
5988
5870
  },
5989
- "face:tag:list": {
5871
+ "compile:doc:edit": {
5990
5872
  "aliases": [],
5991
5873
  "args": {
5992
- "alias": {
5993
- "description": "Face alias",
5994
- "name": "alias",
5874
+ "doc_id": {
5875
+ "description": "Document ID",
5876
+ "name": "doc_id",
5995
5877
  "required": true
5996
5878
  }
5997
5879
  },
5998
- "description": "List tags on a face",
5880
+ "description": "Edit a document (label, content, or perspective)",
5999
5881
  "flags": {
6000
5882
  "json": {
6001
5883
  "description": "Format output as json.",
@@ -6012,26 +5894,65 @@
6012
5894
  "multiple": false,
6013
5895
  "type": "option"
6014
5896
  },
6015
- "token": {
6016
- "description": "JWT bearer token",
6017
- "env": "FACES_TOKEN",
6018
- "name": "token",
5897
+ "token": {
5898
+ "description": "JWT bearer token",
5899
+ "env": "FACES_TOKEN",
5900
+ "name": "token",
5901
+ "hasDynamicHelp": false,
5902
+ "multiple": false,
5903
+ "type": "option"
5904
+ },
5905
+ "api-key": {
5906
+ "description": "API key",
5907
+ "env": "FACES_API_KEY",
5908
+ "name": "api-key",
5909
+ "hasDynamicHelp": false,
5910
+ "multiple": false,
5911
+ "type": "option"
5912
+ },
5913
+ "label": {
5914
+ "description": "New label/title",
5915
+ "name": "label",
5916
+ "hasDynamicHelp": false,
5917
+ "multiple": false,
5918
+ "type": "option"
5919
+ },
5920
+ "content": {
5921
+ "description": "New inline text content",
5922
+ "name": "content",
5923
+ "hasDynamicHelp": false,
5924
+ "multiple": false,
5925
+ "type": "option"
5926
+ },
5927
+ "file": {
5928
+ "description": "Read new content from file",
5929
+ "name": "file",
5930
+ "hasDynamicHelp": false,
5931
+ "multiple": false,
5932
+ "type": "option"
5933
+ },
5934
+ "medium": {
5935
+ "description": "What sort of writing this is — e.g. email, text message, social post, essay, academic paper, blog post, legal document, thread reply, conversation (covers speech: transcripts, interviews, calls). Common synonyms fold automatically. Omit it if you do not know: a wrong declaration is worse than none, because a declaration is trusted and an absence is not.",
5936
+ "name": "medium",
6019
5937
  "hasDynamicHelp": false,
6020
5938
  "multiple": false,
6021
5939
  "type": "option"
6022
5940
  },
6023
- "api-key": {
6024
- "description": "API key",
6025
- "env": "FACES_API_KEY",
6026
- "name": "api-key",
5941
+ "perspective": {
5942
+ "description": "Perspective (first-person or third-person)",
5943
+ "name": "perspective",
6027
5944
  "hasDynamicHelp": false,
6028
5945
  "multiple": false,
5946
+ "options": [
5947
+ "first-person",
5948
+ "third-person"
5949
+ ],
6029
5950
  "type": "option"
6030
5951
  }
6031
5952
  },
6032
5953
  "hasDynamicHelp": false,
6033
5954
  "hiddenAliases": [],
6034
- "id": "face:tag:list",
5955
+ "id": "compile:doc:edit",
6035
5956
  "pluginAlias": "faces-cli",
6036
5957
  "pluginName": "faces-cli",
6037
5958
  "pluginType": "core",
@@ -6041,26 +5962,21 @@
6041
5962
  "relativePath": [
6042
5963
  "dist",
6043
5964
  "commands",
6044
- "face",
6045
- "tag",
6046
- "list.js"
5965
+ "compile",
5966
+ "doc",
5967
+ "edit.js"
6047
5968
  ]
6048
5969
  },
6049
- "face:tag:remove": {
5970
+ "compile:doc:get": {
6050
5971
  "aliases": [],
6051
5972
  "args": {
6052
- "alias": {
6053
- "description": "Face alias",
6054
- "name": "alias",
6055
- "required": true
6056
- },
6057
- "tag": {
6058
- "description": "Tag to remove",
6059
- "name": "tag",
5973
+ "doc_id": {
5974
+ "description": "Document ID",
5975
+ "name": "doc_id",
6060
5976
  "required": true
6061
5977
  }
6062
5978
  },
6063
- "description": "Remove a tag from a face",
5979
+ "description": "Get a document by ID",
6064
5980
  "flags": {
6065
5981
  "json": {
6066
5982
  "description": "Format output as json.",
@@ -6096,7 +6012,7 @@
6096
6012
  },
6097
6013
  "hasDynamicHelp": false,
6098
6014
  "hiddenAliases": [],
6099
- "id": "face:tag:remove",
6015
+ "id": "compile:doc:get",
6100
6016
  "pluginAlias": "faces-cli",
6101
6017
  "pluginName": "faces-cli",
6102
6018
  "pluginType": "core",
@@ -6106,21 +6022,25 @@
6106
6022
  "relativePath": [
6107
6023
  "dist",
6108
6024
  "commands",
6109
- "face",
6110
- "tag",
6111
- "remove.js"
6025
+ "compile",
6026
+ "doc",
6027
+ "get.js"
6112
6028
  ]
6113
6029
  },
6114
- "face:tag:set": {
6030
+ "compile:doc": {
6115
6031
  "aliases": [],
6116
6032
  "args": {
6117
- "alias": {
6033
+ "face_id": {
6118
6034
  "description": "Face alias",
6119
- "name": "alias",
6035
+ "name": "face_id",
6120
6036
  "required": true
6121
6037
  }
6122
6038
  },
6123
- "description": "Replace all tags on a face",
6039
+ "description": "Compile one or more documents into a face (create → make in one step). Repeat --file to submit several documents in a single command; each file becomes its own document rather than being concatenated.",
6040
+ "examples": [
6041
+ "<%= config.bin %> <%= command.id %> alice --file notes.txt",
6042
+ "<%= config.bin %> <%= command.id %> alice --file a.txt --file b.txt --file c.txt --no-wait --json"
6043
+ ],
6124
6044
  "flags": {
6125
6045
  "json": {
6126
6046
  "description": "Format output as json.",
@@ -6153,18 +6073,67 @@
6153
6073
  "multiple": false,
6154
6074
  "type": "option"
6155
6075
  },
6156
- "tag": {
6157
- "description": "Tag to set (repeatable, replaces all)",
6158
- "name": "tag",
6159
- "required": true,
6076
+ "label": {
6077
+ "description": "Document label/title (single document only; with several files each is labelled by its filename)",
6078
+ "name": "label",
6079
+ "hasDynamicHelp": false,
6080
+ "multiple": false,
6081
+ "type": "option"
6082
+ },
6083
+ "content": {
6084
+ "description": "Inline text content",
6085
+ "exclusive": [
6086
+ "file"
6087
+ ],
6088
+ "name": "content",
6089
+ "hasDynamicHelp": false,
6090
+ "multiple": false,
6091
+ "type": "option"
6092
+ },
6093
+ "file": {
6094
+ "description": "Read content from file (repeatable — each file becomes its own document)",
6095
+ "name": "file",
6160
6096
  "hasDynamicHelp": false,
6161
6097
  "multiple": true,
6162
6098
  "type": "option"
6099
+ },
6100
+ "medium": {
6101
+ "description": "What sort of writing this is — e.g. email, text message, social post, essay, academic paper, blog post, legal document, thread reply, conversation (covers speech: transcripts, interviews, calls). Common synonyms fold automatically. Omit it if you do not know: a wrong declaration is worse than none, because a declaration is trusted and an absence is not.",
6102
+ "name": "medium",
6103
+ "hasDynamicHelp": false,
6104
+ "multiple": false,
6105
+ "type": "option"
6106
+ },
6107
+ "perspective": {
6108
+ "description": "Perspective",
6109
+ "name": "perspective",
6110
+ "default": "first-person",
6111
+ "hasDynamicHelp": false,
6112
+ "multiple": false,
6113
+ "options": [
6114
+ "first-person",
6115
+ "third-person"
6116
+ ],
6117
+ "type": "option"
6118
+ },
6119
+ "timeout": {
6120
+ "description": "Compile timeout in seconds, per document (default: 600)",
6121
+ "name": "timeout",
6122
+ "default": 600,
6123
+ "hasDynamicHelp": false,
6124
+ "multiple": false,
6125
+ "type": "option"
6126
+ },
6127
+ "no-wait": {
6128
+ "description": "Create and trigger compilation, then return immediately without polling.",
6129
+ "name": "no-wait",
6130
+ "allowNo": false,
6131
+ "type": "boolean"
6163
6132
  }
6164
6133
  },
6165
6134
  "hasDynamicHelp": false,
6166
6135
  "hiddenAliases": [],
6167
- "id": "face:tag:set",
6136
+ "id": "compile:doc",
6168
6137
  "pluginAlias": "faces-cli",
6169
6138
  "pluginName": "faces-cli",
6170
6139
  "pluginType": "core",
@@ -6174,21 +6143,21 @@
6174
6143
  "relativePath": [
6175
6144
  "dist",
6176
6145
  "commands",
6177
- "face",
6178
- "tag",
6179
- "set.js"
6146
+ "compile",
6147
+ "doc",
6148
+ "index.js"
6180
6149
  ]
6181
6150
  },
6182
- "team:tag:add": {
6151
+ "compile:doc:list": {
6183
6152
  "aliases": [],
6184
6153
  "args": {
6185
- "team_id": {
6186
- "description": "Team ID",
6187
- "name": "team_id",
6154
+ "face_id": {
6155
+ "description": "Face alias",
6156
+ "name": "face_id",
6188
6157
  "required": true
6189
6158
  }
6190
6159
  },
6191
- "description": "Add tags to a team (appends, idempotent)",
6160
+ "description": "List documents for a face. Each document's full text is omitted unless --verbose, so a face with a real corpus stays readable. For a table of every source, documents and threads together, use face:sources.",
6192
6161
  "flags": {
6193
6162
  "json": {
6194
6163
  "description": "Format output as json.",
@@ -6221,18 +6190,16 @@
6221
6190
  "multiple": false,
6222
6191
  "type": "option"
6223
6192
  },
6224
- "tag": {
6225
- "description": "Tag to add (repeatable)",
6226
- "name": "tag",
6227
- "required": true,
6228
- "hasDynamicHelp": false,
6229
- "multiple": true,
6230
- "type": "option"
6193
+ "verbose": {
6194
+ "description": "Include each document's full text",
6195
+ "name": "verbose",
6196
+ "allowNo": false,
6197
+ "type": "boolean"
6231
6198
  }
6232
6199
  },
6233
6200
  "hasDynamicHelp": false,
6234
6201
  "hiddenAliases": [],
6235
- "id": "team:tag:add",
6202
+ "id": "compile:doc:list",
6236
6203
  "pluginAlias": "faces-cli",
6237
6204
  "pluginName": "faces-cli",
6238
6205
  "pluginType": "core",
@@ -6242,21 +6209,21 @@
6242
6209
  "relativePath": [
6243
6210
  "dist",
6244
6211
  "commands",
6245
- "team",
6246
- "tag",
6247
- "add.js"
6212
+ "compile",
6213
+ "doc",
6214
+ "list.js"
6248
6215
  ]
6249
6216
  },
6250
- "team:tag:list": {
6217
+ "compile:doc:make": {
6251
6218
  "aliases": [],
6252
6219
  "args": {
6253
- "team_id": {
6254
- "description": "Team ID",
6255
- "name": "team_id",
6220
+ "doc_id": {
6221
+ "description": "Document ID",
6222
+ "name": "doc_id",
6256
6223
  "required": true
6257
6224
  }
6258
6225
  },
6259
- "description": "List tags on a team",
6226
+ "description": "Compile an existing document (prepare + sync in one step)",
6260
6227
  "flags": {
6261
6228
  "json": {
6262
6229
  "description": "Format output as json.",
@@ -6288,11 +6255,25 @@
6288
6255
  "hasDynamicHelp": false,
6289
6256
  "multiple": false,
6290
6257
  "type": "option"
6258
+ },
6259
+ "timeout": {
6260
+ "description": "Compile timeout in seconds (default: 600)",
6261
+ "name": "timeout",
6262
+ "default": 600,
6263
+ "hasDynamicHelp": false,
6264
+ "multiple": false,
6265
+ "type": "option"
6266
+ },
6267
+ "no-wait": {
6268
+ "description": "Return immediately after triggering compilation. Prints the document ID for manual polling.",
6269
+ "name": "no-wait",
6270
+ "allowNo": false,
6271
+ "type": "boolean"
6291
6272
  }
6292
6273
  },
6293
6274
  "hasDynamicHelp": false,
6294
6275
  "hiddenAliases": [],
6295
- "id": "team:tag:list",
6276
+ "id": "compile:doc:make",
6296
6277
  "pluginAlias": "faces-cli",
6297
6278
  "pluginName": "faces-cli",
6298
6279
  "pluginType": "core",
@@ -6302,26 +6283,21 @@
6302
6283
  "relativePath": [
6303
6284
  "dist",
6304
6285
  "commands",
6305
- "team",
6306
- "tag",
6307
- "list.js"
6286
+ "compile",
6287
+ "doc",
6288
+ "make.js"
6308
6289
  ]
6309
6290
  },
6310
- "team:tag:remove": {
6291
+ "compile:doc:pause": {
6311
6292
  "aliases": [],
6312
6293
  "args": {
6313
- "team_id": {
6314
- "description": "Team ID",
6315
- "name": "team_id",
6316
- "required": true
6317
- },
6318
- "tag": {
6319
- "description": "Tag to remove",
6320
- "name": "tag",
6294
+ "doc_id": {
6295
+ "description": "Document ID",
6296
+ "name": "doc_id",
6321
6297
  "required": true
6322
6298
  }
6323
6299
  },
6324
- "description": "Remove a tag from a team",
6300
+ "description": "Ask a running document compilation to stop (preserves progress, resume with make). The compile stops at the next chunk boundary; this waits for it unless --no-wait.",
6325
6301
  "flags": {
6326
6302
  "json": {
6327
6303
  "description": "Format output as json.",
@@ -6353,11 +6329,25 @@
6353
6329
  "hasDynamicHelp": false,
6354
6330
  "multiple": false,
6355
6331
  "type": "option"
6332
+ },
6333
+ "no-wait": {
6334
+ "description": "Return as soon as the pause is accepted, without waiting for the compile to stop.",
6335
+ "name": "no-wait",
6336
+ "allowNo": false,
6337
+ "type": "boolean"
6338
+ },
6339
+ "timeout": {
6340
+ "description": "Seconds to wait for the compile to stop (default: 60)",
6341
+ "name": "timeout",
6342
+ "default": 60,
6343
+ "hasDynamicHelp": false,
6344
+ "multiple": false,
6345
+ "type": "option"
6356
6346
  }
6357
6347
  },
6358
6348
  "hasDynamicHelp": false,
6359
6349
  "hiddenAliases": [],
6360
- "id": "team:tag:remove",
6350
+ "id": "compile:doc:pause",
6361
6351
  "pluginAlias": "faces-cli",
6362
6352
  "pluginName": "faces-cli",
6363
6353
  "pluginType": "core",
@@ -6367,21 +6357,21 @@
6367
6357
  "relativePath": [
6368
6358
  "dist",
6369
6359
  "commands",
6370
- "team",
6371
- "tag",
6372
- "remove.js"
6360
+ "compile",
6361
+ "doc",
6362
+ "pause.js"
6373
6363
  ]
6374
6364
  },
6375
- "team:tag:set": {
6365
+ "compile:doc:reset": {
6376
6366
  "aliases": [],
6377
6367
  "args": {
6378
- "team_id": {
6379
- "description": "Team ID",
6380
- "name": "team_id",
6368
+ "doc_id": {
6369
+ "description": "Document ID",
6370
+ "name": "doc_id",
6381
6371
  "required": true
6382
6372
  }
6383
6373
  },
6384
- "description": "Replace all tags on a team",
6374
+ "description": "Reset document compilation progress (wipe extraction, keep content)",
6385
6375
  "flags": {
6386
6376
  "json": {
6387
6377
  "description": "Format output as json.",
@@ -6414,18 +6404,16 @@
6414
6404
  "multiple": false,
6415
6405
  "type": "option"
6416
6406
  },
6417
- "tag": {
6418
- "description": "Tag to set (repeatable, replaces all)",
6419
- "name": "tag",
6420
- "required": true,
6421
- "hasDynamicHelp": false,
6422
- "multiple": true,
6423
- "type": "option"
6407
+ "yes": {
6408
+ "description": "Skip confirmation",
6409
+ "name": "yes",
6410
+ "allowNo": false,
6411
+ "type": "boolean"
6424
6412
  }
6425
6413
  },
6426
6414
  "hasDynamicHelp": false,
6427
6415
  "hiddenAliases": [],
6428
- "id": "team:tag:set",
6416
+ "id": "compile:doc:reset",
6429
6417
  "pluginAlias": "faces-cli",
6430
6418
  "pluginName": "faces-cli",
6431
6419
  "pluginType": "core",
@@ -6435,9 +6423,9 @@
6435
6423
  "relativePath": [
6436
6424
  "dist",
6437
6425
  "commands",
6438
- "team",
6439
- "tag",
6440
- "set.js"
6426
+ "compile",
6427
+ "doc",
6428
+ "reset.js"
6441
6429
  ]
6442
6430
  },
6443
6431
  "compile:thread:create": {
@@ -7123,5 +7111,5 @@
7123
7111
  ]
7124
7112
  }
7125
7113
  },
7126
- "version": "1.8.0"
7114
+ "version": "1.8.1"
7127
7115
  }