@gobi-ai/cli 2.0.25 → 2.0.26

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.
@@ -4,12 +4,12 @@
4
4
  "name": "gobi-ai"
5
5
  },
6
6
  "description": "Claude Code plugin for the Gobi collaborative knowledge platform CLI",
7
- "version": "2.0.25",
7
+ "version": "2.0.26",
8
8
  "plugins": [
9
9
  {
10
10
  "name": "gobi",
11
11
  "description": "Manage the Gobi collaborative knowledge platform from the command line. Publish vault profiles, create posts and replies, generate images and videos.",
12
- "version": "2.0.25",
12
+ "version": "2.0.26",
13
13
  "author": {
14
14
  "name": "gobi-ai"
15
15
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "gobi",
3
3
  "description": "Manage the Gobi collaborative knowledge platform from the command line",
4
- "version": "2.0.25",
4
+ "version": "2.0.26",
5
5
  "author": {
6
6
  "name": "gobi-ai"
7
7
  },
@@ -1,6 +1,6 @@
1
1
  import { WEB_BASE_URL } from "../constants.js";
2
2
  import { apiGet, apiPost, apiPatch, apiDelete } from "../client.js";
3
- import { isJsonMode, jsonOut, readStdin, resolveVaultSlug, unwrapResp, } from "./utils.js";
3
+ import { isJsonMode, jsonOut, readStdin, unwrapResp, } from "./utils.js";
4
4
  import { uploadPostAttachments, assertPostAttachmentMix, } from "../attachments.js";
5
5
  function readContent(value) {
6
6
  if (value === "-")
@@ -187,11 +187,11 @@ export function registerGlobalCommand(program) {
187
187
  // ── Create post ──
188
188
  global
189
189
  .command("create-post")
190
- .description("Create a post in the global feed. --vault-slug attributes it to a vault you own. With no --vault-slug, the post is created without an authorVaultSlug (vault-less personal post).")
190
+ .description("Create a post in the global feed.")
191
191
  .option("--title <title>", "Title of the post")
192
192
  .option("--content <content>", "Post content (markdown supported, use \"-\" for stdin)")
193
193
  .option("--rich-text <richText>", "Rich-text JSON array (mutually exclusive with --content)")
194
- .option("--vault-slug <vaultSlug>", "Attribute the post to this vault (sets authorVaultSlug). Caller must own the vault.")
194
+ .option("--artifact <artifactId>", "Attach an existing artifact to the post (repeatable). Create artifacts with `gobi artifact create`.", (value, prev = []) => [...prev, value], [])
195
195
  .option("--attach <file>", "Local media file to attach. Repeatable. X-style mix rule: up to 4 photos OR 1 GIF OR 1 video. Size ceilings: 5MB photos / 15MB GIFs / 512MB video.", (value, prev = []) => [...prev, value], [])
196
196
  .option("--repost-post-id <postId>", "Wrap an existing top-level post as the embedded card on this new post. Composes with --content / --rich-text / --attach (the wrapping author's text + media render above the embedded card). Reposts-of-reposts are collapsed to the transitive root server-side. The referenced post must exist, not be deleted, and not itself be a reply.")
197
197
  .action(async (opts) => {
@@ -201,10 +201,6 @@ export function registerGlobalCommand(program) {
201
201
  if (opts.content && opts.richText) {
202
202
  throw new Error("--content and --rich-text are mutually exclusive.");
203
203
  }
204
- let authorVaultSlug;
205
- if (opts.vaultSlug) {
206
- authorVaultSlug = resolveVaultSlug({ vaultSlug: opts.vaultSlug });
207
- }
208
204
  const body = {};
209
205
  if (opts.title != null)
210
206
  body.title = opts.title;
@@ -221,8 +217,8 @@ export function registerGlobalCommand(program) {
221
217
  }
222
218
  body.richText = parsed;
223
219
  }
224
- if (authorVaultSlug)
225
- body.authorVaultSlug = authorVaultSlug;
220
+ if (opts.artifact && opts.artifact.length > 0)
221
+ body.artifactIds = opts.artifact;
226
222
  if (opts.attach && opts.attach.length > 0) {
227
223
  assertPostAttachmentMix(opts.attach);
228
224
  body.attachments = await uploadPostAttachments(opts.attach);
@@ -254,25 +250,18 @@ export function registerGlobalCommand(program) {
254
250
  .option("--title <title>", "New title")
255
251
  .option("--content <content>", "New content (markdown supported, use \"-\" for stdin)")
256
252
  .option("--rich-text <richText>", "Rich-text JSON array (mutually exclusive with --content)")
257
- .option("--vault-slug <vaultSlug>", "Attribute the post to this vault (sets authorVaultSlug).")
258
253
  .option("--attach <file>", "Replace the post's media attachments with the given files (existing attachments are removed). Repeatable. X-style mix rule: up to 4 photos OR 1 GIF OR 1 video. Size ceilings: 5MB photos / 15MB GIFs / 512MB video. Omit to leave attachments unchanged.", (value, prev = []) => [...prev, value], [])
259
254
  .action(async (postId, opts) => {
260
- const wantsVaultChange = !!opts.vaultSlug;
261
255
  const wantsAttachChange = !!(opts.attach && opts.attach.length > 0);
262
256
  if (opts.title == null &&
263
257
  opts.content == null &&
264
258
  opts.richText == null &&
265
- !wantsVaultChange &&
266
259
  !wantsAttachChange) {
267
- throw new Error("Provide at least --title, --content, --rich-text, --vault-slug, or --attach to update.");
260
+ throw new Error("Provide at least --title, --content, --rich-text, or --attach to update.");
268
261
  }
269
262
  if (opts.content && opts.richText) {
270
263
  throw new Error("--content and --rich-text are mutually exclusive.");
271
264
  }
272
- let authorVaultSlug;
273
- if (opts.vaultSlug) {
274
- authorVaultSlug = resolveVaultSlug(opts);
275
- }
276
265
  const body = {};
277
266
  if (opts.title != null)
278
267
  body.title = opts.title;
@@ -289,8 +278,6 @@ export function registerGlobalCommand(program) {
289
278
  }
290
279
  body.richText = parsed;
291
280
  }
292
- if (authorVaultSlug !== undefined)
293
- body.authorVaultSlug = authorVaultSlug;
294
281
  if (opts.attach && opts.attach.length > 0) {
295
282
  assertPostAttachmentMix(opts.attach);
296
283
  body.attachments = await uploadPostAttachments(opts.attach);
@@ -321,7 +308,6 @@ export function registerGlobalCommand(program) {
321
308
  .description("Create a reply to a post in the global feed.")
322
309
  .option("--content <content>", "Reply content (markdown supported, use \"-\" for stdin)")
323
310
  .option("--rich-text <richText>", "Rich-text JSON array (mutually exclusive with --content)")
324
- .option("--vault-slug <vaultSlug>", "Attribute the reply to this vault (sets authorVaultSlug).")
325
311
  .option("--attach <file>", "Local media file to attach to this reply. Repeatable. X-style mix rule: up to 4 photos OR 1 GIF OR 1 video. Size ceilings: 5MB photos / 15MB GIFs / 512MB video.", (value, prev = []) => [...prev, value], [])
326
312
  .action(async (postId, opts) => {
327
313
  if (!opts.content && !opts.richText) {
@@ -330,10 +316,6 @@ export function registerGlobalCommand(program) {
330
316
  if (opts.content && opts.richText) {
331
317
  throw new Error("--content and --rich-text are mutually exclusive.");
332
318
  }
333
- let authorVaultSlug;
334
- if (opts.vaultSlug) {
335
- authorVaultSlug = resolveVaultSlug(opts);
336
- }
337
319
  const body = {};
338
320
  if (opts.content != null) {
339
321
  body.content = readContent(opts.content);
@@ -348,8 +330,6 @@ export function registerGlobalCommand(program) {
348
330
  }
349
331
  body.richText = parsed;
350
332
  }
351
- if (authorVaultSlug)
352
- body.authorVaultSlug = authorVaultSlug;
353
333
  if (opts.attach && opts.attach.length > 0) {
354
334
  assertPostAttachmentMix(opts.attach);
355
335
  body.attachments = await uploadPostAttachments(opts.attach);
@@ -367,19 +347,13 @@ export function registerGlobalCommand(program) {
367
347
  .description("Edit a reply you authored in the global feed.")
368
348
  .option("--content <content>", "New reply content (markdown supported, use \"-\" for stdin)")
369
349
  .option("--rich-text <richText>", "Rich-text JSON array (mutually exclusive with --content)")
370
- .option("--vault-slug <vaultSlug>", "Attribute the reply to this vault (sets authorVaultSlug).")
371
350
  .action(async (replyId, opts) => {
372
- const wantsVaultChange = !!opts.vaultSlug;
373
- if (opts.content == null && opts.richText == null && !wantsVaultChange) {
374
- throw new Error("Provide at least --content, --rich-text, or --vault-slug to update.");
351
+ if (opts.content == null && opts.richText == null) {
352
+ throw new Error("Provide at least --content or --rich-text to update.");
375
353
  }
376
354
  if (opts.content && opts.richText) {
377
355
  throw new Error("--content and --rich-text are mutually exclusive.");
378
356
  }
379
- let authorVaultSlug;
380
- if (opts.vaultSlug) {
381
- authorVaultSlug = resolveVaultSlug(opts);
382
- }
383
357
  const body = {};
384
358
  if (opts.content != null) {
385
359
  body.content = readContent(opts.content);
@@ -394,8 +368,6 @@ export function registerGlobalCommand(program) {
394
368
  }
395
369
  body.richText = parsed;
396
370
  }
397
- if (authorVaultSlug !== undefined)
398
- body.authorVaultSlug = authorVaultSlug;
399
371
  const resp = (await apiPatch(`/posts/replies/${replyId}`, body));
400
372
  const reply = unwrapResp(resp);
401
373
  if (isJsonMode(global)) {
@@ -1,5 +1,5 @@
1
1
  import { apiGet, apiPost, apiPatch, apiDelete } from "../client.js";
2
- import { isJsonMode, jsonOut, readStdin, resolveVaultSlug, unwrapResp, } from "./utils.js";
2
+ import { isJsonMode, jsonOut, readStdin, unwrapResp, } from "./utils.js";
3
3
  import { uploadPostAttachments, assertPostAttachmentMix, } from "../attachments.js";
4
4
  function readContent(value) {
5
5
  if (value === "-")
@@ -185,11 +185,11 @@ export function registerPersonalCommand(program) {
185
185
  // private posts have no audience.
186
186
  personal
187
187
  .command("create-post")
188
- .description("Create a private post in your personal space. --vault-slug attributes it to a vault you own. Visible only to you.")
188
+ .description("Create a private post in your personal space. Visible only to you.")
189
189
  .option("--title <title>", "Title of the post")
190
190
  .option("--content <content>", "Post content (markdown supported, use \"-\" for stdin)")
191
191
  .option("--rich-text <richText>", "Rich-text JSON array (mutually exclusive with --content)")
192
- .option("--vault-slug <vaultSlug>", "Attribute the post to this vault (sets authorVaultSlug). Caller must own the vault.")
192
+ .option("--artifact <artifactId>", "Attach an existing artifact to the post (repeatable). Create artifacts with `gobi artifact create`.", (value, prev = []) => [...prev, value], [])
193
193
  .option("--attach <file>", "Local media file to attach. Repeatable. X-style mix rule: up to 4 photos OR 1 GIF OR 1 video. Size ceilings: 5MB photos / 15MB GIFs / 512MB video.", (value, prev = []) => [...prev, value], [])
194
194
  .option("--repost-post-id <postId>", "Wrap an existing top-level post as the embedded card on this new private post. The referenced post must be visible to you (your own personal-space post, a global-feed post, or a post in a space you're a member of). Reposting someone else's personal-space post returns 404.")
195
195
  .action(async (opts) => {
@@ -199,10 +199,6 @@ export function registerPersonalCommand(program) {
199
199
  if (opts.content && opts.richText) {
200
200
  throw new Error("--content and --rich-text are mutually exclusive.");
201
201
  }
202
- let authorVaultSlug;
203
- if (opts.vaultSlug) {
204
- authorVaultSlug = resolveVaultSlug({ vaultSlug: opts.vaultSlug });
205
- }
206
202
  const body = {};
207
203
  if (opts.title != null)
208
204
  body.title = opts.title;
@@ -219,8 +215,8 @@ export function registerPersonalCommand(program) {
219
215
  }
220
216
  body.richText = parsed;
221
217
  }
222
- if (authorVaultSlug)
223
- body.authorVaultSlug = authorVaultSlug;
218
+ if (opts.artifact && opts.artifact.length > 0)
219
+ body.artifactIds = opts.artifact;
224
220
  if (opts.attach && opts.attach.length > 0) {
225
221
  assertPostAttachmentMix(opts.attach);
226
222
  body.attachments = await uploadPostAttachments(opts.attach);
@@ -255,25 +251,18 @@ export function registerPersonalCommand(program) {
255
251
  .option("--title <title>", "New title")
256
252
  .option("--content <content>", "New content (markdown supported, use \"-\" for stdin)")
257
253
  .option("--rich-text <richText>", "Rich-text JSON array (mutually exclusive with --content)")
258
- .option("--vault-slug <vaultSlug>", "Attribute the post to this vault (sets authorVaultSlug).")
259
254
  .option("--attach <file>", "Replace the post's media attachments with the given files (existing attachments are removed). Repeatable. X-style mix rule: up to 4 photos OR 1 GIF OR 1 video. Size ceilings: 5MB photos / 15MB GIFs / 512MB video. Omit to leave attachments unchanged.", (value, prev = []) => [...prev, value], [])
260
255
  .action(async (postId, opts) => {
261
- const wantsVaultChange = !!opts.vaultSlug;
262
256
  const wantsAttachChange = !!(opts.attach && opts.attach.length > 0);
263
257
  if (opts.title == null &&
264
258
  opts.content == null &&
265
259
  opts.richText == null &&
266
- !wantsVaultChange &&
267
260
  !wantsAttachChange) {
268
- throw new Error("Provide at least --title, --content, --rich-text, --vault-slug, or --attach to update.");
261
+ throw new Error("Provide at least --title, --content, --rich-text, or --attach to update.");
269
262
  }
270
263
  if (opts.content && opts.richText) {
271
264
  throw new Error("--content and --rich-text are mutually exclusive.");
272
265
  }
273
- let authorVaultSlug;
274
- if (opts.vaultSlug) {
275
- authorVaultSlug = resolveVaultSlug(opts);
276
- }
277
266
  const body = {};
278
267
  if (opts.title != null)
279
268
  body.title = opts.title;
@@ -290,8 +279,6 @@ export function registerPersonalCommand(program) {
290
279
  }
291
280
  body.richText = parsed;
292
281
  }
293
- if (authorVaultSlug !== undefined)
294
- body.authorVaultSlug = authorVaultSlug;
295
282
  if (opts.attach && opts.attach.length > 0) {
296
283
  assertPostAttachmentMix(opts.attach);
297
284
  body.attachments = await uploadPostAttachments(opts.attach);
@@ -327,7 +314,6 @@ export function registerPersonalCommand(program) {
327
314
  .description("Reply to a personal-space post. The reply inherits the parent's private scope automatically.")
328
315
  .option("--content <content>", "Reply content (markdown supported, use \"-\" for stdin)")
329
316
  .option("--rich-text <richText>", "Rich-text JSON array (mutually exclusive with --content)")
330
- .option("--vault-slug <vaultSlug>", "Attribute the reply to this vault (sets authorVaultSlug).")
331
317
  .option("--attach <file>", "Local media file to attach to this reply. Repeatable. X-style mix rule: up to 4 photos OR 1 GIF OR 1 video. Size ceilings: 5MB photos / 15MB GIFs / 512MB video.", (value, prev = []) => [...prev, value], [])
332
318
  .action(async (postId, opts) => {
333
319
  if (!opts.content && !opts.richText) {
@@ -336,10 +322,6 @@ export function registerPersonalCommand(program) {
336
322
  if (opts.content && opts.richText) {
337
323
  throw new Error("--content and --rich-text are mutually exclusive.");
338
324
  }
339
- let authorVaultSlug;
340
- if (opts.vaultSlug) {
341
- authorVaultSlug = resolveVaultSlug(opts);
342
- }
343
325
  const body = {};
344
326
  if (opts.content != null) {
345
327
  body.content = readContent(opts.content);
@@ -354,8 +336,6 @@ export function registerPersonalCommand(program) {
354
336
  }
355
337
  body.richText = parsed;
356
338
  }
357
- if (authorVaultSlug)
358
- body.authorVaultSlug = authorVaultSlug;
359
339
  if (opts.attach && opts.attach.length > 0) {
360
340
  assertPostAttachmentMix(opts.attach);
361
341
  body.attachments = await uploadPostAttachments(opts.attach);
@@ -373,19 +353,13 @@ export function registerPersonalCommand(program) {
373
353
  .description("Edit a reply you authored in your personal space.")
374
354
  .option("--content <content>", "New reply content (markdown supported, use \"-\" for stdin)")
375
355
  .option("--rich-text <richText>", "Rich-text JSON array (mutually exclusive with --content)")
376
- .option("--vault-slug <vaultSlug>", "Attribute the reply to this vault (sets authorVaultSlug).")
377
356
  .action(async (replyId, opts) => {
378
- const wantsVaultChange = !!opts.vaultSlug;
379
- if (opts.content == null && opts.richText == null && !wantsVaultChange) {
380
- throw new Error("Provide at least --content, --rich-text, or --vault-slug to update.");
357
+ if (opts.content == null && opts.richText == null) {
358
+ throw new Error("Provide at least --content or --rich-text to update.");
381
359
  }
382
360
  if (opts.content && opts.richText) {
383
361
  throw new Error("--content and --rich-text are mutually exclusive.");
384
362
  }
385
- let authorVaultSlug;
386
- if (opts.vaultSlug) {
387
- authorVaultSlug = resolveVaultSlug(opts);
388
- }
389
363
  const body = {};
390
364
  if (opts.content != null) {
391
365
  body.content = readContent(opts.content);
@@ -400,8 +374,6 @@ export function registerPersonalCommand(program) {
400
374
  }
401
375
  body.richText = parsed;
402
376
  }
403
- if (authorVaultSlug !== undefined)
404
- body.authorVaultSlug = authorVaultSlug;
405
377
  const resp = (await apiPatch(`/posts/replies/${replyId}`, body));
406
378
  const reply = unwrapResp(resp);
407
379
  if (isJsonMode(personal)) {
@@ -1,7 +1,7 @@
1
1
  import { WEB_BASE_URL } from "../constants.js";
2
2
  import { apiGet, apiPost, apiPatch, apiDelete } from "../client.js";
3
3
  import { requireSpace, selectSpace, setSpaceRequirement, writeSpaceSetting, } from "./init.js";
4
- import { isJsonMode, jsonOut, readStdin, resolveSpaceSlug, resolveVaultSlug, unwrapResp, } from "./utils.js";
4
+ import { isJsonMode, jsonOut, readStdin, resolveSpaceSlug, unwrapResp, } from "./utils.js";
5
5
  import { uploadPostAttachments, assertPostAttachmentMix, } from "../attachments.js";
6
6
  function readContent(value) {
7
7
  if (value === "-")
@@ -315,7 +315,7 @@ export function registerSpaceCommand(program) {
315
315
  .option("--title <title>", "Title of the post")
316
316
  .option("--content <content>", "Post content (markdown supported, use \"-\" for stdin)")
317
317
  .option("--rich-text <richText>", "Rich-text JSON array (mutually exclusive with --content)")
318
- .option("--vault-slug <vaultSlug>", "Attribute the post to this vault (sets authorVaultSlug). Caller must own the vault.")
318
+ .option("--artifact <artifactId>", "Attach an existing artifact to the post (repeatable). Create artifacts with `gobi artifact create`.", (value, prev = []) => [...prev, value], [])
319
319
  .option("--space-slug <spaceSlug>", "Space slug (overrides .gobi/settings.yaml)")
320
320
  .option("--attach <file>", "Local media file to attach. Repeatable. X-style mix rule: up to 4 photos OR 1 GIF OR 1 video. Size ceilings: 5MB photos / 15MB GIFs / 512MB video.", (value, prev = []) => [...prev, value], [])
321
321
  .option("--repost-post-id <postId>", "Wrap an existing top-level post as the embedded card on this new post. Composes with --content / --rich-text / --attach (the wrapping author's text + media render above the embedded card). Reposts-of-reposts are collapsed to the transitive root server-side. The referenced post must exist, not be deleted, and not itself be a reply.")
@@ -326,10 +326,6 @@ export function registerSpaceCommand(program) {
326
326
  if (opts.content && opts.richText) {
327
327
  throw new Error("--content and --rich-text are mutually exclusive.");
328
328
  }
329
- let authorVaultSlug;
330
- if (opts.vaultSlug) {
331
- authorVaultSlug = resolveVaultSlug({ vaultSlug: opts.vaultSlug });
332
- }
333
329
  const body = {};
334
330
  if (opts.title != null)
335
331
  body.title = opts.title;
@@ -346,8 +342,8 @@ export function registerSpaceCommand(program) {
346
342
  }
347
343
  body.richText = parsed;
348
344
  }
349
- if (authorVaultSlug)
350
- body.authorVaultSlug = authorVaultSlug;
345
+ if (opts.artifact && opts.artifact.length > 0)
346
+ body.artifactIds = opts.artifact;
351
347
  if (opts.attach && opts.attach.length > 0) {
352
348
  assertPostAttachmentMix(opts.attach);
353
349
  body.attachments = await uploadPostAttachments(opts.attach);
@@ -379,27 +375,20 @@ export function registerSpaceCommand(program) {
379
375
  .option("--title <title>", "New title for the post")
380
376
  .option("--content <content>", "New content for the post (markdown supported, use \"-\" for stdin)")
381
377
  .option("--rich-text <richText>", "Rich-text JSON array (mutually exclusive with --content)")
382
- .option("--vault-slug <vaultSlug>", "Attribute the post to this vault (sets authorVaultSlug). Caller must own the vault.")
383
378
  .option("--space-slug <spaceSlug>", "Space slug (overrides .gobi/settings.yaml)")
384
379
  .option("--attach <file>", "Replace the post's media attachments with the given files (existing attachments are removed). Repeatable. X-style mix rule: up to 4 photos OR 1 GIF OR 1 video. Size ceilings: 5MB photos / 15MB GIFs / 512MB video. Omit to leave attachments unchanged.", (value, prev = []) => [...prev, value], [])
385
380
  .action(async (postId, opts) => {
386
- const wantsVaultChange = !!opts.vaultSlug;
387
381
  const wantsAttachChange = !!(opts.attach && opts.attach.length > 0);
388
382
  if (opts.title == null &&
389
383
  opts.content == null &&
390
384
  opts.richText == null &&
391
- !wantsVaultChange &&
392
385
  !wantsAttachChange) {
393
- throw new Error("Provide at least --title, --content, --rich-text, --vault-slug, or --attach to update.");
386
+ throw new Error("Provide at least --title, --content, --rich-text, or --attach to update.");
394
387
  }
395
388
  if (opts.content && opts.richText) {
396
389
  throw new Error("--content and --rich-text are mutually exclusive.");
397
390
  }
398
391
  const spaceSlug = resolveSpaceSlug(space, opts);
399
- let authorVaultSlug;
400
- if (opts.vaultSlug) {
401
- authorVaultSlug = resolveVaultSlug(opts);
402
- }
403
392
  const body = {};
404
393
  if (opts.title != null)
405
394
  body.title = opts.title;
@@ -416,8 +405,6 @@ export function registerSpaceCommand(program) {
416
405
  }
417
406
  body.richText = parsed;
418
407
  }
419
- if (authorVaultSlug !== undefined)
420
- body.authorVaultSlug = authorVaultSlug;
421
408
  if (opts.attach && opts.attach.length > 0) {
422
409
  assertPostAttachmentMix(opts.attach);
423
410
  body.attachments = await uploadPostAttachments(opts.attach);
@@ -452,7 +439,6 @@ export function registerSpaceCommand(program) {
452
439
  .description("Create a reply to a post in a space.")
453
440
  .option("--content <content>", "Reply content (markdown supported, use \"-\" for stdin)")
454
441
  .option("--rich-text <richText>", "Rich-text JSON array (mutually exclusive with --content)")
455
- .option("--vault-slug <vaultSlug>", "Attribute the reply to this vault (sets authorVaultSlug). Caller must own the vault.")
456
442
  .option("--space-slug <spaceSlug>", "Space slug (overrides .gobi/settings.yaml)")
457
443
  .option("--attach <file>", "Local media file to attach to this reply. Repeatable. X-style mix rule: up to 4 photos OR 1 GIF OR 1 video. Size ceilings: 5MB photos / 15MB GIFs / 512MB video.", (value, prev = []) => [...prev, value], [])
458
444
  .action(async (postId, opts) => {
@@ -462,10 +448,6 @@ export function registerSpaceCommand(program) {
462
448
  if (opts.content && opts.richText) {
463
449
  throw new Error("--content and --rich-text are mutually exclusive.");
464
450
  }
465
- let authorVaultSlug;
466
- if (opts.vaultSlug) {
467
- authorVaultSlug = resolveVaultSlug(opts);
468
- }
469
451
  const body = {};
470
452
  if (opts.content != null) {
471
453
  body.content = readContent(opts.content);
@@ -480,8 +462,6 @@ export function registerSpaceCommand(program) {
480
462
  }
481
463
  body.richText = parsed;
482
464
  }
483
- if (authorVaultSlug)
484
- body.authorVaultSlug = authorVaultSlug;
485
465
  if (opts.attach && opts.attach.length > 0) {
486
466
  assertPostAttachmentMix(opts.attach);
487
467
  body.attachments = await uploadPostAttachments(opts.attach);
@@ -501,21 +481,15 @@ export function registerSpaceCommand(program) {
501
481
  .description("Edit a reply you authored in a space.")
502
482
  .option("--content <content>", "New content for the reply (markdown supported, use \"-\" for stdin)")
503
483
  .option("--rich-text <richText>", "Rich-text JSON array (mutually exclusive with --content)")
504
- .option("--vault-slug <vaultSlug>", "Attribute the reply to this vault (sets authorVaultSlug). Caller must own the vault.")
505
484
  .option("--space-slug <spaceSlug>", "Space slug (overrides .gobi/settings.yaml)")
506
485
  .action(async (replyId, opts) => {
507
- const wantsVaultChange = !!opts.vaultSlug;
508
- if (opts.content == null && opts.richText == null && !wantsVaultChange) {
509
- throw new Error("Provide at least --content, --rich-text, or --vault-slug to update.");
486
+ if (opts.content == null && opts.richText == null) {
487
+ throw new Error("Provide at least --content or --rich-text to update.");
510
488
  }
511
489
  if (opts.content && opts.richText) {
512
490
  throw new Error("--content and --rich-text are mutually exclusive.");
513
491
  }
514
492
  const spaceSlug = resolveSpaceSlug(space, opts);
515
- let authorVaultSlug;
516
- if (opts.vaultSlug) {
517
- authorVaultSlug = resolveVaultSlug(opts);
518
- }
519
493
  const body = {};
520
494
  if (opts.content != null) {
521
495
  body.content = readContent(opts.content);
@@ -530,8 +504,6 @@ export function registerSpaceCommand(program) {
530
504
  }
531
505
  body.richText = parsed;
532
506
  }
533
- if (authorVaultSlug !== undefined)
534
- body.authorVaultSlug = authorVaultSlug;
535
507
  const resp = (await apiPatch(`/spaces/${spaceSlug}/replies/${replyId}`, body));
536
508
  const msg = unwrapResp(resp);
537
509
  if (isJsonMode(space)) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gobi-ai/cli",
3
- "version": "2.0.25",
3
+ "version": "2.0.26",
4
4
  "description": "CLI client for the Gobi collaborative knowledge platform",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -9,12 +9,12 @@ description: >-
9
9
  allowed-tools: Bash(gobi:*)
10
10
  metadata:
11
11
  author: gobi-ai
12
- version: "2.0.25"
12
+ version: "2.0.26"
13
13
  ---
14
14
 
15
15
  # gobi-artifact
16
16
 
17
- Gobi artifact commands for versioned, post-attachable creations (v2.0.25).
17
+ Gobi artifact commands for versioned, post-attachable creations (v2.0.26).
18
18
 
19
19
  Requires gobi-cli installed and authenticated. See gobi-core skill for setup.
20
20
 
@@ -8,12 +8,12 @@ description: >-
8
8
  allowed-tools: Bash(gobi:*)
9
9
  metadata:
10
10
  author: gobi-ai
11
- version: "2.0.25"
11
+ version: "2.0.26"
12
12
  ---
13
13
 
14
14
  # gobi-core
15
15
 
16
- Core CLI commands for the Gobi collaborative knowledge platform (v2.0.25).
16
+ Core CLI commands for the Gobi collaborative knowledge platform (v2.0.26).
17
17
 
18
18
  ## Prerequisites
19
19
 
@@ -7,7 +7,7 @@ description: >-
7
7
  allowed-tools: Bash(gobi:*)
8
8
  metadata:
9
9
  author: gobi-ai
10
- version: "2.0.25"
10
+ version: "2.0.26"
11
11
  ---
12
12
 
13
13
  # Gobi Homepage Developer Guide
@@ -10,12 +10,12 @@ description: >-
10
10
  allowed-tools: Bash(gobi:*)
11
11
  metadata:
12
12
  author: gobi-ai
13
- version: "2.0.25"
13
+ version: "2.0.26"
14
14
  ---
15
15
 
16
16
  # gobi-media
17
17
 
18
- Gobi media generation commands (v2.0.25).
18
+ Gobi media generation commands (v2.0.26).
19
19
 
20
20
  Requires gobi-cli installed and authenticated. See gobi-core skill for setup.
21
21
 
@@ -7,12 +7,12 @@ description: >-
7
7
  allowed-tools: Bash(gobi:*)
8
8
  metadata:
9
9
  author: gobi-ai
10
- version: "2.0.25"
10
+ version: "2.0.26"
11
11
  ---
12
12
 
13
13
  # gobi-sense
14
14
 
15
- Gobi sense commands for activity and transcription data (v2.0.25).
15
+ Gobi sense commands for activity and transcription data (v2.0.26).
16
16
 
17
17
  Requires gobi-cli installed and authenticated. See the **gobi-core** skill for setup.
18
18
 
@@ -11,12 +11,12 @@ description: >-
11
11
  allowed-tools: Bash(gobi:*)
12
12
  metadata:
13
13
  author: gobi-ai
14
- version: "2.0.25"
14
+ version: "2.0.26"
15
15
  ---
16
16
 
17
17
  # gobi-space
18
18
 
19
- Gobi space, global, and personal-space posts (v2.0.25).
19
+ Gobi space, global, and personal-space posts (v2.0.26).
20
20
 
21
21
  Requires gobi-cli installed and authenticated. See the **gobi-core** skill for setup.
22
22
 
@@ -12,8 +12,7 @@ Commands:
12
12
  feed [options] List the unified feed (posts and replies, newest first) in the global public feed.
13
13
  list-posts [options] List posts in the global feed (paginated). Pass --mine to limit to your own posts.
14
14
  get-post [options] <postId> Get a global post with its ancestors and replies (paginated).
15
- create-post [options] Create a post in the global feed. --vault-slug attributes it to a vault you own. With no --vault-slug, the post is created without an authorVaultSlug (vault-less
16
- personal post).
15
+ create-post [options] Create a post in the global feed.
17
16
  edit-post [options] <postId> Edit a post you authored in the global feed.
18
17
  delete-post <postId> Delete a post you authored in the global feed.
19
18
  create-reply [options] <postId> Create a reply to a post in the global feed.
@@ -70,13 +69,13 @@ Options:
70
69
  ```
71
70
  Usage: gobi global create-post [options]
72
71
 
73
- Create a post in the global feed. --vault-slug attributes it to a vault you own. With no --vault-slug, the post is created without an authorVaultSlug (vault-less personal post).
72
+ Create a post in the global feed.
74
73
 
75
74
  Options:
76
75
  --title <title> Title of the post
77
76
  --content <content> Post content (markdown supported, use "-" for stdin)
78
77
  --rich-text <richText> Rich-text JSON array (mutually exclusive with --content)
79
- --vault-slug <vaultSlug> Attribute the post to this vault (sets authorVaultSlug). Caller must own the vault.
78
+ --artifact <artifactId> Attach an existing artifact to the post (repeatable). Create artifacts with `gobi artifact create`. (default: [])
80
79
  --attach <file> Local media file to attach. Repeatable. X-style mix rule: up to 4 photos OR 1 GIF OR 1 video. Size ceilings: 5MB photos / 15MB GIFs / 512MB video. (default: [])
81
80
  --repost-post-id <postId> Wrap an existing top-level post as the embedded card on this new post. Composes with --content / --rich-text / --attach (the wrapping author's text + media render above
82
81
  the embedded card). Reposts-of-reposts are collapsed to the transitive root server-side. The referenced post must exist, not be deleted, and not itself be a reply.
@@ -91,13 +90,12 @@ Usage: gobi global edit-post [options] <postId>
91
90
  Edit a post you authored in the global feed.
92
91
 
93
92
  Options:
94
- --title <title> New title
95
- --content <content> New content (markdown supported, use "-" for stdin)
96
- --rich-text <richText> Rich-text JSON array (mutually exclusive with --content)
97
- --vault-slug <vaultSlug> Attribute the post to this vault (sets authorVaultSlug).
98
- --attach <file> Replace the post's media attachments with the given files (existing attachments are removed). Repeatable. X-style mix rule: up to 4 photos OR 1 GIF OR 1 video. Size
99
- ceilings: 5MB photos / 15MB GIFs / 512MB video. Omit to leave attachments unchanged. (default: [])
100
- -h, --help display help for command
93
+ --title <title> New title
94
+ --content <content> New content (markdown supported, use "-" for stdin)
95
+ --rich-text <richText> Rich-text JSON array (mutually exclusive with --content)
96
+ --attach <file> Replace the post's media attachments with the given files (existing attachments are removed). Repeatable. X-style mix rule: up to 4 photos OR 1 GIF OR 1 video. Size
97
+ ceilings: 5MB photos / 15MB GIFs / 512MB video. Omit to leave attachments unchanged. (default: [])
98
+ -h, --help display help for command
101
99
  ```
102
100
 
103
101
  ## delete-post
@@ -119,12 +117,11 @@ Usage: gobi global create-reply [options] <postId>
119
117
  Create a reply to a post in the global feed.
120
118
 
121
119
  Options:
122
- --content <content> Reply content (markdown supported, use "-" for stdin)
123
- --rich-text <richText> Rich-text JSON array (mutually exclusive with --content)
124
- --vault-slug <vaultSlug> Attribute the reply to this vault (sets authorVaultSlug).
125
- --attach <file> Local media file to attach to this reply. Repeatable. X-style mix rule: up to 4 photos OR 1 GIF OR 1 video. Size ceilings: 5MB photos / 15MB GIFs / 512MB video. (default:
126
- [])
127
- -h, --help display help for command
120
+ --content <content> Reply content (markdown supported, use "-" for stdin)
121
+ --rich-text <richText> Rich-text JSON array (mutually exclusive with --content)
122
+ --attach <file> Local media file to attach to this reply. Repeatable. X-style mix rule: up to 4 photos OR 1 GIF OR 1 video. Size ceilings: 5MB photos / 15MB GIFs / 512MB video. (default:
123
+ [])
124
+ -h, --help display help for command
128
125
  ```
129
126
 
130
127
  ## edit-reply
@@ -135,10 +132,9 @@ Usage: gobi global edit-reply [options] <replyId>
135
132
  Edit a reply you authored in the global feed.
136
133
 
137
134
  Options:
138
- --content <content> New reply content (markdown supported, use "-" for stdin)
139
- --rich-text <richText> Rich-text JSON array (mutually exclusive with --content)
140
- --vault-slug <vaultSlug> Attribute the reply to this vault (sets authorVaultSlug).
141
- -h, --help display help for command
135
+ --content <content> New reply content (markdown supported, use "-" for stdin)
136
+ --rich-text <richText> Rich-text JSON array (mutually exclusive with --content)
137
+ -h, --help display help for command
142
138
  ```
143
139
 
144
140
  ## delete-reply
@@ -13,7 +13,7 @@ Commands:
13
13
  feed [options] List your personal-space feed (posts and replies, newest first). Only you can see these rows.
14
14
  list-posts [options] List root posts (no replies) in your personal space. Filters the personal feed client-side; pagination cursor advances through the underlying feed page.
15
15
  get-post [options] <postId> Get a personal-space post with its ancestors and replies (paginated). Same endpoint as `gobi global get-post`; only the owner can resolve a private id.
16
- create-post [options] Create a private post in your personal space. --vault-slug attributes it to a vault you own. Visible only to you.
16
+ create-post [options] Create a private post in your personal space. Visible only to you.
17
17
  edit-post [options] <postId> Edit a post you authored in your personal space.
18
18
  delete-post <postId> Delete a post you authored in your personal space.
19
19
  create-reply [options] <postId> Reply to a personal-space post. The reply inherits the parent's private scope automatically.
@@ -67,13 +67,13 @@ Options:
67
67
  ```
68
68
  Usage: gobi personal create-post [options]
69
69
 
70
- Create a private post in your personal space. --vault-slug attributes it to a vault you own. Visible only to you.
70
+ Create a private post in your personal space. Visible only to you.
71
71
 
72
72
  Options:
73
73
  --title <title> Title of the post
74
74
  --content <content> Post content (markdown supported, use "-" for stdin)
75
75
  --rich-text <richText> Rich-text JSON array (mutually exclusive with --content)
76
- --vault-slug <vaultSlug> Attribute the post to this vault (sets authorVaultSlug). Caller must own the vault.
76
+ --artifact <artifactId> Attach an existing artifact to the post (repeatable). Create artifacts with `gobi artifact create`. (default: [])
77
77
  --attach <file> Local media file to attach. Repeatable. X-style mix rule: up to 4 photos OR 1 GIF OR 1 video. Size ceilings: 5MB photos / 15MB GIFs / 512MB video. (default: [])
78
78
  --repost-post-id <postId> Wrap an existing top-level post as the embedded card on this new private post. The referenced post must be visible to you (your own personal-space post, a global-feed
79
79
  post, or a post in a space you're a member of). Reposting someone else's personal-space post returns 404.
@@ -88,13 +88,12 @@ Usage: gobi personal edit-post [options] <postId>
88
88
  Edit a post you authored in your personal space.
89
89
 
90
90
  Options:
91
- --title <title> New title
92
- --content <content> New content (markdown supported, use "-" for stdin)
93
- --rich-text <richText> Rich-text JSON array (mutually exclusive with --content)
94
- --vault-slug <vaultSlug> Attribute the post to this vault (sets authorVaultSlug).
95
- --attach <file> Replace the post's media attachments with the given files (existing attachments are removed). Repeatable. X-style mix rule: up to 4 photos OR 1 GIF OR 1 video. Size
96
- ceilings: 5MB photos / 15MB GIFs / 512MB video. Omit to leave attachments unchanged. (default: [])
97
- -h, --help display help for command
91
+ --title <title> New title
92
+ --content <content> New content (markdown supported, use "-" for stdin)
93
+ --rich-text <richText> Rich-text JSON array (mutually exclusive with --content)
94
+ --attach <file> Replace the post's media attachments with the given files (existing attachments are removed). Repeatable. X-style mix rule: up to 4 photos OR 1 GIF OR 1 video. Size
95
+ ceilings: 5MB photos / 15MB GIFs / 512MB video. Omit to leave attachments unchanged. (default: [])
96
+ -h, --help display help for command
98
97
  ```
99
98
 
100
99
  ## delete-post
@@ -116,12 +115,11 @@ Usage: gobi personal create-reply [options] <postId>
116
115
  Reply to a personal-space post. The reply inherits the parent's private scope automatically.
117
116
 
118
117
  Options:
119
- --content <content> Reply content (markdown supported, use "-" for stdin)
120
- --rich-text <richText> Rich-text JSON array (mutually exclusive with --content)
121
- --vault-slug <vaultSlug> Attribute the reply to this vault (sets authorVaultSlug).
122
- --attach <file> Local media file to attach to this reply. Repeatable. X-style mix rule: up to 4 photos OR 1 GIF OR 1 video. Size ceilings: 5MB photos / 15MB GIFs / 512MB video. (default:
123
- [])
124
- -h, --help display help for command
118
+ --content <content> Reply content (markdown supported, use "-" for stdin)
119
+ --rich-text <richText> Rich-text JSON array (mutually exclusive with --content)
120
+ --attach <file> Local media file to attach to this reply. Repeatable. X-style mix rule: up to 4 photos OR 1 GIF OR 1 video. Size ceilings: 5MB photos / 15MB GIFs / 512MB video. (default:
121
+ [])
122
+ -h, --help display help for command
125
123
  ```
126
124
 
127
125
  ## edit-reply
@@ -132,10 +130,9 @@ Usage: gobi personal edit-reply [options] <replyId>
132
130
  Edit a reply you authored in your personal space.
133
131
 
134
132
  Options:
135
- --content <content> New reply content (markdown supported, use "-" for stdin)
136
- --rich-text <richText> Rich-text JSON array (mutually exclusive with --content)
137
- --vault-slug <vaultSlug> Attribute the reply to this vault (sets authorVaultSlug).
138
- -h, --help display help for command
133
+ --content <content> New reply content (markdown supported, use "-" for stdin)
134
+ --rich-text <richText> Rich-text JSON array (mutually exclusive with --content)
135
+ -h, --help display help for command
139
136
  ```
140
137
 
141
138
  ## delete-reply
@@ -118,7 +118,7 @@ Options:
118
118
  --title <title> Title of the post
119
119
  --content <content> Post content (markdown supported, use "-" for stdin)
120
120
  --rich-text <richText> Rich-text JSON array (mutually exclusive with --content)
121
- --vault-slug <vaultSlug> Attribute the post to this vault (sets authorVaultSlug). Caller must own the vault.
121
+ --artifact <artifactId> Attach an existing artifact to the post (repeatable). Create artifacts with `gobi artifact create`. (default: [])
122
122
  --space-slug <spaceSlug> Space slug (overrides .gobi/settings.yaml)
123
123
  --attach <file> Local media file to attach. Repeatable. X-style mix rule: up to 4 photos OR 1 GIF OR 1 video. Size ceilings: 5MB photos / 15MB GIFs / 512MB video. (default: [])
124
124
  --repost-post-id <postId> Wrap an existing top-level post as the embedded card on this new post. Composes with --content / --rich-text / --attach (the wrapping author's text + media render above
@@ -137,7 +137,6 @@ Options:
137
137
  --title <title> New title for the post
138
138
  --content <content> New content for the post (markdown supported, use "-" for stdin)
139
139
  --rich-text <richText> Rich-text JSON array (mutually exclusive with --content)
140
- --vault-slug <vaultSlug> Attribute the post to this vault (sets authorVaultSlug). Caller must own the vault.
141
140
  --space-slug <spaceSlug> Space slug (overrides .gobi/settings.yaml)
142
141
  --attach <file> Replace the post's media attachments with the given files (existing attachments are removed). Repeatable. X-style mix rule: up to 4 photos OR 1 GIF OR 1 video. Size
143
142
  ceilings: 5MB photos / 15MB GIFs / 512MB video. Omit to leave attachments unchanged. (default: [])
@@ -166,7 +165,6 @@ Create a reply to a post in a space.
166
165
  Options:
167
166
  --content <content> Reply content (markdown supported, use "-" for stdin)
168
167
  --rich-text <richText> Rich-text JSON array (mutually exclusive with --content)
169
- --vault-slug <vaultSlug> Attribute the reply to this vault (sets authorVaultSlug). Caller must own the vault.
170
168
  --space-slug <spaceSlug> Space slug (overrides .gobi/settings.yaml)
171
169
  --attach <file> Local media file to attach to this reply. Repeatable. X-style mix rule: up to 4 photos OR 1 GIF OR 1 video. Size ceilings: 5MB photos / 15MB GIFs / 512MB video. (default:
172
170
  [])
@@ -183,7 +181,6 @@ Edit a reply you authored in a space.
183
181
  Options:
184
182
  --content <content> New content for the reply (markdown supported, use "-" for stdin)
185
183
  --rich-text <richText> Rich-text JSON array (mutually exclusive with --content)
186
- --vault-slug <vaultSlug> Attribute the reply to this vault (sets authorVaultSlug). Caller must own the vault.
187
184
  --space-slug <spaceSlug> Space slug (overrides .gobi/settings.yaml)
188
185
  -h, --help display help for command
189
186
  ```
@@ -8,12 +8,12 @@ description: >-
8
8
  allowed-tools: Bash(gobi:*)
9
9
  metadata:
10
10
  author: gobi-ai
11
- version: "2.0.25"
11
+ version: "2.0.26"
12
12
  ---
13
13
 
14
14
  # gobi-vault
15
15
 
16
- Gobi vault commands for publishing your vault profile and syncing files (v2.0.25).
16
+ Gobi vault commands for publishing your vault profile and syncing files (v2.0.26).
17
17
 
18
18
  Requires gobi-cli installed and authenticated. See gobi-core skill for setup.
19
19