@greatwait/cli 0.1.0-alpha.4 → 0.1.0-alpha.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/catalog.js CHANGED
@@ -80,37 +80,37 @@ export function declaredRequestHeaders(operation) {
80
80
  /* -------------------------------------------------------------------------- */
81
81
  const API_URL = {
82
82
  flag: "--api-url",
83
- summary: "The service to talk to, when it is not the selected one.",
83
+ summary: "The GreatWait API to use, such as https://api.greatwait.dev. Defaults to the one you signed in to.",
84
84
  value: "<origin>",
85
85
  };
86
86
  const PAGE_OPTIONS = [
87
87
  {
88
88
  flag: "--limit",
89
- summary: "How many rows to ask for in one page.",
89
+ summary: "How many to show on one page.",
90
90
  value: "<count>",
91
91
  },
92
92
  {
93
93
  flag: "--cursor",
94
- summary: "Continue from the cursor a previous page returned.",
94
+ summary: "Carry on from here: the cursor the previous page printed.",
95
95
  value: "<cursor>",
96
96
  },
97
97
  {
98
98
  flag: "--all",
99
- summary: "Follow cursors until the collection ends, up to a published ceiling.",
99
+ summary: "Read up to 50 pages. If there are more, it prints a cursor to carry on from.",
100
100
  },
101
101
  ];
102
102
  const CONFIRM = {
103
103
  flag: "--yes",
104
- summary: "Confirm without being asked. Required when there is no terminal to ask on.",
104
+ summary: "Don't ask first. Needed in scripts, where nobody can answer.",
105
105
  };
106
106
  const IF_MATCH = {
107
107
  flag: "--if-match",
108
- summary: "Refuse unless it is still at this version. Read it first to get the ETag.",
108
+ summary: "Only change it if nobody else has since you read it. The ETag comes from the read command.",
109
109
  value: "<etag>",
110
110
  };
111
111
  const IDEMPOTENCY = {
112
112
  flag: "--idempotency-key",
113
- summary: "Make a repeat of this exact request a replay rather than a second.",
113
+ summary: "Any unique string. The command makes one up and prints it if you leave it out. Repeat it to retry safely: it runs once.",
114
114
  value: "<key>",
115
115
  };
116
116
  /* -------------------------------------------------------------------------- */
@@ -123,6 +123,137 @@ const IDEMPOTENCY = {
123
123
  * around, set up a destination, schedule something, watch it, then recover from
124
124
  * it. The groups are the headings.
125
125
  */
126
+ const MEMBER = {
127
+ name: "<member>",
128
+ summary: "The member's id, starting mem_, from members list.",
129
+ };
130
+ const INVITATION = {
131
+ name: "<invitation>",
132
+ summary: "The invitation's id, starting inv_, from invitations list.",
133
+ };
134
+ const PROJECT = {
135
+ name: "<project>",
136
+ summary: "The project's id, starting proj_, from whoami or members list.",
137
+ };
138
+ const MEMBER_RETRY_KEY = {
139
+ flag: "--idempotency-key",
140
+ summary: "Any unique string. The command makes one up and prints it if you leave it out. Repeat it to retry safely: the change happens once.",
141
+ value: "<key>",
142
+ };
143
+ /**
144
+ * The organization's people (W1-09). Listed after the project commands in
145
+ * help and in the reference, because managing who can see a project comes
146
+ * after having one.
147
+ */
148
+ export const MEMBER_COMMANDS = [
149
+ {
150
+ words: "members list",
151
+ group: "Members",
152
+ summary: "List the organization's members and the projects each can see.",
153
+ operations: ["members.list"],
154
+ positionals: [],
155
+ options: [API_URL],
156
+ },
157
+ {
158
+ words: "invitations list",
159
+ group: "Members",
160
+ summary: "List invitations, and whether each is pending, accepted, revoked or expired.",
161
+ operations: ["invitations.list"],
162
+ positionals: [],
163
+ options: [API_URL],
164
+ },
165
+ {
166
+ words: "invitations create",
167
+ group: "Members",
168
+ summary: "Invite someone to the organization by email.",
169
+ operations: ["invitations.create"],
170
+ positionals: [],
171
+ options: [
172
+ API_URL,
173
+ {
174
+ flag: "--email",
175
+ summary: "The address to send the invitation to.",
176
+ value: "<address>",
177
+ },
178
+ {
179
+ flag: "--role",
180
+ summary: "admin or member. Defaults to member. Admins can see every project and manage people.",
181
+ value: "<role>",
182
+ },
183
+ {
184
+ flag: "--projects",
185
+ summary: "The projects a member can see, as ids starting proj_, separated by commas. Not needed for admins, who see every project.",
186
+ value: "<ids>",
187
+ },
188
+ MEMBER_RETRY_KEY,
189
+ CONFIRM,
190
+ ],
191
+ confirms: true,
192
+ },
193
+ {
194
+ words: "invitations resend",
195
+ group: "Members",
196
+ summary: "Send a pending invitation's email again.",
197
+ operations: ["invitations.resend"],
198
+ positionals: [INVITATION],
199
+ options: [API_URL, MEMBER_RETRY_KEY, CONFIRM],
200
+ confirms: true,
201
+ },
202
+ {
203
+ words: "invitations revoke",
204
+ group: "Members",
205
+ summary: "Cancel a pending invitation, so its link stops working.",
206
+ operations: ["invitations.revoke"],
207
+ positionals: [INVITATION],
208
+ options: [API_URL, MEMBER_RETRY_KEY, CONFIRM],
209
+ confirms: true,
210
+ },
211
+ {
212
+ words: "members role",
213
+ group: "Members",
214
+ summary: "Make a member an admin, or an admin a member.",
215
+ operations: ["members.role"],
216
+ positionals: [MEMBER],
217
+ options: [
218
+ API_URL,
219
+ {
220
+ flag: "--role",
221
+ summary: "The new role: admin or member. Admins can see every project and manage people.",
222
+ value: "<role>",
223
+ },
224
+ MEMBER_RETRY_KEY,
225
+ CONFIRM,
226
+ ],
227
+ confirms: true,
228
+ },
229
+ {
230
+ words: "members remove",
231
+ group: "Members",
232
+ summary: "Remove someone from the organization.",
233
+ operations: ["members.remove"],
234
+ positionals: [MEMBER],
235
+ options: [API_URL, MEMBER_RETRY_KEY, CONFIRM],
236
+ confirms: true,
237
+ },
238
+ {
239
+ words: "members add-project",
240
+ group: "Members",
241
+ summary: "Let a member see a project.",
242
+ operations: ["projectmembers.add"],
243
+ positionals: [MEMBER, PROJECT],
244
+ options: [API_URL, MEMBER_RETRY_KEY, CONFIRM],
245
+ confirms: true,
246
+ },
247
+ {
248
+ words: "members remove-project",
249
+ group: "Members",
250
+ summary: "Stop a member seeing a project.",
251
+ operations: ["projectmembers.remove"],
252
+ positionals: [MEMBER, PROJECT],
253
+ options: [API_URL, MEMBER_RETRY_KEY, CONFIRM],
254
+ confirms: true,
255
+ },
256
+ ];
126
257
  export const COMMAND_CATALOG = [
127
258
  /* --- Session ---------------------------------------------------------- */
128
259
  {
@@ -132,11 +263,11 @@ export const COMMAND_CATALOG = [
132
263
  API_URL,
133
264
  {
134
265
  flag: "--api-key",
135
- summary: "Sign in with a scoped API credential instead of a browser. Takes no value: paste it when asked, or pipe it in.",
266
+ summary: "Sign in with an API key instead of a browser. Paste it when asked, or pipe it in. Create one on the dashboard's Access page.",
136
267
  },
137
268
  {
138
269
  flag: "--no-browser",
139
- summary: "Print the authorization address instead of opening it.",
270
+ summary: "Print the sign-in address instead of opening a browser, for a machine without one.",
140
271
  },
141
272
  {
142
273
  // **A way to ask for less than the whole command line can do.** The
@@ -146,12 +277,12 @@ export const COMMAND_CATALOG = [
146
277
  // there. Narrowing is safe in the direction that matters: a command
147
278
  // outside the grant is refused by the service.
148
279
  flag: "--scope",
149
- summary: "Ask for these permissions instead of everything the commands can use, separated by spaces in one argument.",
280
+ summary: 'Ask for fewer permissions than every command needs, such as "schedules:read schedules:write". One argument, separated by spaces.',
150
281
  value: "<scopes>",
151
282
  },
152
283
  ],
153
284
  positionals: [],
154
- summary: "Sign in to a Greatwait service and remember the credential.",
285
+ summary: "Sign in, in a browser or with an API key, and stay signed in.",
155
286
  words: "login",
156
287
  },
157
288
  {
@@ -159,7 +290,7 @@ export const COMMAND_CATALOG = [
159
290
  operations: [],
160
291
  options: [API_URL],
161
292
  positionals: [],
162
- summary: "Revoke the grant where possible and remove the local material.",
293
+ summary: "Sign out, and forget the credential stored on this machine.",
163
294
  words: "logout",
164
295
  },
165
296
  {
@@ -167,7 +298,7 @@ export const COMMAND_CATALOG = [
167
298
  operations: ["context.read"],
168
299
  options: [API_URL],
169
300
  positionals: [],
170
- summary: "Report which service, project and environment this acts in.",
301
+ summary: "Show which service, project and environment commands act in.",
171
302
  words: "whoami",
172
303
  },
173
304
  {
@@ -175,7 +306,7 @@ export const COMMAND_CATALOG = [
175
306
  operations: ["meta.version", "context.read"],
176
307
  options: [API_URL],
177
308
  positionals: [],
178
- summary: "Check the service, the stored configuration and the credential.",
309
+ summary: "Check that the service answers and the stored sign-in still works.",
179
310
  words: "doctor",
180
311
  },
181
312
  {
@@ -186,10 +317,10 @@ export const COMMAND_CATALOG = [
186
317
  {
187
318
  name: "[list | use <origin>]",
188
319
  optional: true,
189
- summary: "Show the signed-in services, or select one.",
320
+ summary: "list shows the services you're signed in to. use picks one by its address.",
190
321
  },
191
322
  ],
192
- summary: "Show or choose the service later commands go to.",
323
+ summary: "Show or choose which service commands go to.",
193
324
  words: "context",
194
325
  },
195
326
  {
@@ -197,7 +328,7 @@ export const COMMAND_CATALOG = [
197
328
  operations: [],
198
329
  options: [API_URL],
199
330
  positionals: [],
200
- summary: "Print the published first-value sequence and its commands.",
331
+ summary: "Print the steps from signing in to a delivered call, with the command for each.",
201
332
  words: "journey",
202
333
  },
203
334
  /* --- Destinations ----------------------------------------------------- */
@@ -206,7 +337,7 @@ export const COMMAND_CATALOG = [
206
337
  operations: ["endpoints.list"],
207
338
  options: [API_URL, ...PAGE_OPTIONS],
208
339
  positionals: [],
209
- summary: "List the destinations this project delivers to.",
340
+ summary: "List the addresses this project calls.",
210
341
  words: "destinations list",
211
342
  },
212
343
  {
@@ -214,24 +345,32 @@ export const COMMAND_CATALOG = [
214
345
  operations: ["endpoints.read"],
215
346
  options: [API_URL],
216
347
  positionals: [
217
- { name: "<destination>", summary: "The destination to read." },
348
+ {
349
+ name: "<destination>",
350
+ summary: "The destination's id, starting ep_, from destinations list or create.",
351
+ },
218
352
  ],
219
- summary: "Read one destination, its status and its signing keys.",
353
+ summary: "Show one destination: its address, status and signing keys.",
220
354
  words: "destinations read",
221
355
  },
222
356
  {
223
357
  group: "Destinations",
224
358
  operations: ["endpoints.create"],
225
359
  options: [
360
+ {
361
+ flag: "--headers",
362
+ summary: "Headers to send with every call, from @file.json or - for standard input. Keeps secret values out of your shell history.",
363
+ value: "<@file|->",
364
+ },
226
365
  API_URL,
227
366
  {
228
367
  flag: "--url",
229
- summary: "The https receiver Greatwait will deliver to.",
368
+ summary: "The https address to call.",
230
369
  value: "<https url>",
231
370
  },
232
371
  ],
233
372
  positionals: [],
234
- summary: "Create a destination and print its signing key once.",
373
+ summary: "Add an address to call, and print its signing secret. This is the only time it's printed.",
235
374
  words: "destinations create",
236
375
  },
237
376
  {
@@ -239,19 +378,27 @@ export const COMMAND_CATALOG = [
239
378
  group: "Destinations",
240
379
  operations: ["endpoints.update"],
241
380
  options: [
381
+ {
382
+ flag: "--headers",
383
+ summary: "Headers to send with every call, from @file.json or - for standard input. Keeps secret values out of your shell history.",
384
+ value: "<@file|->",
385
+ },
242
386
  API_URL,
243
387
  {
244
388
  flag: "--url",
245
- summary: "The new https receiver.",
389
+ summary: "The new https address to call.",
246
390
  value: "<https url>",
247
391
  },
248
392
  IF_MATCH,
249
393
  CONFIRM,
250
394
  ],
251
395
  positionals: [
252
- { name: "<destination>", summary: "The destination to change." },
396
+ {
397
+ name: "<destination>",
398
+ summary: "The destination's id, starting ep_, from destinations list or create.",
399
+ },
253
400
  ],
254
- summary: "Point a destination at a different receiver.",
401
+ summary: "Change a destination's address or headers.",
255
402
  words: "destinations update",
256
403
  },
257
404
  {
@@ -266,9 +413,12 @@ export const COMMAND_CATALOG = [
266
413
  operations: ["endpoints.rotateSigningKey"],
267
414
  options: [API_URL, IF_MATCH, CONFIRM],
268
415
  positionals: [
269
- { name: "<destination>", summary: "The destination to rotate." },
416
+ {
417
+ name: "<destination>",
418
+ summary: "The destination's id, starting ep_, from destinations list or create.",
419
+ },
270
420
  ],
271
- summary: "Mint the next signing key, shown once, with a bounded overlap.",
421
+ summary: "Make a new signing secret and print it once. The old one keeps working for a while, so your receiver can switch over.",
272
422
  words: "destinations rotate-key",
273
423
  },
274
424
  {
@@ -280,9 +430,12 @@ export const COMMAND_CATALOG = [
280
430
  operations: ["endpoints.disable"],
281
431
  options: [API_URL, CONFIRM],
282
432
  positionals: [
283
- { name: "<destination>", summary: "The destination to disable." },
433
+ {
434
+ name: "<destination>",
435
+ summary: "The destination's id, starting ep_, from destinations list or create.",
436
+ },
284
437
  ],
285
- summary: "Stop delivering to a destination, keeping its history readable.",
438
+ summary: "Stop calling a destination. Its history stays readable.",
286
439
  words: "destinations disable",
287
440
  },
288
441
  {
@@ -293,9 +446,12 @@ export const COMMAND_CATALOG = [
293
446
  operations: ["endpoints.enable"],
294
447
  options: [API_URL],
295
448
  positionals: [
296
- { name: "<destination>", summary: "The destination to turn back on." },
449
+ {
450
+ name: "<destination>",
451
+ summary: "The destination's id, starting ep_, from destinations list or create.",
452
+ },
297
453
  ],
298
- summary: "Resume delivering to a destination that was disabled.",
454
+ summary: "Start calling a disabled destination again.",
299
455
  words: "destinations enable",
300
456
  },
301
457
  /* --- Schedules -------------------------------------------------------- */
@@ -306,21 +462,26 @@ export const COMMAND_CATALOG = [
306
462
  API_URL,
307
463
  {
308
464
  flag: "--endpoint",
309
- summary: "Only the schedules that deliver to this destination — everything pointed at it, in one listing.",
465
+ summary: "Only the schedules that call this destination. Its id starts ep_.",
310
466
  value: "<destination>",
311
467
  },
312
468
  ...PAGE_OPTIONS,
313
469
  ],
314
470
  positionals: [],
315
- summary: "List this project's schedules, or those delivering to one destination.",
471
+ summary: "List this project's schedules.",
316
472
  words: "schedules list",
317
473
  },
318
474
  {
319
475
  group: "Schedules",
320
476
  operations: ["schedules.read"],
321
477
  options: [API_URL],
322
- positionals: [{ name: "<schedule>", summary: "The schedule to read." }],
323
- summary: "Read a schedule, its recurrence, its version and its ETag.",
478
+ positionals: [
479
+ {
480
+ name: "<schedule>",
481
+ summary: "The schedule's id, starting sch_, from schedules create or schedules list.",
482
+ },
483
+ ],
484
+ summary: "Show a schedule: when it runs, its status, and the ETag for a safe change.",
324
485
  words: "schedules read",
325
486
  },
326
487
  {
@@ -330,53 +491,72 @@ export const COMMAND_CATALOG = [
330
491
  API_URL,
331
492
  {
332
493
  flag: "--endpoint",
333
- summary: "The destination to deliver to.",
494
+ summary: "The destination to call, by id, starting ep_. Or use --url instead.",
334
495
  value: "<destination>",
335
496
  },
497
+ {
498
+ flag: "--url",
499
+ summary: "The https address to call. Uses this project's destination there, or adds one.",
500
+ value: "<https url>",
501
+ },
336
502
  {
337
503
  flag: "--in",
338
- summary: "Once, after a delay: 30s, 5m, 2h, 1d.",
504
+ summary: "Call once, after this long: 30s, 5m, 2h or 1d.",
339
505
  value: "<duration>",
340
506
  },
341
507
  {
342
508
  flag: "--at",
343
- summary: "Once, at an instant in UTC.",
509
+ summary: "Call once, at this time, such as 2026-10-06T09:00:00Z.",
344
510
  value: "<instant>",
345
511
  },
346
512
  {
347
513
  flag: "--every",
348
- summary: "Repeatedly, at this interval: 30s, 5m, 2h, 1d.",
514
+ summary: "Call repeatedly, this far apart: 30s, 5m, 2h or 1d.",
349
515
  value: "<duration>",
350
516
  },
351
517
  {
352
518
  flag: "--cron",
353
- summary: "Repeatedly, on a cron expression.",
519
+ summary: 'Call repeatedly, on a cron expression such as "0 9 * * 1-5" (9:00, Monday to Friday).',
354
520
  value: "<expression>",
355
521
  },
356
522
  {
357
523
  flag: "--time-zone",
358
- summary: "The zone a cron expression is read in, so daylight saving moves the local time rather than the clock time. IANA names, such as Europe/London.",
524
+ summary: "The time zone --cron runs in, such as Europe/London, so 9:00 stays 9:00 through daylight saving. Defaults to UTC.",
359
525
  value: "<zone>",
360
526
  },
361
527
  {
362
528
  flag: "--partition-key",
363
- summary: "The fairness partition this belongs to.",
529
+ summary: "Your own label, such as a customer id. Each label is paced on its own, so one busy label can't hold up the rest. Can't be changed later.",
364
530
  value: "<key>",
365
531
  },
366
532
  {
367
533
  flag: "--latency-class",
368
- summary: "How promptly it must fire: realtime or bulk.",
534
+ summary: "realtime or bulk. realtime goes first when both are due. By default a call due within two minutes is realtime, and a repeating one is bulk.",
369
535
  value: "<class>",
370
536
  },
537
+ {
538
+ flag: "--http",
539
+ summary: "The call's method, body and headers, from @file.json or - for standard input. Keeps secret values out of your shell history.",
540
+ value: "<@file|->",
541
+ },
371
542
  {
372
543
  flag: "--data",
373
- summary: "The payload: JSON, @file.json, or - for standard input.",
544
+ summary: "JSON your receiver gets with the call. Inline, @file.json, or - for standard input.",
374
545
  value: "<json>",
375
546
  },
376
547
  IDEMPOTENCY,
548
+ {
549
+ flag: "--wait",
550
+ summary: "Wait for the first call and print how it went: delivered, or why not.",
551
+ },
552
+ {
553
+ flag: "--timeout",
554
+ summary: "How long --wait waits, such as 30s or 5m. Defaults to 3m.",
555
+ value: "<duration>",
556
+ },
377
557
  ],
378
558
  positionals: [],
379
- summary: "Schedule a delivery, once or repeatedly, and print the first occurrence.",
559
+ summary: "Schedule a call to an address, once or repeatedly. Prints the first call's id.",
380
560
  words: "schedules create",
381
561
  },
382
562
  {
@@ -387,70 +567,95 @@ export const COMMAND_CATALOG = [
387
567
  API_URL,
388
568
  {
389
569
  flag: "--endpoint",
390
- summary: "The destination to deliver to.",
570
+ summary: "The destination to call, by id, starting ep_. Or use --url instead.",
391
571
  value: "<destination>",
392
572
  },
573
+ {
574
+ flag: "--url",
575
+ summary: "The https address to call. Uses this project's destination there, or adds one.",
576
+ value: "<https url>",
577
+ },
393
578
  {
394
579
  flag: "--in",
395
- summary: "Once, after a delay: 30s, 5m, 2h, 1d.",
580
+ summary: "Call once, after this long: 30s, 5m, 2h or 1d.",
396
581
  value: "<duration>",
397
582
  },
398
583
  {
399
584
  flag: "--at",
400
- summary: "Once, at an instant in UTC.",
585
+ summary: "Call once, at this time, such as 2026-10-06T09:00:00Z.",
401
586
  value: "<instant>",
402
587
  },
403
588
  {
404
589
  flag: "--every",
405
- summary: "Repeatedly, at this interval: 30s, 5m, 2h, 1d.",
590
+ summary: "Call repeatedly, this far apart: 30s, 5m, 2h or 1d.",
406
591
  value: "<duration>",
407
592
  },
408
593
  {
409
594
  flag: "--cron",
410
- summary: "Repeatedly, on a cron expression.",
595
+ summary: 'Call repeatedly, on a cron expression such as "0 9 * * 1-5" (9:00, Monday to Friday).',
411
596
  value: "<expression>",
412
597
  },
413
598
  {
414
599
  flag: "--time-zone",
415
- summary: "The zone a cron expression is read in, so daylight saving moves the local time rather than the clock time. IANA names, such as Europe/London.",
600
+ summary: "The time zone --cron runs in, such as Europe/London, so 9:00 stays 9:00 through daylight saving. Defaults to UTC.",
416
601
  value: "<zone>",
417
602
  },
418
603
  {
419
604
  flag: "--partition-key",
420
- summary: "The fairness partition this belongs to.",
605
+ summary: "Your own label, such as a customer id. Each label is paced on its own, so one busy label can't hold up the rest. Can't be changed later.",
421
606
  value: "<key>",
422
607
  },
423
608
  {
424
609
  flag: "--latency-class",
425
- summary: "How promptly it must fire: realtime or bulk.",
610
+ summary: "realtime or bulk. realtime goes first when both are due. By default a call due within two minutes is realtime, and a repeating one is bulk.",
426
611
  value: "<class>",
427
612
  },
613
+ {
614
+ flag: "--http",
615
+ summary: "The call's method, body and headers, from @file.json or - for standard input. Keeps secret values out of your shell history.",
616
+ value: "<@file|->",
617
+ },
428
618
  {
429
619
  flag: "--data",
430
- summary: "The payload: JSON, @file.json, or - for standard input.",
620
+ summary: "JSON your receiver gets with the call. Inline, @file.json, or - for standard input.",
431
621
  value: "<json>",
432
622
  },
433
623
  IF_MATCH,
434
624
  CONFIRM,
435
625
  ],
436
- positionals: [{ name: "<schedule>", summary: "The schedule to replace." }],
437
- summary: "Replace a schedule's definition, discarding what it said before.",
626
+ positionals: [
627
+ {
628
+ name: "<schedule>",
629
+ summary: "The schedule's id, starting sch_, from schedules create or schedules list.",
630
+ },
631
+ ],
632
+ summary: "Change when a schedule runs. Its destination, data and HTTP settings stay unless you give new ones.",
438
633
  words: "schedules replace",
439
634
  },
440
635
  {
441
636
  group: "Schedules",
442
637
  operations: ["schedules.pause"],
443
638
  options: [API_URL, IF_MATCH],
444
- positionals: [{ name: "<schedule>", summary: "The schedule to pause." }],
445
- summary: "Stop firing a schedule without discarding it.",
639
+ positionals: [
640
+ {
641
+ name: "<schedule>",
642
+ summary: "The schedule's id, starting sch_, from schedules create or schedules list.",
643
+ },
644
+ ],
645
+ summary: "Stop a schedule's calls until you resume it.",
446
646
  words: "schedules pause",
447
647
  },
448
648
  {
449
649
  group: "Schedules",
450
650
  operations: ["schedules.resume"],
451
651
  options: [API_URL, IF_MATCH],
452
- positionals: [{ name: "<schedule>", summary: "The schedule to resume." }],
453
- summary: "Start a paused schedule firing again.",
652
+ positionals: [
653
+ {
654
+ name: "<schedule>",
655
+ summary: "The schedule's id, starting sch_, from schedules create or schedules list.",
656
+ },
657
+ ],
658
+ summary: "Start a paused schedule's calls again.",
454
659
  words: "schedules resume",
455
660
  },
456
661
  {
@@ -458,16 +663,26 @@ export const COMMAND_CATALOG = [
458
663
  group: "Schedules",
459
664
  operations: ["schedules.cancel"],
460
665
  options: [API_URL, IF_MATCH, CONFIRM],
461
- positionals: [{ name: "<schedule>", summary: "The schedule to cancel." }],
462
- summary: "Cancel a schedule and everything it had still to deliver.",
666
+ positionals: [
667
+ {
668
+ name: "<schedule>",
669
+ summary: "The schedule's id, starting sch_, from schedules create or schedules list.",
670
+ },
671
+ ],
672
+ summary: "Cancel a schedule and every call it hadn't made yet.",
463
673
  words: "schedules cancel",
464
674
  },
465
675
  {
466
676
  group: "Schedules",
467
677
  operations: ["schedules.archive"],
468
678
  options: [API_URL, IF_MATCH],
469
- positionals: [{ name: "<schedule>", summary: "The schedule to archive." }],
470
- summary: "Move a settled schedule out of the working list.",
679
+ positionals: [
680
+ {
681
+ name: "<schedule>",
682
+ summary: "The schedule's id, starting sch_, from schedules create or schedules list.",
683
+ },
684
+ ],
685
+ summary: "File a finished or cancelled schedule out of schedules list. It stays readable by id.",
471
686
  words: "schedules archive",
472
687
  },
473
688
  /* --- Data exports ---------------------------------------------------- */
@@ -476,23 +691,33 @@ export const COMMAND_CATALOG = [
476
691
  operations: ["exports.create"],
477
692
  options: [API_URL],
478
693
  positionals: [],
479
- summary: "Start a bounded export for this project and environment.",
694
+ summary: "Start exporting this project's records, as NDJSON files.",
480
695
  words: "exports create",
481
696
  },
482
697
  {
483
698
  group: "Data exports",
484
699
  operations: ["exports.read"],
485
700
  options: [API_URL],
486
- positionals: [{ name: "<export>", summary: "The export job to read." }],
487
- summary: "Read an export job's progress and cutoff.",
701
+ positionals: [
702
+ {
703
+ name: "<export>",
704
+ summary: "The export's id, starting exp_, from exports create.",
705
+ },
706
+ ],
707
+ summary: "Show how far an export has got, and the time its data runs up to.",
488
708
  words: "exports read",
489
709
  },
490
710
  {
491
711
  group: "Data exports",
492
712
  operations: ["exports.part"],
493
713
  options: [API_URL, PAGE_OPTIONS[0]],
494
- positionals: [{ name: "<export>", summary: "The export job to download." }],
495
- summary: "Print one bounded NDJSON export part for safe redirection to a file.",
714
+ positionals: [
715
+ {
716
+ name: "<export>",
717
+ summary: "The export's id, starting exp_, from exports create.",
718
+ },
719
+ ],
720
+ summary: "Print one part of a finished export. Redirect it to a file: > export.ndjson.",
496
721
  words: "exports part",
497
722
  },
498
723
  {
@@ -500,8 +725,13 @@ export const COMMAND_CATALOG = [
500
725
  group: "Data exports",
501
726
  operations: ["exports.cancel"],
502
727
  options: [API_URL, CONFIRM],
503
- positionals: [{ name: "<export>", summary: "The export job to cancel." }],
504
- summary: "Permanently cancel an export job.",
728
+ positionals: [
729
+ {
730
+ name: "<export>",
731
+ summary: "The export's id, starting exp_, from exports create.",
732
+ },
733
+ ],
734
+ summary: "Cancel an export. Its parts can't be downloaded afterwards.",
505
735
  words: "exports cancel",
506
736
  },
507
737
  /* --- Occurrences and attempts ----------------------------------------- */
@@ -513,11 +743,16 @@ export const COMMAND_CATALOG = [
513
743
  ...PAGE_OPTIONS,
514
744
  {
515
745
  flag: "--newest",
516
- summary: "Newest first, which is what a person looking at a schedule wants. A cursor belongs to the order it was issued under.",
746
+ summary: "Newest first. Use the same order when you carry on with --cursor.",
517
747
  },
518
748
  ],
519
- positionals: [{ name: "<schedule>", summary: "The schedule to list." }],
520
- summary: "List the retained occurrences of a schedule.",
749
+ positionals: [
750
+ {
751
+ name: "<schedule>",
752
+ summary: "The schedule's id, starting sch_, from schedules create or schedules list.",
753
+ },
754
+ ],
755
+ summary: "List a schedule's calls, one for each time it ran or will run.",
521
756
  words: "occurrences list",
522
757
  },
523
758
  {
@@ -525,10 +760,16 @@ export const COMMAND_CATALOG = [
525
760
  operations: ["occurrences.read"],
526
761
  options: [API_URL],
527
762
  positionals: [
528
- { name: "<schedule>", summary: "The schedule it belongs to." },
529
- { name: "<occurrence>", summary: "The occurrence to read." },
763
+ {
764
+ name: "<schedule>",
765
+ summary: "The schedule's id, starting sch_, from schedules create or schedules list.",
766
+ },
767
+ {
768
+ name: "<occurrence>",
769
+ summary: "The call's id, starting occ_, from schedules create or occurrences list.",
770
+ },
530
771
  ],
531
- summary: "Read one occurrence and the state it is in.",
772
+ summary: "Show one call and where it's got to.",
532
773
  words: "occurrences read",
533
774
  },
534
775
  {
@@ -538,15 +779,21 @@ export const COMMAND_CATALOG = [
538
779
  API_URL,
539
780
  {
540
781
  flag: "--timeout",
541
- summary: "Give up after this long instead of the published deadline.",
782
+ summary: "How long to wait, such as 30s or 5m. Defaults to 3m.",
542
783
  value: "<duration>",
543
784
  },
544
785
  ],
545
786
  positionals: [
546
- { name: "<schedule>", summary: "The schedule it belongs to." },
547
- { name: "<occurrence>", summary: "The occurrence to wait for." },
787
+ {
788
+ name: "<schedule>",
789
+ summary: "The schedule's id, starting sch_, from schedules create or schedules list.",
790
+ },
791
+ {
792
+ name: "<occurrence>",
793
+ summary: "The call's id, starting occ_, from schedules create or occurrences list.",
794
+ },
548
795
  ],
549
- summary: "Watch an occurrence until it settles, or until the deadline.",
796
+ summary: "Wait for a call to finish, then print how it went. Gives up after 3m unless --timeout says otherwise.",
550
797
  words: "occurrences wait",
551
798
  },
552
799
  {
@@ -555,10 +802,16 @@ export const COMMAND_CATALOG = [
555
802
  operations: ["occurrences.redeliver"],
556
803
  options: [API_URL, IDEMPOTENCY, CONFIRM],
557
804
  positionals: [
558
- { name: "<schedule>", summary: "The schedule it belongs to." },
559
- { name: "<occurrence>", summary: "The occurrence to send again." },
805
+ {
806
+ name: "<schedule>",
807
+ summary: "The schedule's id, starting sch_, from schedules create or schedules list.",
808
+ },
809
+ {
810
+ name: "<occurrence>",
811
+ summary: "The call's id, starting occ_, from schedules create or occurrences list.",
812
+ },
560
813
  ],
561
- summary: "Deliver an occurrence again to the destination it belongs to.",
814
+ summary: "Make a call again, to the same destination.",
562
815
  words: "occurrences redeliver",
563
816
  },
564
817
  {
@@ -566,10 +819,16 @@ export const COMMAND_CATALOG = [
566
819
  operations: ["attempts.list"],
567
820
  options: [API_URL, ...PAGE_OPTIONS],
568
821
  positionals: [
569
- { name: "<schedule>", summary: "The schedule it belongs to." },
570
- { name: "<occurrence>", summary: "The occurrence to list attempts for." },
822
+ {
823
+ name: "<schedule>",
824
+ summary: "The schedule's id, starting sch_, from schedules create or schedules list.",
825
+ },
826
+ {
827
+ name: "<occurrence>",
828
+ summary: "The call's id, starting occ_, from schedules create or occurrences list.",
829
+ },
571
830
  ],
572
- summary: "List every delivery attempt, with its diagnosis.",
831
+ summary: "List each try at a call, what your receiver answered, and why a failed one failed.",
573
832
  words: "attempts list",
574
833
  },
575
834
  {
@@ -577,11 +836,20 @@ export const COMMAND_CATALOG = [
577
836
  operations: ["attempts.read"],
578
837
  options: [API_URL],
579
838
  positionals: [
580
- { name: "<schedule>", summary: "The schedule it belongs to." },
581
- { name: "<occurrence>", summary: "The occurrence it belongs to." },
582
- { name: "<attempt>", summary: "The attempt to read." },
839
+ {
840
+ name: "<schedule>",
841
+ summary: "The schedule's id, starting sch_, from schedules create or schedules list.",
842
+ },
843
+ {
844
+ name: "<occurrence>",
845
+ summary: "The call's id, starting occ_, from schedules create or occurrences list.",
846
+ },
847
+ {
848
+ name: "<attempt>",
849
+ summary: "The attempt's id, starting att_, from attempts list.",
850
+ },
583
851
  ],
584
- summary: "Read one attempt in full, including what the receiver answered.",
852
+ summary: "Show one try at a call, including what your receiver answered.",
585
853
  words: "attempts read",
586
854
  },
587
855
  /* --- Planning --------------------------------------------------------- */
@@ -592,39 +860,55 @@ export const COMMAND_CATALOG = [
592
860
  API_URL,
593
861
  {
594
862
  flag: "--from",
595
- summary: "The start of the window, in UTC.",
863
+ summary: "Where the window starts, such as 2026-10-06T09:00:00Z.",
596
864
  value: "<instant>",
597
865
  },
598
866
  {
599
867
  flag: "--to",
600
- summary: "The end of the window, in UTC.",
868
+ summary: "Where the window ends, such as 2026-10-06T10:00:00Z.",
601
869
  value: "<instant>",
602
870
  },
603
871
  {
604
872
  flag: "--bucket",
605
- summary: "Bucket width in seconds.",
873
+ summary: "How many seconds each count covers.",
606
874
  value: "<seconds>",
607
875
  },
608
876
  {
609
877
  flag: "--breakdown",
610
- summary: "Group the counts by this dimension.",
878
+ summary: "partitionKey to split the counts by label, or none.",
611
879
  value: "<dimension>",
612
880
  },
613
881
  ],
614
882
  positionals: [],
615
- summary: "Show what is due in a window, and how fresh the answer is.",
883
+ summary: "Show how many calls are due in a window of time.",
616
884
  words: "forecast",
617
885
  },
886
+ {
887
+ group: "Planning",
888
+ operations: ["limits.read"],
889
+ options: [API_URL],
890
+ positionals: [],
891
+ summary: "Show the limits that apply to your organization.",
892
+ words: "limits show",
893
+ },
618
894
  {
619
895
  group: "Planning",
620
896
  operations: ["usage.read"],
621
897
  options: [
622
898
  API_URL,
623
- { flag: "--from", summary: "The first day, in UTC.", value: "<instant>" },
624
- { flag: "--to", summary: "The last day, in UTC.", value: "<instant>" },
899
+ {
900
+ flag: "--from",
901
+ summary: "The first day, such as 2026-10-01. Days are UTC.",
902
+ value: "<instant>",
903
+ },
904
+ {
905
+ flag: "--to",
906
+ summary: "The last day, such as 2026-10-06. Days are UTC.",
907
+ value: "<instant>",
908
+ },
625
909
  ],
626
910
  positionals: [],
627
- summary: "Show terminal occurrence volume by day.",
911
+ summary: "Show how many calls finished each day. For what you're billed, use billing ledger.",
628
912
  words: "usage",
629
913
  },
630
914
  {
@@ -632,7 +916,7 @@ export const COMMAND_CATALOG = [
632
916
  operations: ["billing.summary"],
633
917
  options: [API_URL],
634
918
  positionals: [],
635
- summary: "Show exact execution credit and effective billing state.",
919
+ summary: "Show your execution credit and billing status.",
636
920
  words: "billing",
637
921
  },
638
922
  {
@@ -640,7 +924,7 @@ export const COMMAND_CATALOG = [
640
924
  operations: ["billing.funding"],
641
925
  options: [API_URL],
642
926
  positionals: [],
643
- summary: "Show execution funding, automatic payment authority and payment outcomes.",
927
+ summary: "Show how execution credit is funded: automatic top-up, your monthly ceiling, and recent payments.",
644
928
  words: "billing funding",
645
929
  },
646
930
  {
@@ -648,7 +932,7 @@ export const COMMAND_CATALOG = [
648
932
  operations: ["billing.notices"],
649
933
  options: [API_URL, ...PAGE_OPTIONS],
650
934
  positionals: [],
651
- summary: "List persistent organization billing notices and delivery state.",
935
+ summary: "List billing notices, such as low credit, and whether each was emailed.",
652
936
  words: "billing notices",
653
937
  },
654
938
  {
@@ -656,7 +940,7 @@ export const COMMAND_CATALOG = [
656
940
  operations: ["billing.notificationsettings"],
657
941
  options: [API_URL],
658
942
  positionals: [],
659
- summary: "Show billing notification policy and its revision.",
943
+ summary: "Show which billing emails you get, and when.",
660
944
  words: "billing notification-settings",
661
945
  },
662
946
  {
@@ -667,24 +951,24 @@ export const COMMAND_CATALOG = [
667
951
  API_URL,
668
952
  {
669
953
  flag: "--low-credit",
670
- summary: "Send the low-credit notice below this exact USD amount.",
671
- value: "<dollars>",
954
+ summary: "Warn when credit falls below this many dollars, or auto for a fifth of your last top-up. Leave it out to keep the current setting.",
955
+ value: "<dollars|auto>",
672
956
  },
673
957
  {
674
958
  flag: "--noncritical-email",
675
- summary: "Enable or disable email for noncritical notices.",
959
+ summary: "on or off: email for notices that need no action.",
676
960
  value: "<on|off>",
677
961
  },
678
962
  {
679
963
  flag: "--expected-revision",
680
- summary: "Refuse if notification settings have changed.",
964
+ summary: "Only change it if nobody else has since you read it. The revision comes from billing notification-settings.",
681
965
  value: "<revision>",
682
966
  },
683
967
  IDEMPOTENCY,
684
968
  CONFIRM,
685
969
  ],
686
970
  positionals: [],
687
- summary: "Update optional billing notifications with approval.",
971
+ summary: "Change which billing emails you get.",
688
972
  words: "billing update-notifications",
689
973
  },
690
974
  {
@@ -694,12 +978,12 @@ export const COMMAND_CATALOG = [
694
978
  API_URL,
695
979
  {
696
980
  flag: "--credit",
697
- summary: "Execution credit to buy in USD, at least 10.",
981
+ summary: "How many dollars of credit to buy. At least 10.",
698
982
  value: "<dollars>",
699
983
  },
700
984
  ],
701
985
  positionals: [],
702
- summary: "Preview manual execution funding before tax is calculated at checkout.",
986
+ summary: "Price a credit purchase before you buy. Tax is added at checkout.",
703
987
  words: "billing quote-funding",
704
988
  },
705
989
  {
@@ -710,14 +994,14 @@ export const COMMAND_CATALOG = [
710
994
  API_URL,
711
995
  {
712
996
  flag: "--quote",
713
- summary: "The exact object returned by quote-funding (the data field in JSON output).",
997
+ summary: "The quote from billing quote-funding --json: its data field, inline, @file.json, or - for standard input.",
714
998
  value: "<json|@file|->",
715
999
  },
716
1000
  IDEMPOTENCY,
717
1001
  CONFIRM,
718
1002
  ],
719
1003
  positionals: [],
720
- summary: "Confirm a manual execution-credit purchase with a stable retry key.",
1004
+ summary: "Buy the credit a quote priced, and print the link to pay.",
721
1005
  words: "billing purchase",
722
1006
  },
723
1007
  {
@@ -728,19 +1012,19 @@ export const COMMAND_CATALOG = [
728
1012
  API_URL,
729
1013
  {
730
1014
  flag: "--ceiling",
731
- summary: "Set the UTC-month automatic payment ceiling in USD, or turn it off.",
1015
+ summary: "The most automatic payments may charge in a calendar month, in dollars, or off.",
732
1016
  value: "<dollars|off>",
733
1017
  },
734
1018
  {
735
1019
  flag: "--expected-revision",
736
- summary: "Refuse if automatic payment authority has changed.",
1020
+ summary: "Only change it if nobody else has since you read it. The revision comes from billing funding.",
737
1021
  value: "<revision>",
738
1022
  },
739
1023
  IDEMPOTENCY,
740
1024
  CONFIRM,
741
1025
  ],
742
1026
  positionals: [],
743
- summary: "Set exact automatic payment authority with approval.",
1027
+ summary: "Set the most automatic payments may charge each month.",
744
1028
  words: "billing ceiling",
745
1029
  },
746
1030
  {
@@ -750,32 +1034,32 @@ export const COMMAND_CATALOG = [
750
1034
  API_URL,
751
1035
  {
752
1036
  flag: "--action",
753
- summary: "Preview enabling, editing, disabling or resuming the rule.",
1037
+ summary: "What to preview: enable, edit, disable or resume.",
754
1038
  value: "<enable|edit|disable|resume>",
755
1039
  },
756
1040
  {
757
1041
  flag: "--credit",
758
- summary: "Fixed execution credit purchased by enable or edit, in USD.",
1042
+ summary: "How many dollars of credit each top-up buys.",
759
1043
  value: "<dollars>",
760
1044
  },
761
1045
  {
762
1046
  flag: "--trigger-below",
763
- summary: "Trigger when usable execution credit is below this USD amount.",
1047
+ summary: "Top up when credit falls below this many dollars.",
764
1048
  value: "<dollars>",
765
1049
  },
766
1050
  {
767
1051
  flag: "--ceiling",
768
- summary: "Gross automatic-payment ceiling per UTC month, in USD.",
1052
+ summary: "The most top-ups may charge in a calendar month, in dollars.",
769
1053
  value: "<dollars>",
770
1054
  },
771
1055
  {
772
1056
  flag: "--expected-revision",
773
- summary: "Refuse if automatic payment authority has changed.",
1057
+ summary: "Only change it if nobody else has since you read it. The revision comes from billing funding.",
774
1058
  value: "<revision>",
775
1059
  },
776
1060
  ],
777
1061
  positionals: [],
778
- summary: "Preview one exact automatic top-up rule without enabling it.",
1062
+ summary: "Preview an automatic top-up change. Nothing changes until billing apply-topup.",
779
1063
  words: "billing preview-topup",
780
1064
  },
781
1065
  {
@@ -786,14 +1070,14 @@ export const COMMAND_CATALOG = [
786
1070
  API_URL,
787
1071
  {
788
1072
  flag: "--preview",
789
- summary: "The exact object returned by preview-topup (the data field in JSON output).",
1073
+ summary: "The preview from billing preview-topup --json: its data field, inline, @file.json, or - for standard input.",
790
1074
  value: "<json|@file|->",
791
1075
  },
792
1076
  IDEMPOTENCY,
793
1077
  CONFIRM,
794
1078
  ],
795
1079
  positionals: [],
796
- summary: "Confirm an automatic top-up preview with a stable retry key.",
1080
+ summary: "Turn on, change or stop automatic top-up, as a preview described.",
797
1081
  words: "billing apply-topup",
798
1082
  },
799
1083
  {
@@ -804,24 +1088,24 @@ export const COMMAND_CATALOG = [
804
1088
  API_URL,
805
1089
  {
806
1090
  flag: "--payment-operation",
807
- summary: "The paid funding operation to review.",
1091
+ summary: "The payment to refund from, from billing payment-history.",
808
1092
  value: "<operation>",
809
1093
  },
810
1094
  {
811
1095
  flag: "--amount",
812
- summary: "Unused purchased credit requested in USD.",
1096
+ summary: "How many dollars of unused credit to refund.",
813
1097
  value: "<dollars>",
814
1098
  },
815
1099
  {
816
1100
  flag: "--reason",
817
- summary: "Why an operator should review the request.",
1101
+ summary: "Why you're asking for the refund.",
818
1102
  value: "<text>",
819
1103
  },
820
1104
  IDEMPOTENCY,
821
1105
  CONFIRM,
822
1106
  ],
823
1107
  positionals: [],
824
- summary: "Record a request for operator-reviewed unused-credit refund.",
1108
+ summary: "Ask for unused credit back. The credit is held until the refund is decided.",
825
1109
  words: "billing refund-request",
826
1110
  },
827
1111
  {
@@ -832,34 +1116,34 @@ export const COMMAND_CATALOG = [
832
1116
  API_URL,
833
1117
  {
834
1118
  flag: "--refund-request",
835
- summary: "The pending refund request an external operator reviewed.",
1119
+ summary: "The refund request to decide, from billing refund-request.",
836
1120
  value: "<request>",
837
1121
  },
838
1122
  {
839
1123
  flag: "--decision",
840
- summary: "Record the external review outcome.",
1124
+ summary: "completed, for a refund already made in Stripe, or declined, which releases the held credit.",
841
1125
  value: "<completed|declined>",
842
1126
  },
843
1127
  {
844
1128
  flag: "--provider-refund",
845
- summary: "Existing Stripe refund ID required for completion.",
1129
+ summary: "The Stripe refund's id, starting re_. Needed for completed.",
846
1130
  value: "<re_...>",
847
1131
  },
848
1132
  {
849
1133
  flag: "--gross",
850
- summary: "Existing provider refund gross amount in USD.",
1134
+ summary: "The Stripe refund's total, in dollars.",
851
1135
  value: "<dollars>",
852
1136
  },
853
1137
  {
854
1138
  flag: "--tax",
855
- summary: "Tax included in the existing provider refund in USD.",
1139
+ summary: "The tax within that total, in dollars.",
856
1140
  value: "<dollars>",
857
1141
  },
858
1142
  IDEMPOTENCY,
859
1143
  CONFIRM,
860
1144
  ],
861
1145
  positionals: [],
862
- summary: "Record a completed or declined external refund review.",
1146
+ summary: "Record whether a refund request was paid in Stripe or declined.",
863
1147
  words: "billing resolve-refund",
864
1148
  },
865
1149
  {
@@ -870,24 +1154,24 @@ export const COMMAND_CATALOG = [
870
1154
  API_URL,
871
1155
  {
872
1156
  flag: "--advisory-budget",
873
- summary: "Set the monthly advisory amount in USD, or turn it off.",
1157
+ summary: "A monthly amount, in dollars, that warns you when spending passes it, or off.",
874
1158
  value: "<dollars|off>",
875
1159
  },
876
1160
  {
877
1161
  flag: "--hard-cap",
878
- summary: "Set the monthly hard cap in USD, or turn it off.",
1162
+ summary: "A monthly amount, in dollars, that stops calls when spending reaches it, or off.",
879
1163
  value: "<dollars|off>",
880
1164
  },
881
1165
  {
882
1166
  flag: "--expected-revision",
883
- summary: "Refuse if the budget policy has changed since this revision.",
1167
+ summary: "Only change it if nobody else has since you read it. The revision comes from billing.",
884
1168
  value: "<revision>",
885
1169
  },
886
1170
  IDEMPOTENCY,
887
1171
  CONFIRM,
888
1172
  ],
889
1173
  positionals: [],
890
- summary: "Set exact monthly execution budgets with approval.",
1174
+ summary: "Set a monthly budget that warns you, a cap that stops calls, or both.",
891
1175
  words: "billing budgets",
892
1176
  },
893
1177
  {
@@ -895,7 +1179,7 @@ export const COMMAND_CATALOG = [
895
1179
  operations: ["billing.projects"],
896
1180
  options: [API_URL],
897
1181
  positionals: [],
898
- summary: "Show named project access, payment recovery and monthly fees.",
1182
+ summary: "Show each project's monthly fee and whether it's paid up.",
899
1183
  words: "billing projects",
900
1184
  },
901
1185
  {
@@ -905,22 +1189,22 @@ export const COMMAND_CATALOG = [
905
1189
  API_URL,
906
1190
  {
907
1191
  flag: "--action",
908
- summary: "Preview an addition, cancellation or included transfer.",
1192
+ summary: "add a paid project, cancel one, or transfer-included to move your included project.",
909
1193
  value: "<add|cancel|transfer-included>",
910
1194
  },
911
1195
  {
912
1196
  flag: "--target-project",
913
- summary: "The named project whose billing changes.",
1197
+ summary: "The project's id, starting proj_, from billing projects.",
914
1198
  value: "<project>",
915
1199
  },
916
1200
  {
917
1201
  flag: "--from-project",
918
- summary: "The former included project for a transfer.",
1202
+ summary: "For transfer-included, the project that's included now.",
919
1203
  value: "<project>",
920
1204
  },
921
1205
  ],
922
1206
  positionals: [],
923
- summary: "Preview a named project billing change without authorizing payment.",
1207
+ summary: "Price a change to which projects you pay for. Nothing changes until billing change-project.",
924
1208
  words: "billing quote-project",
925
1209
  },
926
1210
  {
@@ -931,14 +1215,14 @@ export const COMMAND_CATALOG = [
931
1215
  API_URL,
932
1216
  {
933
1217
  flag: "--quote",
934
- summary: "The exact quote object returned by quote-project (the data field in JSON output).",
1218
+ summary: "The quote from billing quote-project --json: its data field, inline, @file.json, or - for standard input.",
935
1219
  value: "<json|@file|->",
936
1220
  },
937
1221
  IDEMPOTENCY,
938
1222
  CONFIRM,
939
1223
  ],
940
1224
  positionals: [],
941
- summary: "Confirm an exact project billing quote with a stable retry key.",
1225
+ summary: "Make the project change a quote priced.",
942
1226
  words: "billing change-project",
943
1227
  },
944
1228
  {
@@ -947,15 +1231,65 @@ export const COMMAND_CATALOG = [
947
1231
  operations: ["billing.portal"],
948
1232
  options: [API_URL, CONFIRM],
949
1233
  positionals: [],
950
- summary: "Create a hosted payment-method and invoice recovery link.",
1234
+ summary: "Print a link to Stripe's billing portal, to update your card or pay an invoice.",
951
1235
  words: "billing portal",
952
1236
  },
1237
+ {
1238
+ group: "Planning",
1239
+ operations: ["billing.paymentmethod"],
1240
+ options: [API_URL],
1241
+ positionals: [],
1242
+ summary: "Show the card or other payment method that top-ups and project fees are charged to.",
1243
+ words: "billing payment-method",
1244
+ },
1245
+ {
1246
+ group: "Planning",
1247
+ operations: ["billing.invoices"],
1248
+ options: [API_URL],
1249
+ positionals: [],
1250
+ summary: "List recent project fee charges, newest first, with links to their receipts.",
1251
+ words: "billing invoices",
1252
+ },
1253
+ {
1254
+ group: "Planning",
1255
+ operations: ["billing.paymenthistory"],
1256
+ options: [API_URL, ...PAGE_OPTIONS],
1257
+ positionals: [],
1258
+ summary: "List credit purchases and top-ups, newest first.",
1259
+ words: "billing payment-history",
1260
+ },
1261
+ {
1262
+ group: "Planning",
1263
+ operations: ["billing.invoicehistory"],
1264
+ options: [API_URL, ...PAGE_OPTIONS],
1265
+ positionals: [],
1266
+ summary: "List every project fee charge, newest first, page by page.",
1267
+ words: "billing invoice-history",
1268
+ },
1269
+ {
1270
+ confirms: true,
1271
+ group: "Planning",
1272
+ operations: ["billing.paymentmethodsetup"],
1273
+ options: [API_URL, CONFIRM],
1274
+ positionals: [],
1275
+ summary: "Print a link to add a card, or replace the one you have.",
1276
+ words: "billing add-card",
1277
+ },
1278
+ {
1279
+ confirms: true,
1280
+ group: "Planning",
1281
+ operations: ["billing.paymentmethodremove"],
1282
+ options: [API_URL, CONFIRM],
1283
+ positionals: [],
1284
+ summary: "Remove your saved card. Project fees stop renewing when the paid period ends, and automatic top-up turns off.",
1285
+ words: "billing remove-card",
1286
+ },
953
1287
  {
954
1288
  group: "Planning",
955
1289
  operations: ["billing.ledger"],
956
1290
  options: [API_URL, ...PAGE_OPTIONS],
957
1291
  positionals: [],
958
- summary: "List immutable execution-credit ledger entries.",
1292
+ summary: "List every change to your execution credit: top-ups, charges and refunds.",
959
1293
  words: "billing ledger",
960
1294
  },
961
1295
  {
@@ -963,7 +1297,7 @@ export const COMMAND_CATALOG = [
963
1297
  operations: ["timing.summary"],
964
1298
  options: [API_URL],
965
1299
  positionals: [],
966
- summary: "Show the rolling 24-hour delivery timing cohort.",
1300
+ summary: "Show how close to on time this project's calls were, over the last 24 hours.",
967
1301
  words: "timing",
968
1302
  },
969
1303
  /* --- Credentials ------------------------------------------------------ */
@@ -972,7 +1306,7 @@ export const COMMAND_CATALOG = [
972
1306
  operations: ["credentials.list"],
973
1307
  options: [API_URL, ...PAGE_OPTIONS],
974
1308
  positionals: [],
975
- summary: "List this project's API credentials, by prefix, never in full.",
1309
+ summary: "List this project's API keys. Only the start of each is shown.",
976
1310
  words: "credentials list",
977
1311
  },
978
1312
  {
@@ -981,9 +1315,12 @@ export const COMMAND_CATALOG = [
981
1315
  operations: ["credentials.rotate"],
982
1316
  options: [API_URL, CONFIRM],
983
1317
  positionals: [
984
- { name: "<credential>", summary: "The credential to rotate." },
1318
+ {
1319
+ name: "<credential>",
1320
+ summary: "The key's id, starting ak_, from credentials list.",
1321
+ },
985
1322
  ],
986
- summary: "Mint the replacement for a credential, shown once.",
1323
+ summary: "Make a replacement API key and print it. This is the only time it's printed.",
987
1324
  words: "credentials rotate",
988
1325
  },
989
1326
  {
@@ -992,11 +1329,16 @@ export const COMMAND_CATALOG = [
992
1329
  operations: ["credentials.revoke"],
993
1330
  options: [API_URL, CONFIRM],
994
1331
  positionals: [
995
- { name: "<credential>", summary: "The credential to revoke." },
1332
+ {
1333
+ name: "<credential>",
1334
+ summary: "The key's id, starting ak_, from credentials list.",
1335
+ },
996
1336
  ],
997
- summary: "Stop a credential working, everywhere, immediately.",
1337
+ summary: "Stop an API key working, everywhere, straight away.",
998
1338
  words: "credentials revoke",
999
1339
  },
1340
+ /* --- Members ---------------------------------------------------------- */
1341
+ ...MEMBER_COMMANDS,
1000
1342
  /* --- Test sinks ------------------------------------------------------- */
1001
1343
  {
1002
1344
  group: "Test sinks",
@@ -1005,17 +1347,17 @@ export const COMMAND_CATALOG = [
1005
1347
  API_URL,
1006
1348
  {
1007
1349
  flag: "--endpoint",
1008
- summary: "The destination whose deliveries this sink stands in for.",
1350
+ summary: "The destination this sink answers for, by id, starting ep_.",
1009
1351
  value: "<destination>",
1010
1352
  },
1011
1353
  {
1012
1354
  flag: "--program",
1013
- summary: "How it should answer from the start: JSON, @file.json, or - for standard input.",
1355
+ summary: 'How it answers calls, such as {"behavior": "server_error"}. Inline, @file.json, or - for standard input.',
1014
1356
  value: "<json>",
1015
1357
  },
1016
1358
  ],
1017
1359
  positionals: [],
1018
- summary: "Create a receiver Greatwait hosts, for a test environment only.",
1360
+ summary: "Make a receiver GreatWait runs for you, to test against. Test environments only.",
1019
1361
  words: "sinks create",
1020
1362
  },
1021
1363
  {
@@ -1023,15 +1365,20 @@ export const COMMAND_CATALOG = [
1023
1365
  operations: ["testsinks.list"],
1024
1366
  options: [API_URL, ...PAGE_OPTIONS],
1025
1367
  positionals: [],
1026
- summary: "List the test sinks in this project.",
1368
+ summary: "List this project's test sinks.",
1027
1369
  words: "sinks list",
1028
1370
  },
1029
1371
  {
1030
1372
  group: "Test sinks",
1031
1373
  operations: ["testsinks.read"],
1032
1374
  options: [API_URL],
1033
- positionals: [{ name: "<sink>", summary: "The sink to read." }],
1034
- summary: "Read a test sink and the program it is running.",
1375
+ positionals: [
1376
+ {
1377
+ name: "<sink>",
1378
+ summary: "The sink's id, starting tsk_, from sinks create or sinks list.",
1379
+ },
1380
+ ],
1381
+ summary: "Show a test sink and how it answers calls.",
1035
1382
  words: "sinks read",
1036
1383
  },
1037
1384
  {
@@ -1041,12 +1388,17 @@ export const COMMAND_CATALOG = [
1041
1388
  API_URL,
1042
1389
  {
1043
1390
  flag: "--program",
1044
- summary: "The behaviour program: JSON, @file.json, or - for standard input.",
1391
+ summary: 'How it answers calls, such as {"behavior": "server_error"}. Inline, @file.json, or - for standard input.',
1045
1392
  value: "<json>",
1046
1393
  },
1047
1394
  ],
1048
- positionals: [{ name: "<sink>", summary: "The sink to program." }],
1049
- summary: "Tell a test sink how to answer, so a failure can be reproduced.",
1395
+ positionals: [
1396
+ {
1397
+ name: "<sink>",
1398
+ summary: "The sink's id, starting tsk_, from sinks create or sinks list.",
1399
+ },
1400
+ ],
1401
+ summary: "Change how a test sink answers, to reproduce a failure.",
1050
1402
  words: "sinks configure",
1051
1403
  },
1052
1404
  {
@@ -1054,16 +1406,26 @@ export const COMMAND_CATALOG = [
1054
1406
  group: "Test sinks",
1055
1407
  operations: ["testsinks.delete"],
1056
1408
  options: [API_URL, CONFIRM],
1057
- positionals: [{ name: "<sink>", summary: "The sink to delete." }],
1058
- summary: "Delete a test sink and the deliveries recorded against it.",
1409
+ positionals: [
1410
+ {
1411
+ name: "<sink>",
1412
+ summary: "The sink's id, starting tsk_, from sinks create or sinks list.",
1413
+ },
1414
+ ],
1415
+ summary: "Delete a test sink and every call it recorded.",
1059
1416
  words: "sinks delete",
1060
1417
  },
1061
1418
  {
1062
1419
  group: "Test sinks",
1063
1420
  operations: ["sinkdeliveries.list"],
1064
1421
  options: [API_URL, ...PAGE_OPTIONS],
1065
- positionals: [{ name: "<sink>", summary: "The sink to list." }],
1066
- summary: "List what a test sink received.",
1422
+ positionals: [
1423
+ {
1424
+ name: "<sink>",
1425
+ summary: "The sink's id, starting tsk_, from sinks create or sinks list.",
1426
+ },
1427
+ ],
1428
+ summary: "List the calls a test sink received.",
1067
1429
  words: "sinks deliveries",
1068
1430
  },
1069
1431
  {
@@ -1071,10 +1433,16 @@ export const COMMAND_CATALOG = [
1071
1433
  operations: ["sinkdeliveries.read"],
1072
1434
  options: [API_URL],
1073
1435
  positionals: [
1074
- { name: "<sink>", summary: "The sink it arrived at." },
1075
- { name: "<delivery>", summary: "The recorded delivery to read." },
1436
+ {
1437
+ name: "<sink>",
1438
+ summary: "The sink's id, starting tsk_, from sinks create or sinks list.",
1439
+ },
1440
+ {
1441
+ name: "<delivery>",
1442
+ summary: "The recorded call's id, starting tsd_, from sinks deliveries.",
1443
+ },
1076
1444
  ],
1077
- summary: "Read one recorded delivery, including the bytes that arrived.",
1445
+ summary: "Show one call a test sink received, byte for byte.",
1078
1446
  words: "sinks delivery",
1079
1447
  },
1080
1448
  ];
@@ -1110,11 +1478,26 @@ export const OPERATION_OMISSIONS = [
1110
1478
  ground: "declared",
1111
1479
  operation: "billing.reconcile",
1112
1480
  },
1481
+ {
1482
+ because: "Confirmation answers a browser returning from hosted Checkout: the dashboard calls it on the customer's return so the credit shows at once. A purchase started from the command line has no return to answer; billing funding reports it once the provider notification or the scheduled repair settles it, and the MCP tool provides the automation path.",
1483
+ ground: "declared",
1484
+ operation: "billing.fundingconfirm",
1485
+ },
1486
+ {
1487
+ because: "Confirmation answers a browser returning from the hosted payment-method form: the dashboard calls it on the customer's return so the method shows at once. A method added from a link the command line printed has no return to answer; the provider notification makes it the saved method, billing payment-method reports it, and the MCP tool provides the automation path.",
1488
+ ground: "declared",
1489
+ operation: "billing.paymentmethodconfirm",
1490
+ },
1113
1491
  {
1114
1492
  because: "The endpoint page is the accepted place to mark this human-observed server update done; adding a second interactive CLI design is outside this remediation.",
1115
1493
  ground: "declared",
1116
1494
  operation: "endpoints.acknowledgeSigningKeyRotation",
1117
1495
  },
1496
+ {
1497
+ because: "`greatwait destinations create` already creates a destination and prints its signing key once, which a person at a terminal can keep. The secretless find-or-create exists for agents, whose tool results land in ordinary history (W9-44); a person scheduling to an address uses the dashboard or `destinations create`.",
1498
+ ground: "declared",
1499
+ operation: "endpoints.ensure",
1500
+ },
1118
1501
  {
1119
1502
  because: "Minting a credential needs a signed-in person. A command line holding one credential could otherwise mint another, which is the escalation the control plane refuses by declaring a session principal.",
1120
1503
  ground: "principal-unreachable",