@vercel/board 0.29.0 → 0.31.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. package/README.md +8 -17
  2. package/dist/{a2-HUbQJ0RD.mjs → a2-DngWY2Eb.mjs} +741 -415
  3. package/dist/access-CY5xVMIK.mjs +242 -0
  4. package/dist/{access-CV96SYgr.d.mts → access-DPcrKIH_.d.mts} +6 -1
  5. package/dist/access.d.mts +4 -4
  6. package/dist/access.mjs +5 -4
  7. package/dist/{actors-DcJhFbwJ.mjs → actors-Bm-ojWWT.mjs} +2 -2
  8. package/dist/{auth-JO22iIwr.mjs → auth-CyO2aw5n.mjs} +126 -236
  9. package/dist/{auth-CU56Q2Xh.d.mts → auth-DLYSt_-A.d.mts} +32 -4
  10. package/dist/{backend-CPC_vyOo.d.mts → backend-Bob-5CM7.d.mts} +93 -42
  11. package/dist/backend-a2/blob-vercel.d.mts +1 -1
  12. package/dist/backend-a2/contract.d.mts +38 -98
  13. package/dist/backend-a2/contract.mjs +1 -1
  14. package/dist/backend-a2/scheduler-local.d.mts +1 -1
  15. package/dist/backend-a2/scheduler-local.mjs +1 -1
  16. package/dist/backend-a2/scheduler-qstash.d.mts +3 -3
  17. package/dist/backend-a2/scheduler-qstash.mjs +8 -8
  18. package/dist/backend-a2/scheduler-vercel.d.mts +3 -3
  19. package/dist/backend-a2/scheduler-vercel.mjs +6 -6
  20. package/dist/backend-a2/store-memory.d.mts +2 -2
  21. package/dist/backend-a2/store-memory.mjs +3 -3
  22. package/dist/backend-a2/store-postgres.d.mts +1 -1
  23. package/dist/backend-a2/store-postgres.mjs +34 -15
  24. package/dist/backend-a2/store-redis-http.d.mts +1 -1
  25. package/dist/backend-a2/store-redis-http.mjs +6 -6
  26. package/dist/backend-a2/store-redis.d.mts +2 -2
  27. package/dist/backend-a2/store-redis.mjs +5 -5
  28. package/dist/backend-a2/store-sqlite.d.mts +1 -1
  29. package/dist/backend-a2/store-sqlite.mjs +3 -3
  30. package/dist/backend-a2.d.mts +143 -242
  31. package/dist/backend-a2.mjs +2 -2
  32. package/dist/{backend-http-CqfKhrnn.d.mts → backend-http-BRrRbjRx.d.mts} +59 -45
  33. package/dist/{backend-http-CzIJMm58.mjs → backend-http-CvUKOn-m.mjs} +11 -10
  34. package/dist/{backend-http-Bmp0IgD3.mjs → backend-http-D8mUzuKQ.mjs} +2 -2
  35. package/dist/backend-http.d.mts +1 -1
  36. package/dist/backend-http.mjs +1 -1
  37. package/dist/backend-http.node.d.mts +1 -1
  38. package/dist/backend-http.node.mjs +1 -1
  39. package/dist/{backend-vercel-DQc_TaHp.mjs → backend-vercel-Ba8JDtqW.mjs} +3 -3
  40. package/dist/{backend-vercel-4tvcPKqX.d.mts → backend-vercel-BaSEUdwg.d.mts} +62 -47
  41. package/dist/{backend-vercel-BNauAs7w.mjs → backend-vercel-CmY9yZ9m.mjs} +279 -42
  42. package/dist/backend-vercel.d.mts +1 -1
  43. package/dist/backend-vercel.mjs +1 -1
  44. package/dist/backend-vercel.node.d.mts +1 -1
  45. package/dist/backend-vercel.node.mjs +1 -1
  46. package/dist/{blob-DmiQjrYy.d.mts → blob-Bx8QPWEd.d.mts} +2 -2
  47. package/dist/{blob-DdbpJqN1.mjs → blob-WbB2DJKn.mjs} +30 -11
  48. package/dist/{chat-provider-BWHbChcQ.d.mts → chat-provider-BChYrrA7.d.mts} +32 -28
  49. package/dist/{chat-provider-COtsU5jB.mjs → chat-provider-DkFp2hrh.mjs} +105 -60
  50. package/dist/cli-commands.d.mts +1 -1
  51. package/dist/cli-commands.mjs +1 -1
  52. package/dist/cli-embedded.d.mts +2 -2
  53. package/dist/cli-embedded.mjs +1 -1
  54. package/dist/cli.mjs +4 -4
  55. package/dist/{client-BqAjk0Q4.d.mts → client-COfYrgfV.d.mts} +240 -227
  56. package/dist/{commands-D6gvrOh3.d.mts → commands-DK4W3HCJ.d.mts} +47 -10
  57. package/dist/{commands-C3R1AWgm.mjs → commands-L1JSGz2Z.mjs} +212 -54
  58. package/dist/conformance-DK43HiHf.mjs +1000 -0
  59. package/dist/conformance.d.mts +8 -2
  60. package/dist/conformance.mjs +1 -1
  61. package/dist/{engine-DQxXk7dX.mjs → engine-DurYIRt8.mjs} +29 -210
  62. package/dist/{errors-DDktVeUa.d.mts → errors-2vGs49Db.d.mts} +1 -1
  63. package/dist/{client-D0Px7KzF.mjs → errors-CJXhhzvT.mjs} +132 -27
  64. package/dist/{provider-BaVmi4Hi.mjs → events-lujPA3gQ.mjs} +80 -17
  65. package/dist/{exports-BG-0Wyn-.mjs → exports-CWIdN0Ub.mjs} +195 -103
  66. package/dist/exports-FBOQWT7O.d.mts +5 -0
  67. package/dist/{folds-BDMSxBUf.mjs → folds-Cu9Q9zyQ.mjs} +3 -22
  68. package/dist/{folds-ZkHM4M-v.d.mts → folds-DLUzfibJ.d.mts} +15 -40
  69. package/dist/{index-D3VvNfh_.d.mts → index-Ho-ayyQL.d.mts} +2 -2
  70. package/dist/index.d.mts +7 -7
  71. package/dist/{index.default-rB8sJ9RX.mjs → index.default-BUcwDaAe.mjs} +1 -1
  72. package/dist/index.mjs +5 -6
  73. package/dist/index.node.d.mts +7 -7
  74. package/dist/index.node.mjs +3 -4
  75. package/dist/inspect/app.js +62 -61
  76. package/dist/inspect/engine.js +3 -3
  77. package/dist/{internal-CvsrprnU-CRY89I-b.mjs → internal-CvsrprnU-zZMpDiRY.mjs} +1 -1
  78. package/dist/{local-DhkrAqPP.mjs → local-C76Fy5ad.mjs} +1 -1
  79. package/dist/{main-CVBqe3VO.mjs → main-Dz-8komG.mjs} +251 -127
  80. package/dist/{middleware-CXjEeef4.mjs → middleware-BavYSDUa.mjs} +1 -1
  81. package/dist/{node-Zd_C-gxP.mjs → node-BgeGcwX0.mjs} +7 -3
  82. package/dist/{platform-B4TnJtWu-CwcTyKg2.mjs → platform-B4TnJtWu-Do3agKr5.mjs} +1 -1
  83. package/dist/{project-CBXlLftU.mjs → project-CQ4VUibA.mjs} +1 -1
  84. package/dist/{provider-DmSTp9lI.d.mts → provider-gynDUoyW.d.mts} +13 -43
  85. package/dist/{redis-tables-BJQVUspu.mjs → redis-tables-DHf85ixI.mjs} +40 -42
  86. package/dist/{reducer-CjmvZSAb-D_OSISmj.mjs → reducer-Bswr11ar-P324o9vn.mjs} +2 -2
  87. package/dist/{reducer-CYPHsSmd-BQIfozGi.d.mts → reducer-CYPHsSmd-BXjGiptm.d.mts} +1 -1
  88. package/dist/{reducers-DJzVpXwM.mjs → reducers-DcENwtwZ.mjs} +74 -77
  89. package/dist/{retryable-lazy-DZWmHpii-Bye-W8q7.mjs → retryable-lazy-DZWmHpii-DpTc5PIP.mjs} +1 -1
  90. package/dist/{scheduler-task-X1SToDjP-BVoWuInI.mjs → scheduler-task-X1SToDjP-D2Il2rln.mjs} +1 -1
  91. package/dist/{serve-G9RuaDSr.mjs → serve-CTmow-YH.mjs} +7 -7
  92. package/dist/{server-qgez0Xny-D5mLfqFQ.d.mts → server-B9gu0qi1-DI1WvcVK.d.mts} +10 -4
  93. package/dist/{server-BixV_byP.mjs → server-DG8D6VV0.mjs} +4 -4
  94. package/dist/{server-DtFrWxi3-Boa6gdWO.mjs → server-DX7mM6nm-D7N_7bug.mjs} +32 -23
  95. package/dist/{serving-B75Y4BF-.mjs → serving-DBFRo6U_.mjs} +1 -1
  96. package/dist/{session-clear-wHd5GCpZ-BnKSxReK.mjs → session-clear-XJYpmUpg-2q8l_FJR.mjs} +14 -2
  97. package/dist/{sql-D4Z_efJX.mjs → sql-CT5xVuGr.mjs} +2 -8
  98. package/dist/{sqlite-db-Bz2JkfCU.mjs → sqlite-db-0WeSOEZN.mjs} +1 -1
  99. package/dist/{store-D0MhBvg6-4Z2L0Kqd.d.mts → store-DEzcHZOA-B-5vhxef.d.mts} +12 -2
  100. package/dist/store-N8PXxDAS-DWWgv-Vz.mjs +5 -0
  101. package/dist/{store-codec-DwrWlgQx-CYxGW0aD.mjs → store-codec-pAG2oPgQ-SqDXlPBR.mjs} +4 -4
  102. package/dist/store-memory-4IBl0Ztu.mjs +2 -0
  103. package/dist/{store-memory-Bas9Uq5C.mjs → store-memory-B0PkVSuQ.mjs} +14 -7
  104. package/dist/{store-polling-BZt2Rf3D-BiEM6_HB.mjs → store-polling-BZt2Rf3D-Div-bJ_D.mjs} +2 -2
  105. package/dist/{store-presence-polling-JuAy2Ck2-CYpuK75X.mjs → store-presence-polling-JuAy2Ck2-Dh-g_KYM.mjs} +3 -3
  106. package/dist/{store-sqlite-CxxPCcCT.mjs → store-sqlite-D85t3tE7.mjs} +14 -7
  107. package/dist/store-sqlite-iBTYYKBj.mjs +2 -0
  108. package/dist/{stream-buffer-DrTyiIuo-BKy-vI14.mjs → stream-buffer-DrTyiIuo-Be10yOBR.mjs} +2 -2
  109. package/dist/{sync-kapso.d.mts → sync-chat-sdk.d.mts} +33 -37
  110. package/dist/sync-chat-sdk.mjs +44 -0
  111. package/dist/sync-github.d.mts +5 -18
  112. package/dist/sync-github.mjs +4 -70
  113. package/dist/sync-linear.d.mts +3 -3
  114. package/dist/sync-linear.mjs +6 -5
  115. package/dist/sync-slack.d.mts +7 -7
  116. package/dist/sync-slack.mjs +33 -54
  117. package/dist/sync.d.mts +3 -3
  118. package/dist/sync.mjs +2 -4
  119. package/dist/{tokens-CC3izSNr.mjs → tokens-Dnyd_y1n.mjs} +15 -6
  120. package/dist/{types-No0WdhE5.d.mts → types-CmrFjpml.d.mts} +2 -4
  121. package/dist/{watchers-hash-BDhLVkV5.mjs → watchers-hash-BjwlnGD9.mjs} +124 -115
  122. package/docs/01-board/01-mounting.md +2 -2
  123. package/docs/01-board/03-identity.md +5 -6
  124. package/docs/01-board/04-messages.md +96 -2
  125. package/docs/01-board/05-reading.md +2 -1
  126. package/docs/01-board/06-watchers.md +8 -6
  127. package/docs/01-board/08-middleware.md +6 -3
  128. package/docs/01-board/09-access.md +145 -14
  129. package/docs/02-sync/01-overview.md +19 -26
  130. package/docs/02-sync/02-functions.md +8 -9
  131. package/docs/02-sync/03-slack.md +5 -5
  132. package/docs/02-sync/04-github.md +2 -2
  133. package/docs/02-sync/06-providers.md +91 -62
  134. package/docs/03-guides/01-coding-agents.md +1 -1
  135. package/docs/03-guides/03-ci.md +7 -4
  136. package/docs/04-reference/01-cli.md +109 -51
  137. package/docs/04-reference/02-board.md +76 -28
  138. package/docs/04-reference/03-http.md +76 -38
  139. package/docs/04-reference/04-log.md +8 -11
  140. package/docs/04-reference/05-conformance.md +47 -7
  141. package/docs/index.md +2 -2
  142. package/package.json +7 -10
  143. package/sql/postgres/board.sql +1 -1
  144. package/sql/postgres/schema.sql +1 -1
  145. package/dist/conformance-DlnfuzEB.mjs +0 -556
  146. package/dist/errors-CusN4x2l.mjs +0 -88
  147. package/dist/events-qf5XG5VQ.mjs +0 -75
  148. package/dist/exports-mhAYiU4i.d.mts +0 -5
  149. package/dist/store-N8PXxDAS-BWBgzBHp.mjs +0 -5
  150. package/dist/store-memory-ZLiZbH3R.mjs +0 -2
  151. package/dist/store-sqlite-BmwL3pUR.mjs +0 -2
  152. package/dist/sync-kapso.mjs +0 -89
  153. package/dist/sync.chat.d.mts +0 -2
  154. package/dist/sync.chat.mjs +0 -2
  155. package/dist/users-yryHKFMo.mjs +0 -42
  156. package/docs/02-sync/05-whatsapp.md +0 -152
@@ -40,8 +40,10 @@ type CliCommand = {
40
40
  readonly subcommands?: readonly CliCommand[];
41
41
  /** Its arguments come before its subcommand, as in `sources <key> read <target>`. */
42
42
  readonly argumentsBeforeSubcommand?: true;
43
- /** It does something without a subcommand too, as `identity` lists your links. */
43
+ /** It does something without a subcommand too, as `sources` lists the sync entries. */
44
44
  readonly runsWithoutSubcommand?: true;
45
+ /** The subcommand its command runs when given none, as `channels` runs `channels list`. */
46
+ readonly default?: true;
45
47
  /** Out of help: it still runs, for what calls it. */
46
48
  readonly hidden?: true;
47
49
  };
@@ -61,7 +63,7 @@ declare const options: {
61
63
  readonly type: 'string';
62
64
  readonly value: '@handle';
63
65
  readonly optionalValue: true;
64
- readonly description: 'mentioning a handle, or you without one';
66
+ readonly description: 'mentioning a handle or email, or you without one';
65
67
  };
66
68
  readonly label: {
67
69
  readonly type: 'string';
@@ -166,6 +168,23 @@ declare const options: {
166
168
  readonly value: 'k';
167
169
  readonly description: 'remove a label';
168
170
  };
171
+ readonly if: {
172
+ readonly type: 'string';
173
+ readonly multiple: true;
174
+ readonly value: 'k=v';
175
+ readonly description: 'only while the message has this label now';
176
+ };
177
+ readonly 'if-unset': {
178
+ readonly type: 'string';
179
+ readonly multiple: true;
180
+ readonly value: 'k';
181
+ readonly description: "only while the message doesn't have this label";
182
+ };
183
+ readonly 'if-revision': {
184
+ readonly type: 'string';
185
+ readonly value: 'N';
186
+ readonly description: 'only if it is still at this revision, as read --json shows it';
187
+ };
169
188
  readonly channel: {
170
189
  readonly type: 'string';
171
190
  readonly value: 'c';
@@ -185,14 +204,6 @@ declare const options: {
185
204
  readonly value: 'duration';
186
205
  readonly description: 'how long to wait (default: 30m)';
187
206
  };
188
- readonly code: {
189
- readonly type: 'boolean';
190
- readonly description: 'post a code from your account instead of signing in';
191
- };
192
- readonly 'no-wait': {
193
- readonly type: 'boolean';
194
- readonly description: "start linking, and don't wait for it to finish";
195
- };
196
207
  readonly 'no-open': {
197
208
  readonly type: 'boolean';
198
209
  readonly description: "don't open the browser";
@@ -228,6 +239,32 @@ declare const options: {
228
239
  readonly value: 'N';
229
240
  readonly description: 'repeating this many times';
230
241
  };
242
+ readonly can: {
243
+ readonly type: 'string';
244
+ readonly value: 'scope';
245
+ readonly description: 'what it may do (default: *=read,post,react,label)';
246
+ };
247
+ readonly claim: {
248
+ readonly type: 'string';
249
+ readonly multiple: true;
250
+ readonly value: 'k=v';
251
+ readonly description: 'a claim its tokens carry; the same name again is any of them';
252
+ };
253
+ readonly profile: {
254
+ readonly type: 'string';
255
+ readonly value: 'name';
256
+ readonly description: 'the profile every request with it writes as';
257
+ };
258
+ readonly session: {
259
+ readonly type: 'string';
260
+ readonly value: 'id';
261
+ readonly description: 'the session every request with it writes from';
262
+ };
263
+ readonly expires: {
264
+ readonly type: 'string';
265
+ readonly value: 'duration';
266
+ readonly description: 'how long it lives (default: 30d, at most 90d)';
267
+ };
231
268
  readonly port: {
232
269
  readonly type: 'string';
233
270
  readonly value: 'N';
@@ -15,7 +15,7 @@ const options = {
15
15
  type: "string",
16
16
  value: "@handle",
17
17
  optionalValue: true,
18
- description: "mentioning a handle, or you without one"
18
+ description: "mentioning a handle or email, or you without one"
19
19
  },
20
20
  label: {
21
21
  type: "string",
@@ -120,6 +120,23 @@ const options = {
120
120
  value: "k",
121
121
  description: "remove a label"
122
122
  },
123
+ if: {
124
+ type: "string",
125
+ multiple: true,
126
+ value: "k=v",
127
+ description: "only while the message has this label now"
128
+ },
129
+ "if-unset": {
130
+ type: "string",
131
+ multiple: true,
132
+ value: "k",
133
+ description: "only while the message doesn't have this label"
134
+ },
135
+ "if-revision": {
136
+ type: "string",
137
+ value: "N",
138
+ description: "only if it is still at this revision, as read --json shows it"
139
+ },
123
140
  channel: {
124
141
  type: "string",
125
142
  value: "c",
@@ -139,14 +156,6 @@ const options = {
139
156
  value: "duration",
140
157
  description: "how long to wait (default: 30m)"
141
158
  },
142
- code: {
143
- type: "boolean",
144
- description: "post a code from your account instead of signing in"
145
- },
146
- "no-wait": {
147
- type: "boolean",
148
- description: "start linking, and don't wait for it to finish"
149
- },
150
159
  "no-open": {
151
160
  type: "boolean",
152
161
  description: "don't open the browser"
@@ -182,6 +191,32 @@ const options = {
182
191
  value: "N",
183
192
  description: "repeating this many times"
184
193
  },
194
+ can: {
195
+ type: "string",
196
+ value: "scope",
197
+ description: "what it may do (default: *=read,post,react,label)"
198
+ },
199
+ claim: {
200
+ type: "string",
201
+ multiple: true,
202
+ value: "k=v",
203
+ description: "a claim its tokens carry; the same name again is any of them"
204
+ },
205
+ profile: {
206
+ type: "string",
207
+ value: "name",
208
+ description: "the profile every request with it writes as"
209
+ },
210
+ session: {
211
+ type: "string",
212
+ value: "id",
213
+ description: "the session every request with it writes from"
214
+ },
215
+ expires: {
216
+ type: "string",
217
+ value: "duration",
218
+ description: "how long it lives (default: 30d, at most 90d)"
219
+ },
185
220
  port: {
186
221
  type: "string",
187
222
  value: "N",
@@ -243,6 +278,8 @@ const text = (description = "what it says: - reads it from stdin, and it may be
243
278
  required: false,
244
279
  description
245
280
  });
281
+ /** What `--after` means on a reply: a precondition, where on a read it's a position. */
282
+ const AFTER = "a reply only while this is the thread's newest message";
246
283
  /** What one of the CLI's help pages lists together, in this order. */
247
284
  const groups = [
248
285
  "you",
@@ -265,70 +302,169 @@ const commands = [
265
302
  }]
266
303
  },
267
304
  {
268
- group: "the board",
269
- name: "channels",
270
- description: "channels, grouped by path prefix",
305
+ group: "you",
306
+ name: "tokens",
307
+ description: "tokens that act as you, narrowed, for a widget, a sandbox, or a script",
271
308
  arguments: [],
272
309
  options: [],
310
+ runsWithoutSubcommand: true,
273
311
  examples: [{
274
- name: "list the channels",
275
- value: "channels"
276
- }]
312
+ name: "list your tokens",
313
+ value: "tokens"
314
+ }],
315
+ subcommands: [
316
+ {
317
+ name: "list",
318
+ default: true,
319
+ description: "your live tokens, or with manage, everyone's",
320
+ arguments: [],
321
+ options: [],
322
+ examples: [{
323
+ name: "list your tokens",
324
+ value: "tokens list"
325
+ }]
326
+ },
327
+ {
328
+ name: "create",
329
+ description: "mint one, and print its secret once",
330
+ arguments: [{
331
+ name: "name",
332
+ required: true,
333
+ description: "what it is for, e.g. feedback-widget"
334
+ }],
335
+ options: [
336
+ option("can"),
337
+ option("profile"),
338
+ option("session"),
339
+ option("expires")
340
+ ],
341
+ examples: [{
342
+ name: "a token that only posts feedback",
343
+ value: "tokens create feedback-widget --can feedback/=post"
344
+ }, {
345
+ name: "a week's token for a sandbox agent",
346
+ value: "tokens create sandbox-7 --can dev/=read,post,react --profile lemur --expires 7d"
347
+ }]
348
+ },
349
+ {
350
+ name: "revoke",
351
+ description: "stop one, and every token minted with it",
352
+ arguments: [{
353
+ name: "token",
354
+ required: true,
355
+ description: "its ID, as tokens shows it (t12)"
356
+ }],
357
+ options: [],
358
+ examples: [{
359
+ name: "revoke a token",
360
+ value: "tokens revoke t12"
361
+ }]
362
+ }
363
+ ]
277
364
  },
278
365
  {
279
366
  group: "the board",
280
- name: "actors",
281
- description: "actors and their handles",
367
+ name: "grants",
368
+ description: "who the board lets in beside its code's rules: tokens from an OIDC issuer with these claims",
282
369
  arguments: [],
283
370
  options: [],
371
+ runsWithoutSubcommand: true,
284
372
  examples: [{
285
- name: "list who has written here",
286
- value: "actors"
287
- }]
373
+ name: "list the grants",
374
+ value: "grants"
375
+ }],
376
+ subcommands: [
377
+ {
378
+ name: "list",
379
+ default: true,
380
+ description: "the board's grants",
381
+ arguments: [],
382
+ options: [],
383
+ examples: [{
384
+ name: "list the grants",
385
+ value: "grants list"
386
+ }]
387
+ },
388
+ {
389
+ name: "create",
390
+ description: "let them in, or change what they may do",
391
+ arguments: [{
392
+ name: "issuer",
393
+ required: true,
394
+ description: "vercel, github, or an https URL"
395
+ }],
396
+ options: [option("claim"), option("can")],
397
+ examples: [{
398
+ name: "let a workflow post in ci/",
399
+ value: "grants create github --claim repository=acme/web --can ci/=read,post"
400
+ }, {
401
+ name: "let a project's production post feedback",
402
+ value: "grants create vercel --claim project_id=prj_123 --claim environment=production --can feedback/=post"
403
+ }]
404
+ },
405
+ {
406
+ name: "revoke",
407
+ description: "stop letting them in",
408
+ arguments: [{
409
+ name: "grant",
410
+ required: true,
411
+ description: "its ID, as grants shows it (g3)"
412
+ }],
413
+ options: [],
414
+ examples: [{
415
+ name: "revoke a grant",
416
+ value: "grants revoke g3"
417
+ }]
418
+ }
419
+ ]
288
420
  },
289
421
  {
290
422
  group: "the board",
291
- name: "identity",
292
- description: "your linked Slack and GitHub accounts",
423
+ name: "channels",
424
+ description: "channels, grouped by path prefix: a first post makes one, and so does create",
293
425
  arguments: [],
294
426
  options: [],
295
427
  runsWithoutSubcommand: true,
296
428
  examples: [{
297
- name: "list your linked accounts",
298
- value: "identity"
429
+ name: "list the channels",
430
+ value: "channels"
299
431
  }],
300
432
  subcommands: [{
301
- name: "link",
302
- description: "link your account on a sync entry: sign in, or post a code from it",
303
- arguments: [{
304
- name: "key",
305
- required: true,
306
- description: "the sync entry, e.g. slack"
307
- }],
308
- options: [
309
- option("code"),
310
- option("no-wait"),
311
- option("no-open")
312
- ],
433
+ name: "list",
434
+ default: true,
435
+ description: "channels, grouped by path prefix",
436
+ arguments: [],
437
+ options: [],
313
438
  examples: [{
314
- name: "link your Slack account",
315
- value: "identity link slack"
439
+ name: "list the channels",
440
+ value: "channels list"
316
441
  }]
317
442
  }, {
318
- name: "unlink",
319
- description: "unlink one, by handle or actor ID",
443
+ name: "create",
444
+ description: "a channel, before anything posts to it (one that exists stays as it is)",
320
445
  arguments: [{
321
- name: "account",
446
+ name: "channel",
322
447
  required: true,
323
- description: "a handle or actor ID from identity"
448
+ description: "its path, such as dev/alerts"
324
449
  }],
325
450
  options: [],
326
451
  examples: [{
327
- name: "unlink an account",
328
- value: "identity unlink @ada"
452
+ name: "make a channel for alerts",
453
+ value: "channels create dev/alerts"
329
454
  }]
330
455
  }]
331
456
  },
457
+ {
458
+ group: "the board",
459
+ name: "actors",
460
+ description: "actors and their handles",
461
+ arguments: [],
462
+ options: [],
463
+ examples: [{
464
+ name: "list who has written here",
465
+ value: "actors"
466
+ }]
467
+ },
332
468
  {
333
469
  group: "messages",
334
470
  name: "read",
@@ -369,7 +505,8 @@ const commands = [
369
505
  option("attach"),
370
506
  option("sync"),
371
507
  option("no-sync"),
372
- option("idempotency-key")
508
+ option("idempotency-key"),
509
+ option("after", AFTER)
373
510
  ],
374
511
  examples: [{
375
512
  name: "start a thread",
@@ -387,11 +524,15 @@ const commands = [
387
524
  options: [
388
525
  option("attach"),
389
526
  option("idempotency-key"),
390
- option("no-sync")
527
+ option("no-sync"),
528
+ option("after", AFTER)
391
529
  ],
392
530
  examples: [{
393
531
  name: "reply in a thread",
394
532
  value: "reply 812 \"on it\""
533
+ }, {
534
+ name: "reply only if #815 is still the thread's newest",
535
+ value: "reply 812 \"on it\" --after 815"
395
536
  }]
396
537
  },
397
538
  {
@@ -465,10 +606,13 @@ const commands = [
465
606
  required: true,
466
607
  description: "its new text: - reads it from stdin"
467
608
  }],
468
- options: [],
609
+ options: [option("if-revision")],
469
610
  examples: [{
470
611
  name: "fix a typo",
471
612
  value: "edit 812 \"deploys are green again\""
613
+ }, {
614
+ name: "only if no one changed it since you read it",
615
+ value: "edit 812 \"step 3 of 5\" --if-revision 820"
472
616
  }]
473
617
  },
474
618
  {
@@ -477,7 +621,7 @@ const commands = [
477
621
  aliases: ["rm", "del"],
478
622
  description: "delete a message, leaving a tombstone",
479
623
  arguments: [id()],
480
- options: [],
624
+ options: [option("if-revision")],
481
625
  examples: [{
482
626
  name: "delete a message",
483
627
  value: "delete 812"
@@ -508,16 +652,30 @@ const commands = [
508
652
  multiple: true,
509
653
  description: "a label to set"
510
654
  }],
511
- options: [option("unset")],
512
- examples: [{
513
- name: "mark a bug fixed",
514
- value: "label 812 state=fixed --unset wip"
515
- }]
655
+ options: [
656
+ option("unset"),
657
+ option("if"),
658
+ option("if-unset")
659
+ ],
660
+ examples: [
661
+ {
662
+ name: "mark a bug fixed",
663
+ value: "label 812 state=fixed --unset wip"
664
+ },
665
+ {
666
+ name: "claim a thread, unless someone has",
667
+ value: "label 812 owner=claude --if-unset owner"
668
+ },
669
+ {
670
+ name: "move it on from open only",
671
+ value: "label 812 state=fixing --if state=open"
672
+ }
673
+ ]
516
674
  },
517
675
  {
518
676
  group: "messages",
519
677
  name: "typing",
520
- description: "show typing in the thread's synced platform threads (marks WhatsApp read)",
678
+ description: "show typing in the thread's synced platform threads",
521
679
  arguments: [id(), {
522
680
  name: "status",
523
681
  required: false,