@gobi-ai/cli 2.0.22 → 2.0.23

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.22",
7
+ "version": "2.0.23",
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.22",
12
+ "version": "2.0.23",
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.22",
4
+ "version": "2.0.23",
5
5
  "author": {
6
6
  "name": "gobi-ai"
7
7
  },
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2025 Gobi AI
3
+ Copyright (c) 2025-2026 Gobi AI
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -4,11 +4,11 @@
4
4
  [![npm](https://img.shields.io/npm/v/@gobi-ai/cli)](https://www.npmjs.com/package/@gobi-ai/cli)
5
5
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
6
6
 
7
- The programmatic interface to [Gobi](https://gobispace.com) — the agent-facing surface of the ecosystem. The same capabilities the desktop and web clients use (auth, vault sync and publishing, personal posts and replies, drafts, media generation, activity reads) exposed as composable shell commands so AI agents and developer scripts can participate in a user's Brain.
7
+ The programmatic interface to [Gobi](https://gobispace.com) — the agent-facing surface of the ecosystem. The same capabilities the desktop and web clients use (auth, vault sync and publishing, personal posts and replies, drafts, media generation, activity reads) exposed as composable shell commands so AI agents and developer scripts can act on a user's behalf in Gobi.
8
8
 
9
9
  ## Why a CLI?
10
10
 
11
- Most Gobi capabilities are interactive surfaces (Desktop, Web, Mobile). The CLI flips that: every command is scriptable, returns structured JSON when asked, and uses headless device-code auth so an agent can run it on any host. If you're building an agent that needs to read from or write to a user's Brain — capture notes, post to a community space, save a snippet, draft a suggestion, generate an image — this is the surface.
11
+ Most Gobi capabilities are interactive surfaces (Desktop, Web, Mobile). The CLI flips that: every command is scriptable, returns structured JSON when asked, and uses headless device-code auth so an agent can run it on any host. If you're building an agent that needs to work in a user's Gobi — capture notes, post to a community space, draft a suggestion, generate an image — this is the surface.
12
12
 
13
13
  ## Installation
14
14
 
@@ -63,7 +63,7 @@ Each setup step unlocks a different family of commands — run only the ones the
63
63
  | Step | Unlocks |
64
64
  |------|---------|
65
65
  | `gobi auth login` | All authenticated commands |
66
- | `gobi vault init` | Every `gobi vault …` command (`publish`, `unpublish`, `sync`) and lets `global create-post` default to that vault |
66
+ | `gobi vault init` | Every `gobi vault …` command (`publish`, `unpublish`, `sync`); also lets `global create-post --auto-attachments` resolve that vault automatically |
67
67
  | `gobi space warp` | Every `gobi space …` command without needing `--space-slug` |
68
68
 
69
69
  ---
@@ -142,6 +142,10 @@ When the runtime exports `GOBI_SESSION_ID`, `gobi draft add` picks it up automat
142
142
 
143
143
  | Command | Description |
144
144
  |---------|-------------|
145
+ | `gobi vault create <slug> --name <n>` | Create a new vault. Does not change the configured vault — run `gobi vault init` or `gobi vault set-primary` afterwards if you want to anchor to it. |
146
+ | `gobi vault rename <newName> [--vault-slug <slug>]` | Rename a vault. Defaults to the configured vault. Local display name only — does not affect `PUBLISH.md` frontmatter. |
147
+ | `gobi vault delete <slug>` | Delete a vault. Irreversible. The API rejects if the vault still owns content; clean up posts, members, and files first. |
148
+ | `gobi vault set-primary <slug>` | Mark a vault as your primary. Unsets primary on the others. |
145
149
  | `gobi vault publish` | Upload `PUBLISH.md` to your vault. Triggers profile/metadata refresh. |
146
150
  | `gobi vault unpublish` | Remove `PUBLISH.md` from your vault. |
147
151
  | `gobi vault status [--vault-slug <slug>]` | Show the configured vault's publish state (`isPublished`), profile fields, file count, and public profile URL. Useful as a pre-flight check before posting with `--auto-attachments`. |
@@ -178,31 +182,49 @@ A *Space* is a community knowledge area. A *Space Post* lives in one space. The
178
182
  | `gobi space list-topic-posts <topicSlug>` | List posts tagged with a topic |
179
183
  | `gobi space list-posts` | List posts in the space |
180
184
  | `gobi space get-post <postId> [--full]` | Get a post with its ancestors and replies. `--full` shows reply content without truncation. |
181
- | `gobi space create-post --title <t> --content <c> [--vault-slug <slug>] [--auto-attachments] [--draft-id <id>]` | Create a space post. `--vault-slug` attributes it to a vault you own; `--auto-attachments` uploads `[[wikilinks]]` to that vault and uses it as `authorVaultSlug`. `--draft-id` links the post back to a draft (records `postId`/`spaceSlug` on `draft.metadata` so the client can render an "Open post" button). |
185
+ | `gobi space create-post [--title <t>] (--content <c> \| --rich-text <json> \| --draft-id <id>) [--vault-slug <slug>] [--auto-attachments] [--repost-post-id <id>] [--attach <file>]…` | Create a space post. Must provide content via one of `--content`, `--rich-text`, or `--draft-id`. `--vault-slug` attributes it to a vault you own; `--auto-attachments` uploads `[[wikilinks]]` to that vault and uses it as `authorVaultSlug`. `--draft-id` links the post back to a draft (records `postId`/`spaceSlug` on `draft.metadata` so the client can render an "Open post" button). `--repost-post-id` reposts an existing post (sets `repostPostId` on the new post). `--attach` uploads local media to render inline in-feed (repeatable; X-style mix rule — up to 4 photos OR 1 GIF OR 1 video). |
182
186
  | `gobi space edit-post <postId> [--title <t>] [--content <c>] [--vault-slug <slug>] [--auto-attachments]` | Edit a space post. `--vault-slug ""` detaches the vault. |
183
187
  | `gobi space delete-post <postId>` | Delete a space post |
184
- | `gobi space create-reply <postId> (--content <c> \| --rich-text <json>) [--vault-slug <slug>] [--auto-attachments]` | Create a reply to a space post |
188
+ | `gobi space create-reply <postId> (--content <c> \| --rich-text <json>) [--vault-slug <slug>] [--auto-attachments] [--attach <file>]…` | Create a reply to a space post. `--attach` works the same as on `create-post`. |
185
189
  | `gobi space edit-reply <replyId> [--content <c>] [--rich-text <json>] [--vault-slug <slug>] [--auto-attachments]` | Edit a reply you authored. `--vault-slug ""` detaches attribution. |
186
190
  | `gobi space delete-reply <replyId>` | Delete a reply you authored |
187
191
 
188
192
  ### Global feed (personal posts)
189
193
 
190
- A *Personal Post* lives on the author's profile (their primary vault) and surfaces in the public global feed. Same `Post` model as a Space Post, scoped to the user instead of a space.
194
+ A *Personal Post* surfaces in the public global feed. Pass `--vault-slug` to attribute it to a vault you own (it'll then surface on that vault's profile too); with no `--vault-slug` and no `--auto-attachments` the post has no `authorVaultSlug` and lives only on the global feed. Same `Post` model as a Space Post, scoped to the user instead of a space.
191
195
 
192
196
  | Command | Description |
193
197
  |---------|-------------|
194
198
  | `gobi global feed [--following]` | List the global public feed (posts + replies, newest first). `--following` limits to authors you follow. |
195
199
  | `gobi global list-posts [--mine] [--vault-slug <slug>]` | List personal posts; filter to your own or by author vault |
196
200
  | `gobi global get-post <postId> [--full]` | Get a personal post with its ancestors and replies. `--full` shows reply content without truncation. |
197
- | `gobi global create-post [--title <t>] (--content <c> \| --rich-text <json>) [--vault-slug <slug>] [--auto-attachments] [--draft-id <id>]` | Create a personal post. `--draft-id` links the post back to a draft (records `postId` on `draft.metadata`). |
201
+ | `gobi global create-post [--title <t>] (--content <c> \| --rich-text <json>) [--vault-slug <slug>] [--auto-attachments] [--draft-id <id>] [--repost-post-id <id>] [--attach <file>]…` | Create a personal post. `--draft-id` links the post back to a draft (records `postId` on `draft.metadata`). `--repost-post-id` reposts an existing post. `--attach` uploads local media for inline rendering (see `gobi space create-post` above for the mix rule). |
198
202
  | `gobi global edit-post <postId> [--title <t>] [--content <c>] [--vault-slug <slug>]` | Edit a personal post you authored. `--vault-slug ""` detaches the vault. |
199
203
  | `gobi global delete-post <postId>` | Delete a personal post you authored |
200
- | `gobi global create-reply <postId> (--content <c> \| --rich-text <json>) [--vault-slug <slug>] [--auto-attachments]` | Create a reply to a personal post |
204
+ | `gobi global create-reply <postId> (--content <c> \| --rich-text <json>) [--vault-slug <slug>] [--auto-attachments] [--attach <file>]…` | Create a reply to a personal post |
201
205
  | `gobi global edit-reply <replyId> [--content <c>] [--rich-text <json>] [--vault-slug <slug>] [--auto-attachments]` | Edit a reply you authored. `--vault-slug ""` detaches attribution. |
202
206
  | `gobi global delete-reply <replyId>` | Delete a reply you authored |
203
207
 
204
208
  `--vault-slug` requires that the caller hold `role: 'owner'` on the target vault. When set, it becomes the post's `authorVaultSlug`. When `--auto-attachments` is set, the same vault is used both as the upload destination for `[[wikilinks]]` and as `authorVaultSlug`.
205
209
 
210
+ ### Personal space (private posts)
211
+
212
+ > Naming note: a **Personal Post** (under `gobi global`, above) is the public-feed kind — it lives on your vault profile and surfaces on the global feed. A **personal-space post** (this section, under `gobi personal`) is the private kind — same `Post` data model, but scoped via `personalSpaceUserId` so only you can see it.
213
+
214
+ Private posts and replies visible only to you. Same `Post` data model and subcommand shape as `gobi global`, but scoped to a personal space — they never appear on the public global feed.
215
+
216
+ | Command | Description |
217
+ |---------|-------------|
218
+ | `gobi personal feed` | Your personal-space feed (posts + replies, newest first) |
219
+ | `gobi personal list-posts` | List personal-space posts |
220
+ | `gobi personal get-post <postId> [--full]` | Get a personal-space post with its ancestors and replies |
221
+ | `gobi personal create-post [--title <t>] (--content <c> \| --rich-text <json>) [--vault-slug <slug>] [--auto-attachments] [--draft-id <id>] [--repost-post-id <id>] [--attach <file>]…` | Create a private post in your personal space. `--vault-slug` attributes it to a vault you own. `--attach` works the same as on `gobi global create-post`. |
222
+ | `gobi personal edit-post <postId> [--title <t>] [--content <c>] [--vault-slug <slug>] [--auto-attachments]` | Edit a personal-space post you authored |
223
+ | `gobi personal delete-post <postId>` | Delete a personal-space post you authored |
224
+ | `gobi personal create-reply <postId> (--content <c> \| --rich-text <json>) [--vault-slug <slug>] [--auto-attachments] [--attach <file>]…` | Reply to a personal-space post (inherits the parent's private scope) |
225
+ | `gobi personal edit-reply <replyId> [--content <c>] [--rich-text <json>] [--vault-slug <slug>] [--auto-attachments]` | Edit a reply you authored |
226
+ | `gobi personal delete-reply <replyId>` | Delete a reply you authored |
227
+
206
228
  ### Sense
207
229
 
208
230
  Activity and transcription data captured by Gobi Sense (or the mobile app).
@@ -226,11 +248,11 @@ Each action is `{ label, message? }`: `label` is the short button text (1–80 c
226
248
  |---------|-------------|
227
249
  | `gobi draft list [--limit N]` | List drafts (priority ASC, then newest first) |
228
250
  | `gobi draft get <id>` | Get one draft with its history and suggested actions |
229
- | `gobi draft add <title> <content> [--session <id>] [--priority N] [--action <label[::message]>]…` | Add a draft. Pass `--action` up to 3 times; each action is `Label` or `Label::Message`. `--session` falls back to `$GOBI_SESSION_ID`. Use `-` for content to read from stdin. |
251
+ | `gobi draft add <title> <content> [--session <id>] [--vault-slug <slug>] [--priority N] [--action <label[::message]>]…` | Add a draft. Pass `--action` up to 3 times; each action is `Label` or `Label::Message`. `--session` falls back to `$GOBI_SESSION_ID`. `--vault-slug` anchors the draft to a specific vault (must be one you own). Use `-` for content to read from stdin. |
230
252
  | `gobi draft delete <id>` | Delete a draft |
231
253
  | `gobi draft prioritize <id> <priority>` | Set priority (lower = higher) |
232
254
  | `gobi draft action <id> <index>` | Take one of the draft's suggested actions by 0-based index. Marks `actioned` and posts the action's `message` (or `label`, if no message) into the originating session. |
233
- | `gobi draft revise <id> <comment> [--title <t>] [--content <c>] [--action <label[::message]>]…` | Bump revision with a comment; optionally replace title / content / actions in the same call |
255
+ | `gobi draft revise <id> <comment> [--title <t>] [--content <c>] [--vault-slug <slug>] [--action <label[::message]>]…` | Bump revision with a comment; optionally replace title / content / vault-slug / actions in the same call |
234
256
 
235
257
  ### Media generation
236
258
 
@@ -241,9 +263,12 @@ Image, video, and avatar generation. See the `gobi-media` skill for full workflo
241
263
  | `gobi media generate-image --prompt <p> [--aspect-ratio <r>] [-o <file>]` | Generate an image (use `-o` to wait + download) |
242
264
  | `gobi media edit-image --image <f> --prompt <p>` | Edit an image with a prompt |
243
265
  | `gobi media inpaint-image --image <f> --mask <m> --prompt <p>` | Inpaint a masked region |
266
+ | `gobi media get-image-status <jobId>` / `download-image <jobId>` | Poll an image job or download the result |
244
267
  | `gobi media create-video --avatar-id <a> --voice-id <v> --script <s>` | Avatar video with voice narration |
245
268
  | `gobi media create-cinematic --prompt <p>` | Cinematic video from a text prompt |
246
- | `gobi media design-avatar / design-avatar-from-selfie` | Custom avatars from prompts or selfies |
269
+ | `gobi media get-video-status <videoId>` / `download-video <videoId>` | Poll a video job or download the result |
270
+ | `gobi media design-avatar / design-avatar-from-selfie / confirm-avatar` | Custom avatars from prompts or selfies; confirm a variant after design |
271
+ | `gobi media get-avatar-job-status <jobId>` | Poll an avatar design job |
247
272
  | `gobi media list-avatars` / `gobi media list-voices` | List available avatars and voices |
248
273
  | `gobi media list-videos` / `gobi media get-video <id>` | List or get videos |
249
274
  | `gobi media upload <file>` | Upload a local file and get a media id |
@@ -252,7 +277,7 @@ Image, video, and avatar generation. See the `gobi-media` skill for full workflo
252
277
 
253
278
  | Option | Scope | Description |
254
279
  |--------|-------|-------------|
255
- | `--json` | All commands | Output structured JSON (`{success, data}` / `{success, error}`) |
280
+ | `--json` | All non-interactive commands | Output structured JSON (`{success, data}` / `{success, error}`). Interactive commands (`gobi auth login`, `gobi vault init`, `gobi update`, `gobi space warp` without a slug) prompt, poll, or stream subprocess output and ignore `--json`. |
256
281
  | `--space-slug <slug>` | `space` commands | Override the default space (from `.gobi/settings.yaml`) |
257
282
  | `--vault-slug <slug>` | Per-command | Override the default vault — see each command's docs |
258
283
 
@@ -264,6 +289,7 @@ Image, video, and avatar generation. See the `gobi-media` skill for full workflo
264
289
  |----------|---------|-------------|
265
290
  | `GOBI_BASE_URL` | `https://api.joingobi.com` | API server URL |
266
291
  | `GOBI_WEBDRIVE_BASE_URL` | `https://webdrive.joingobi.com` | File storage URL |
292
+ | `GOBI_WEB_BASE_URL` | `https://gobispace.com` | Public web URL (used when assembling shareable links) |
267
293
  | `GOBI_SESSION_ID` | — | Default `--session` for `gobi draft add` (set automatically inside agent runs) |
268
294
 
269
295
  ### Files
@@ -284,7 +310,7 @@ The CLI ships a `.claude-plugin/` manifest with skills that wrap the command gro
284
310
  |-------|--------|
285
311
  | `gobi-core` | Auth, update, space list/warp |
286
312
  | `gobi-vault` | `gobi vault init/list/publish/unpublish/sync` |
287
- | `gobi-space` | `gobi space …` and `gobi global …` |
313
+ | `gobi-space` | `gobi space …`, `gobi global …`, and `gobi personal …` |
288
314
  | `gobi-draft` | `gobi draft …` |
289
315
  | `gobi-media` | `gobi media …` |
290
316
  | `gobi-sense` | `gobi sense list-activities/list-transcriptions` |
@@ -188,11 +188,11 @@ export function registerGlobalCommand(program) {
188
188
  // ── Create post ──
189
189
  global
190
190
  .command("create-post")
191
- .description("Create a post in the global feed. --vault-slug attributes it to a vault you own; defaults to your primary vault.")
191
+ .description("Create a post in the global feed. --vault-slug attributes it to a vault you own. With no --vault-slug and no --auto-attachments, the post is created without an authorVaultSlug (vault-less personal post).")
192
192
  .option("--title <title>", "Title of the post")
193
193
  .option("--content <content>", "Post content (markdown supported, use \"-\" for stdin)")
194
194
  .option("--rich-text <richText>", "Rich-text JSON array (mutually exclusive with --content)")
195
- .option("--vault-slug <vaultSlug>", "Attribute the post to this vault (sets authorVaultSlug). Defaults to your primary vault.")
195
+ .option("--vault-slug <vaultSlug>", "Attribute the post to this vault (sets authorVaultSlug). Caller must own the vault.")
196
196
  .option("--auto-attachments", "Upload wiki-linked [[files]] to webdrive before posting (also sets authorVaultSlug to that vault)")
197
197
  .option("--draft-id <draftId>", "Use this draft as the source of title and content (mutually exclusive with --title/--content/--rich-text). On success, links the post back by recording postId on draft.metadata so the client can render an 'Open post' button. The draft's vaultSlug seeds --vault-slug when not given explicitly.")
198
198
  .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], [])
@@ -216,7 +216,7 @@ export function registerMediaCommand(program) {
216
216
  ` ID: ${downloadId}\n` +
217
217
  ` Status: ${status}`);
218
218
  if (status === "inference_complete") {
219
- console.log(` Download: gobi media video-download ${downloadId}`);
219
+ console.log(` Download: gobi media download-video ${downloadId}`);
220
220
  }
221
221
  });
222
222
  media
@@ -418,7 +418,7 @@ export function registerMediaCommand(program) {
418
418
  ` ID: ${downloadId}\n` +
419
419
  ` Status: ${status}`);
420
420
  if (status === "inference_complete") {
421
- console.log(` Download: gobi media video-download ${downloadId}`);
421
+ console.log(` Download: gobi media download-video ${downloadId}`);
422
422
  }
423
423
  });
424
424
  // ════════════════════════════════════════════════════════════════════
@@ -632,7 +632,7 @@ export function registerMediaCommand(program) {
632
632
  console.log(` Download URL: ${imgUrl}`);
633
633
  }
634
634
  else if (status === "queued" || status === "inference_started" || status === "inference_working") {
635
- console.log(` Check: gobi media image-status ${jobId}`);
635
+ console.log(` Check: gobi media get-image-status ${jobId}`);
636
636
  }
637
637
  });
638
638
  media
@@ -190,7 +190,7 @@ export function registerPersonalCommand(program) {
190
190
  .option("--title <title>", "Title of the post")
191
191
  .option("--content <content>", "Post content (markdown supported, use \"-\" for stdin)")
192
192
  .option("--rich-text <richText>", "Rich-text JSON array (mutually exclusive with --content)")
193
- .option("--vault-slug <vaultSlug>", "Attribute the post to this vault (sets authorVaultSlug). Defaults to your primary vault.")
193
+ .option("--vault-slug <vaultSlug>", "Attribute the post to this vault (sets authorVaultSlug). Caller must own the vault.")
194
194
  .option("--auto-attachments", "Upload wiki-linked [[files]] to webdrive before posting (also sets authorVaultSlug to that vault)")
195
195
  .option("--draft-id <draftId>", "Use this draft as the source of title and content (mutually exclusive with --title/--content/--rich-text). On success, links the post back via draft.metadata. The draft's vaultSlug seeds --vault-slug when not given explicitly.")
196
196
  .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], [])
@@ -317,7 +317,7 @@ export function registerSpaceCommand(program) {
317
317
  .option("--content <content>", "Post content (markdown supported, use \"-\" for stdin)")
318
318
  .option("--rich-text <richText>", "Rich-text JSON array (mutually exclusive with --content)")
319
319
  .option("--auto-attachments", "Upload wiki-linked [[files]] to webdrive before posting (also attributes the post to that vault)")
320
- .option("--vault-slug <vaultSlug>", "Attribute the post to this vault (sets authorVaultId). Also used as upload destination for --auto-attachments.")
320
+ .option("--vault-slug <vaultSlug>", "Attribute the post to this vault (sets authorVaultSlug). Also used as upload destination for --auto-attachments.")
321
321
  .option("--space-slug <spaceSlug>", "Space slug (overrides .gobi/settings.yaml)")
322
322
  .option("--draft-id <draftId>", "Use this draft as the source of title and content (mutually exclusive with --title/--content/--rich-text). On success, links the post back by recording postId/spaceSlug on draft.metadata so the client can render an 'Open post' button. The draft's vaultSlug seeds --vault-slug when not given explicitly.")
323
323
  .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], [])
@@ -414,7 +414,7 @@ export function registerSpaceCommand(program) {
414
414
  .option("--content <content>", "New content for the post (markdown supported, use \"-\" for stdin)")
415
415
  .option("--rich-text <richText>", "Rich-text JSON array (mutually exclusive with --content)")
416
416
  .option("--auto-attachments", "Upload wiki-linked [[files]] to webdrive before editing (also attributes the post to that vault)")
417
- .option("--vault-slug <vaultSlug>", "Attribute the post to this vault (sets authorVaultId). Also used as upload destination for --auto-attachments.")
417
+ .option("--vault-slug <vaultSlug>", "Attribute the post to this vault (sets authorVaultSlug). Also used as upload destination for --auto-attachments.")
418
418
  .option("--space-slug <spaceSlug>", "Space slug (overrides .gobi/settings.yaml)")
419
419
  .action(async (postId, opts) => {
420
420
  const wantsVaultChange = !!(opts.vaultSlug || opts.autoAttachments);
@@ -409,13 +409,26 @@ export async function runSync(opts) {
409
409
  basePrivatePatterns = [...currPrivatePatterns];
410
410
  }
411
411
  const privatefilesChanges = computeSyncfilesChanges(basePrivatePatterns, currPrivatePatterns);
412
- // Walk local files (only whitelisted, non-ignored)
413
- if (!jsonMode)
414
- process.stdout.write("Scanning local files...");
415
- const localFiles = walkLocalFiles(vaultDir, state.hashCache, isWhitelisted);
416
- if (!jsonMode)
417
- console.log(` ${localFiles.length} file(s) found.`);
418
- const localPathSet = new Set(localFiles.map((f) => f.path));
412
+ // Walk local files (only whitelisted, non-ignored).
413
+ // Optimization: in download-only mode, skip the full walk + hash. The server
414
+ // will return its own file list via the cursor; we then hash only the files
415
+ // the server tells us about that also exist locally, avoiding work for files
416
+ // that are local-only and irrelevant to a download.
417
+ let localFiles = [];
418
+ let localPathSet = new Set();
419
+ const tWalk = Date.now();
420
+ if (opts.downloadOnly) {
421
+ process.stderr.write(`[gobi-sync] timing walkLocalFiles: skipped (download-only)\n`);
422
+ }
423
+ else {
424
+ if (!jsonMode)
425
+ process.stdout.write("Scanning local files...");
426
+ localFiles = walkLocalFiles(vaultDir, state.hashCache, isWhitelisted);
427
+ if (!jsonMode)
428
+ console.log(` ${localFiles.length} file(s) found.`);
429
+ localPathSet = new Set(localFiles.map((f) => f.path));
430
+ process.stderr.write(`[gobi-sync] timing walkLocalFiles: ${localFiles.length} files in ${Date.now() - tWalk}ms\n`);
431
+ }
419
432
  // Detect and send offline deletions
420
433
  let maxMutationCursor = null;
421
434
  for (const cachedPath of Object.keys(state.hashCache)) {
@@ -444,17 +457,22 @@ export async function runSync(opts) {
444
457
  }
445
458
  // In dry-run mode, include cached-but-locally-deleted files in clientFiles so the
446
459
  // server does not propagate the deletion (the whole point of dry-run is no changes).
447
- const clientFilesForSync = opts.dryRun
448
- ? [
449
- ...localFiles,
450
- ...Object.entries(state.hashCache)
451
- .filter(([p]) => !localPathSet.has(p) && !existsSync(join(vaultDir, p)))
452
- .map(([path, entry]) => ({ path, hash: entry.hash, mtime: entry.mtime })),
453
- ]
454
- : localFiles;
460
+ // In download-only mode, send no clientFiles — the lazy-hash filter below decides
461
+ // per-file whether we already have the server's version.
462
+ const clientFilesForSync = opts.downloadOnly
463
+ ? []
464
+ : opts.dryRun
465
+ ? [
466
+ ...localFiles,
467
+ ...Object.entries(state.hashCache)
468
+ .filter(([p]) => !localPathSet.has(p) && !existsSync(join(vaultDir, p)))
469
+ .map(([path, entry]) => ({ path, hash: entry.hash, mtime: entry.mtime })),
470
+ ]
471
+ : localFiles;
455
472
  // POST sync request
456
473
  if (!jsonMode)
457
474
  process.stdout.write("Syncing with server...");
475
+ const tSync = Date.now();
458
476
  let syncResp;
459
477
  try {
460
478
  syncResp = await performSync(baseUrl, vaultSlug, state, syncfilesChanges, privatefilesChanges, clientFilesForSync, opts, token);
@@ -480,6 +498,38 @@ export async function runSync(opts) {
480
498
  }
481
499
  if (!jsonMode)
482
500
  console.log(` ${syncResp.files.length} action(s).`);
501
+ process.stderr.write(`[gobi-sync] timing performSync: ${syncResp.files.length} actions in ${Date.now() - tSync}ms\n`);
502
+ // Lazy hash filter for download-only: the server returned its file list, but
503
+ // some of those files may already exist locally with the same hash (the common
504
+ // case for a re-activation of an already-synced vault). Drop those actions so
505
+ // we don't redownload identical bytes. hashFile short-circuits via mtime+size
506
+ // when state.hashCache has a matching entry, so warm caches stay cheap.
507
+ if (opts.downloadOnly) {
508
+ const tFilter = Date.now();
509
+ let hashed = 0;
510
+ let alreadyHave = 0;
511
+ syncResp.files = syncResp.files.filter((f) => {
512
+ if (f.action !== "download" || !f.hash)
513
+ return true;
514
+ const absPath = join(vaultDir, f.path);
515
+ if (!existsSync(absPath))
516
+ return true;
517
+ try {
518
+ const entry = hashFile(absPath, f.path, state.hashCache);
519
+ hashed++;
520
+ state.hashCache[f.path] = entry;
521
+ if (entry.hash === f.hash) {
522
+ alreadyHave++;
523
+ return false;
524
+ }
525
+ return true;
526
+ }
527
+ catch {
528
+ return true;
529
+ }
530
+ });
531
+ process.stderr.write(`[gobi-sync] timing downloadFilter: hashed ${hashed}, dropped ${alreadyHave} already-matching, ${syncResp.files.length} remain in ${Date.now() - tFilter}ms\n`);
532
+ }
483
533
  // Write plan file if requested (dry-run + --plan-file)
484
534
  if (opts.dryRun && opts.planFile) {
485
535
  const offlineDeletions = Object.keys(state.hashCache).filter((p) => !localPathSet.has(p) && !existsSync(join(vaultDir, p)));
@@ -167,7 +167,7 @@ export function registerVaultCommand(program) {
167
167
  requireVault(statusCmd);
168
168
  const publishCmd = vault
169
169
  .command("publish")
170
- .description(`Upload ${PUBLISH_FILENAME} to the vault root on webdrive. Triggers post-processing (vault sync, metadata update, Discord notification).`)
170
+ .description(`Upload ${PUBLISH_FILENAME} to the vault root on webdrive. Triggers post-processing (vault sync, metadata update).`)
171
171
  .action(async () => {
172
172
  const vaultId = getVaultSlug();
173
173
  const filePath = join(process.cwd(), PUBLISH_FILENAME);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gobi-ai/cli",
3
- "version": "2.0.22",
3
+ "version": "2.0.23",
4
4
  "description": "CLI client for the Gobi collaborative knowledge platform",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -8,12 +8,12 @@ description: >-
8
8
  allowed-tools: Bash(gobi:*)
9
9
  metadata:
10
10
  author: gobi-ai
11
- version: "2.0.9"
11
+ version: "2.0.23"
12
12
  ---
13
13
 
14
14
  # gobi-core
15
15
 
16
- Core CLI commands for the Gobi collaborative knowledge platform (v2.0.9).
16
+ Core CLI commands for the Gobi collaborative knowledge platform (v2.0.23).
17
17
 
18
18
  ## Prerequisites
19
19
 
@@ -50,7 +50,7 @@ There is **no `gobi init`** command — each setup step is its own command, and
50
50
  | Step | Command | Unlocks |
51
51
  |------|---------|---------|
52
52
  | 1. Log in | `gobi auth login` | All authenticated commands |
53
- | 2. Configure a vault for this directory | `gobi vault init` | Every `gobi vault …` command + lets `global create-post` default to this vault |
53
+ | 2. Configure a vault for this directory | `gobi vault init` | Every `gobi vault …` command; also lets `global create-post --auto-attachments` resolve that vault automatically |
54
54
  | 3. Pick an active space for this directory | `gobi space warp` | Every `gobi space …` post/reply/feed command without needing `--space-slug` |
55
55
 
56
56
  After step 2 + step 3, `.gobi/settings.yaml` looks like:
@@ -80,6 +80,9 @@ gobi auth status
80
80
  | `global feed` / `list-posts` / `get-post` / `delete-post` / `create-reply` / `edit-reply` / `delete-reply` | no | no | – |
81
81
  | `global create-post` | optional¹ | no | command-level `--vault-slug <slug>` |
82
82
  | `global edit-post` | optional² | no | command-level `--vault-slug <slug>` |
83
+ | `personal feed` / `list-posts` / `get-post` / `delete-post` / `create-reply` / `edit-reply` / `delete-reply` | no | no | – |
84
+ | `personal create-post` | optional¹ | no | command-level `--vault-slug <slug>` |
85
+ | `personal edit-post` | optional² | no | command-level `--vault-slug <slug>` |
83
86
 
84
87
  ¹ `global create-post` accepts `--vault-slug` and `--auto-attachments`, both optional. With neither flag and no `vaultSlug` in `.gobi`, the post is created with no `authorVaultSlug` (vault-less personal post) — same as a Space post that isn't attributed to any vault. Set `--vault-slug` (or have `vaultSlug` in `.gobi` plus pass `--auto-attachments`) to attribute it.
85
88
 
@@ -135,4 +138,5 @@ Read-only commands (`auth status`, `space list`) run without confirmation.
135
138
  |----------|---------|-------------|
136
139
  | `GOBI_BASE_URL` | `https://api.joingobi.com` | API server URL |
137
140
  | `GOBI_WEBDRIVE_BASE_URL` | `https://webdrive.joingobi.com` | File storage URL |
141
+ | `GOBI_WEB_BASE_URL` | `https://gobispace.com` | Public web URL (used when assembling shareable links) |
138
142
  | `GOBI_SESSION_ID` | — | Default `--session` for `gobi draft add` (set automatically inside agent runs) |
@@ -11,19 +11,7 @@ Options:
11
11
 
12
12
  Commands:
13
13
  list List spaces you are a member of.
14
- get [options] [spaceSlug] Get details for a space. Pass a slug or omit to use the current space (from .gobi/settings.yaml or --space-slug).
15
14
  warp [spaceSlug] Select the active space. Pass a slug to warp directly, or omit for interactive selection.
16
- list-topics [options] List topics in a space, ordered by most recent content linkage.
17
- list-topic-posts [options] <topicSlug> List posts tagged with a topic in a space (cursor-paginated).
18
- feed [options] List the unified feed (posts and replies, newest first) in a space.
19
- get-post [options] <postId> Get a post with its ancestors and replies (paginated).
20
- list-posts [options] List posts in a space (paginated).
21
- create-post [options] Create a post in a space.
22
- edit-post [options] <postId> Edit a post you authored in a space.
23
- delete-post [options] <postId> Delete a post you authored in a space.
24
- create-reply [options] <postId> Create a reply to a post in a space.
25
- edit-reply [options] <replyId> Edit a reply you authored in a space.
26
- delete-reply [options] <replyId> Delete a reply you authored in a space.
27
15
  help [command] display help for command
28
16
  ```
29
17
 
@@ -10,12 +10,12 @@ description: >-
10
10
  allowed-tools: Bash(gobi:*)
11
11
  metadata:
12
12
  author: gobi-ai
13
- version: "2.0.10"
13
+ version: "2.0.23"
14
14
  ---
15
15
 
16
16
  # gobi-draft
17
17
 
18
- Gobi draft commands for managing agent-authored drafts (v2.0.9).
18
+ Gobi draft commands for managing agent-authored drafts (v2.0.23).
19
19
 
20
20
  Requires gobi-cli installed and authenticated. See gobi-core skill for setup.
21
21
 
@@ -77,13 +77,14 @@ When the user picks an action via `gobi draft action <id> <index>`, the response
77
77
 
78
78
  ## Linking a created post back to its draft
79
79
 
80
- When the user picks an action like "Post to Global Feed" / "Post to <space>" / "Save as note" and your next turn creates the post or note, pass `--draft-id <draftId>` to the relevant create command. `--draft-id` is the **sole** source of `title` and `content` — the CLI fetches the draft and uses its title and content directly, so `--title` / `--content` / `--rich-text` are not allowed alongside it on `create-post`, and `--content` is not allowed alongside it on `create-note`. If you want to change the wording, `gobi draft revise` first, then create.
80
+ When the user picks an action like "Post to Global Feed" / "Post to <space>" / "Save to Personal Space" and your next turn creates the post, pass `--draft-id <draftId>` to the relevant create command. `--draft-id` is the **sole** source of `title` and `content` — the CLI fetches the draft and uses its title and content directly, so `--title` / `--content` / `--rich-text` are not allowed alongside it on `create-post`. If you want to change the wording, `gobi draft revise` first, then create.
81
81
 
82
- - `gobi space create-post --draft-id` / `gobi global create-post --draft-id` — uses draft's title and content as the post's `title` and `content`. The draft's `vaultSlug` (when set) seeds `--vault-slug` if not given explicitly. `--auto-attachments`, `--space-slug`, and an explicit `--vault-slug` override remain allowed. Records `{ postId, spaceSlug? }` on `draft.metadata` for an "Open post" button.
82
+ - `gobi space create-post --draft-id` / `gobi global create-post --draft-id` / `gobi personal create-post --draft-id` — uses draft's title and content as the post's `title` and `content`. The draft's `vaultSlug` (when set) seeds `--vault-slug` if not given explicitly. `--auto-attachments`, `--space-slug`, and an explicit `--vault-slug` override remain allowed. Records `{ postId, spaceSlug? }` on `draft.metadata` for an "Open post" button.
83
83
 
84
84
  ```bash
85
85
  gobi --json global create-post --draft-id <draftId>
86
86
  gobi --json space create-post --space-slug <slug> --draft-id <draftId>
87
+ gobi --json personal create-post --draft-id <draftId>
87
88
  gobi --json global create-post --draft-id <draftId> --auto-attachments
88
89
  ```
89
90
 
@@ -4,6 +4,10 @@ description: >-
4
4
  Developer reference for building Gobi Homepages — custom HTML pages hosted on
5
5
  webdrive and served as a vault's public homepage at gobispace.com/@{vaultSlug}.
6
6
  Use when a developer wants to build or modify a vault homepage.
7
+ allowed-tools: Bash(gobi:*)
8
+ metadata:
9
+ author: gobi-ai
10
+ version: "2.0.23"
7
11
  ---
8
12
 
9
13
  # Gobi Homepage Developer Guide
@@ -307,7 +311,7 @@ Link back to the vault's public page with `?og=1` so the link preview uses the v
307
311
 
308
312
  ```html
309
313
  <footer>
310
- <a href="https://www.gobispace.com/@${gobi.vault.slug}?og=1" target="_blank" rel="noopener">
314
+ <a href="https://gobispace.com/@${gobi.vault.vaultId}?og=1" target="_blank" rel="noopener">
311
315
  POWERED BY GOBI
312
316
  </a>
313
317
  </footer>
@@ -10,12 +10,12 @@ description: >-
10
10
  allowed-tools: Bash(gobi:*)
11
11
  metadata:
12
12
  author: gobi-ai
13
- version: "2.0.9"
13
+ version: "2.0.23"
14
14
  ---
15
15
 
16
16
  # gobi-media
17
17
 
18
- Gobi media generation commands (v2.0.9).
18
+ Gobi media generation commands (v2.0.23).
19
19
 
20
20
  Requires gobi-cli installed and authenticated. See gobi-core skill for setup.
21
21
 
@@ -57,7 +57,7 @@ The `-o` flag implies `--wait` and downloads the image when done.
57
57
  ### Key rules
58
58
  - Replace `<NAME>` with a descriptive slug — NEVER use example names like `sunset.png` literally.
59
59
  - `--name` is **optional** — auto-derived from prompt if omitted.
60
- - Do NOT use the `downloadUrl` from the response — it is a Miraflow-internal path, not a public link. Always download with `-o` then either wiki-link (chat/vault), `--attach` (CLI-authored post/reply), or nothing (post-mention auto-post — the runtime attaches).
60
+ - Do NOT use the `downloadUrl` from the response — it is an internal backend path, not a public link. Always download with `-o` then either wiki-link (chat/vault), `--attach` (CLI-authored post/reply), or nothing (post-mention auto-post — the runtime attaches).
61
61
  - `download-image` takes a **positional** jobId (NOT `--job-id`): `gobi media download-image <jobId>`
62
62
  - The `jobId` (or `id`) field is what you pass to `download-image` / `get-image-status` — NOT `mediaId`.
63
63
 
@@ -7,12 +7,12 @@ description: >-
7
7
  allowed-tools: Bash(gobi:*)
8
8
  metadata:
9
9
  author: gobi-ai
10
- version: "2.0.9"
10
+ version: "2.0.23"
11
11
  ---
12
12
 
13
13
  # gobi-sense
14
14
 
15
- Gobi sense commands for activity and transcription data (v2.0.9).
15
+ Gobi sense commands for activity and transcription data (v2.0.23).
16
16
 
17
17
  Requires gobi-cli installed and authenticated. See the **gobi-core** skill for setup.
18
18
 
@@ -1,32 +1,34 @@
1
1
  ---
2
2
  name: gobi-space
3
3
  description: >-
4
- Gobi space and global commands: read and write posts and replies, browse the
5
- unified feed and topic feeds — in a community space (`gobi space`) or in the
6
- public global feed of personal posts (`gobi global`). Personal Posts and
7
- Space Posts share the same data model; only the scope differs. Use when the
8
- user wants to read or write posts and replies. Space and member admin is
4
+ Gobi space, global, and personal-space commands: read and write posts and
5
+ replies, browse the unified feed and topic feeds — in a community space
6
+ (`gobi space`), in the public global feed of personal posts (`gobi global`),
7
+ or in your private personal-space feed visible only to you (`gobi personal`).
8
+ All three share the same `Post` data model; only the scope differs. Use when
9
+ the user wants to read or write posts and replies. Space and member admin is
9
10
  web-UI only.
10
11
  allowed-tools: Bash(gobi:*)
11
12
  metadata:
12
13
  author: gobi-ai
13
- version: "2.0.10"
14
+ version: "2.0.23"
14
15
  ---
15
16
 
16
17
  # gobi-space
17
18
 
18
- Gobi space and global posts (v2.0.9).
19
+ Gobi space, global, and personal-space posts (v2.0.23).
19
20
 
20
21
  Requires gobi-cli installed and authenticated. See the **gobi-core** skill for setup.
21
22
 
22
- ## Two scopes, one data model
23
+ ## Three scopes, one data model
23
24
 
24
- The same `Post` data type drives both surfaces — the difference is **scope**:
25
+ The same `Post` data type drives all three surfaces — the difference is **scope**:
25
26
 
26
27
  - **Space Post** — `gobi space …` — lives in a community space's feed.
27
- - **Personal Post** — `gobi global …` — lives on the author's profile (their primary vault) and surfaces in the public global feed.
28
+ - **Personal Post** — `gobi global …` — surfaces in the public global feed. When attributed via `--vault-slug` it also surfaces on that vault's profile; with no vault attribution it lives only on the global feed.
29
+ - **Personal-space Post** — `gobi personal …` — private posts and replies visible only to the author. Same shape as `gobi global`, scoped via `personalSpaceUserId` so they never surface on the public feed.
28
30
 
29
- Anything you can do to a Space Post (reply, edit, delete, attribute to a vault) you can do to a Personal Post.
31
+ Anything you can do to a Space Post (reply, edit, delete, attribute to a vault) you can do to a Personal Post or a Personal-space Post.
30
32
 
31
33
  - When the user wants to explore or catch up on what's happening in their space, invoke `/gobi:space-explore`.
32
34
  - When the user wants to share or post learnings from the current session, invoke `/gobi:space-share`.
@@ -34,7 +36,7 @@ Anything you can do to a Space Post (reply, edit, delete, attribute to a vault)
34
36
 
35
37
  ## Authoring posts: title vs. content
36
38
 
37
- `create-post` (and `edit-post`) on both `gobi space` and `gobi global` take `--title` and `--content` as **separate** fields. The title is rendered as the post heading by the UI, so it must not also appear inside `--content`:
39
+ `create-post` (and `edit-post`) on `gobi space`, `gobi global`, and `gobi personal` all take `--title` and `--content` as **separate** fields. The title is rendered as the post heading by the UI, so it must not also appear inside `--content`:
38
40
 
39
41
  - Do **not** repeat the title as a heading (`# My title`) or as the first line of `--content`. The reader will see it twice.
40
42
  - Start `--content` with the body itself.
@@ -45,15 +47,15 @@ The same applies to replies: a reply has only `--content` (no title), so do not
45
47
 
46
48
  ## Author vault attribution (`--vault-slug`)
47
49
 
48
- Both `gobi space create-post` / `edit-post` and `gobi global create-post` / `edit-post` accept `--vault-slug <slug>`. When set, the slug becomes the post's `authorVaultSlug` — the vault the user is posting on behalf of. The caller must hold `role: 'owner'` on that vault. Pass `--vault-slug ""` on edit to detach.
50
+ `create-post` / `edit-post` across all three scopes (`gobi space`, `gobi global`, `gobi personal`) accept `--vault-slug <slug>`. When set, the slug becomes the post's `authorVaultSlug` — the vault the user is posting on behalf of. The caller must hold `role: 'owner'` on that vault. Pass `--vault-slug ""` on edit to detach.
49
51
 
50
52
  `--auto-attachments` resolves a vault for upload and **also** uses it as `authorVaultSlug` automatically — one flag, two effects.
51
53
 
52
- > **Before using `--auto-attachments`, check that the target vault is published.** Run `gobi --json vault status` (or `gobi vault status --vault-slug <slug>`) and verify `isPublished: true`. Files uploaded to a non-public vault are stored on webdrive but are not reachable at `gobispace.com/@{vaultSlug}` — readers will see broken `[[wikilinks]]`. If the status reports unpublished, ask the user to run `gobi vault publish` first (it requires `title` and `description` in `PUBLISH.md`). See the **gobi-vault** skill.
54
+ > **Before using `--auto-attachments`, check that the target vault is published.** Run `gobi --json vault status` (or `gobi vault status --vault-slug <slug>`) and verify `isPublished: true`. Files uploaded to a non-public vault are stored on webdrive but are not reachable at `gobispace.com/@{vaultSlug}` — readers will see broken `[[wikilinks]]`. If the status reports unpublished, ask the user to run `gobi vault publish` first (the server rejects the publish if `title` and `description` are missing from `PUBLISH.md` frontmatter). See the **gobi-vault** skill.
53
55
 
54
56
  ## Post media attachments (`--attach`)
55
57
 
56
- Separate from `--auto-attachments`, `gobi space create-post` and `gobi global create-post` accept `--attach <file>` (repeatable) for inline post media — the photos/GIF/video that render in-feed alongside the post body. The CLI uploads each file to S3 via `POST /posts/upload-url` and passes the resulting `{ mediaUrl, mediaKey }` array as the post's `attachments`.
58
+ Separate from `--auto-attachments`, `create-post` and `create-reply` across all three scopes (`gobi space`, `gobi global`, `gobi personal`) accept `--attach <file>` (repeatable) for inline post media — the photos/GIF/video that render in-feed alongside the post body. The CLI uploads each file to S3 via `POST /posts/upload-url` and passes the resulting `{ mediaUrl, mediaKey }` array as the post's `attachments`.
57
59
 
58
60
  X-style mix rule (enforced client-side before upload): up to **4 photos** OR **1 GIF** OR **1 video** — they don't combine. Server-side ceilings: 5MB photos, 15MB GIFs, 512MB video.
59
61
 
@@ -135,9 +137,25 @@ gobi --json space list-posts
135
137
  - `gobi global edit-reply <replyId>` — Edit a reply you authored. Accepts `--auto-attachments` and `--vault-slug` for attachment uploads (mirrors `space edit-reply`).
136
138
  - `gobi global delete-reply <replyId>` — Delete a reply you authored.
137
139
 
140
+ ### Personal-space posts (private)
141
+
142
+ `gobi personal` mirrors `gobi global`'s subcommand and write-flag shape, but every row is scoped to a private personal space (`personalSpaceUserId`). Nothing here surfaces on the public global feed — these posts are visible only to you. Use for private notes-as-posts, scratch drafts, or any post you want to author against your vault without making it public.
143
+
144
+ A couple of read-side flags don't mirror — `personal feed` has no `--following` (there's no follow graph in a private space), and `personal list-posts` has no `--mine` / `--vault-slug` (everything in the personal space is already yours).
145
+
146
+ - `gobi personal feed` — Your personal-space feed (posts and replies, newest first).
147
+ - `gobi personal list-posts` — List your personal-space posts.
148
+ - `gobi personal get-post <postId>` — Get a personal-space post with its ancestors and replies.
149
+ - `gobi personal create-post` — Create a private personal-space post. Same flags as `gobi global create-post` (`--vault-slug`, `--auto-attachments`, `--draft-id`, `--repost-post-id`, `--attach`).
150
+ - `gobi personal edit-post <postId>` — Edit a personal-space post you authored.
151
+ - `gobi personal delete-post <postId>` — Delete a personal-space post you authored.
152
+ - `gobi personal create-reply <postId>` — Reply to a personal-space post (inherits the parent's private scope).
153
+ - `gobi personal edit-reply <replyId>` — Edit a reply you authored.
154
+ - `gobi personal delete-reply <replyId>` — Delete a reply you authored.
155
+
138
156
  ## Confirm before mutating
139
157
 
140
- Posts and replies are publicly visible — in a community space (`gobi space …`) or in the global feed (`gobi global …`). Before running any write, confirm with the user — show the exact command and the resolved title, content (or a short preview), and `authorVaultSlug` if `--vault-slug` / `--auto-attachments` is set. This applies even when running autonomously.
158
+ Most posts and replies are publicly visible — in a community space (`gobi space …`) or in the global feed (`gobi global …`). `gobi personal …` is the exception: those rows are private to the author. Either way, before running any write, confirm with the user — show the exact command and the resolved title, content (or a short preview), and `authorVaultSlug` if `--vault-slug` / `--auto-attachments` is set. This applies even when running autonomously.
141
159
 
142
160
  - `create-post` / `create-reply` — content goes live on submission.
143
161
 
@@ -153,3 +171,4 @@ Read-only commands (`list-posts`, `get-post`, `feed`, `list-topics`, `list-topic
153
171
 
154
172
  - [gobi space](references/space.md)
155
173
  - [gobi global](references/global.md)
174
+ - [gobi personal](references/personal.md)
@@ -12,7 +12,8 @@ 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; defaults to your primary vault.
15
+ create-post [options] Create a post in the global feed. --vault-slug attributes it to a vault you own. With no --vault-slug and no --auto-attachments, the post is created without an
16
+ authorVaultSlug (vault-less personal post).
16
17
  edit-post [options] <postId> Edit a post you authored in the global feed.
17
18
  delete-post <postId> Delete a post you authored in the global feed.
18
19
  create-reply [options] <postId> Create a reply to a post in the global feed.
@@ -69,13 +70,14 @@ Options:
69
70
  ```
70
71
  Usage: gobi global create-post [options]
71
72
 
72
- Create a post in the global feed. --vault-slug attributes it to a vault you own; defaults to your primary vault.
73
+ Create a post in the global feed. --vault-slug attributes it to a vault you own. With no --vault-slug and no --auto-attachments, the post is created without an authorVaultSlug (vault-less personal
74
+ post).
73
75
 
74
76
  Options:
75
77
  --title <title> Title of the post
76
78
  --content <content> Post content (markdown supported, use "-" for stdin)
77
79
  --rich-text <richText> Rich-text JSON array (mutually exclusive with --content)
78
- --vault-slug <vaultSlug> Attribute the post to this vault (sets authorVaultSlug). Defaults to your primary vault.
80
+ --vault-slug <vaultSlug> Attribute the post to this vault (sets authorVaultSlug). Caller must own the vault.
79
81
  --auto-attachments Upload wiki-linked [[files]] to webdrive before posting (also sets authorVaultSlug to that vault)
80
82
  --draft-id <draftId> Use this draft as the source of title and content (mutually exclusive with --title/--content/--rich-text). On success, links the post back by recording postId on
81
83
  draft.metadata so the client can render an 'Open post' button. The draft's vaultSlug seeds --vault-slug when not given explicitly.
@@ -0,0 +1,154 @@
1
+ # gobi personal
2
+
3
+ ```
4
+ Usage: gobi personal [options] [command]
5
+
6
+ Personal-space commands (private posts and replies visible only to you). Mirrors the `global` subcommand shape — posts/replies live in the same data model, scoped via personalSpaceUserId so they
7
+ never surface on the public feed.
8
+
9
+ Options:
10
+ -h, --help display help for command
11
+
12
+ Commands:
13
+ feed [options] List your personal-space feed (posts and replies, newest first). Only you can see these rows.
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
+ 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.
17
+ edit-post [options] <postId> Edit a post you authored in your personal space.
18
+ delete-post <postId> Delete a post you authored in your personal space.
19
+ create-reply [options] <postId> Reply to a personal-space post. The reply inherits the parent's private scope automatically.
20
+ edit-reply [options] <replyId> Edit a reply you authored in your personal space.
21
+ delete-reply <replyId> Delete a reply you authored in your personal space.
22
+ help [command] display help for command
23
+ ```
24
+
25
+ ## feed
26
+
27
+ ```
28
+ Usage: gobi personal feed [options]
29
+
30
+ List your personal-space feed (posts and replies, newest first). Only you can see these rows.
31
+
32
+ Options:
33
+ --limit <number> Items per page (default: "20")
34
+ --cursor <string> Pagination cursor from previous response
35
+ -h, --help display help for command
36
+ ```
37
+
38
+ ## list-posts
39
+
40
+ ```
41
+ Usage: gobi personal list-posts [options]
42
+
43
+ List root posts (no replies) in your personal space. Filters the personal feed client-side; pagination cursor advances through the underlying feed page.
44
+
45
+ Options:
46
+ --limit <number> Items per page (applied to the underlying feed page) (default: "20")
47
+ --cursor <string> Pagination cursor from previous response
48
+ -h, --help display help for command
49
+ ```
50
+
51
+ ## get-post
52
+
53
+ ```
54
+ Usage: gobi personal get-post [options] <postId>
55
+
56
+ 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.
57
+
58
+ Options:
59
+ --limit <number> Items per page (default: "20")
60
+ --cursor <string> Pagination cursor from previous response
61
+ --full Show full reply content without truncation
62
+ -h, --help display help for command
63
+ ```
64
+
65
+ ## create-post
66
+
67
+ ```
68
+ Usage: gobi personal create-post [options]
69
+
70
+ Create a private post in your personal space. --vault-slug attributes it to a vault you own. Visible only to you.
71
+
72
+ Options:
73
+ --title <title> Title of the post
74
+ --content <content> Post content (markdown supported, use "-" for stdin)
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.
77
+ --auto-attachments Upload wiki-linked [[files]] to webdrive before posting (also sets authorVaultSlug to that vault)
78
+ --draft-id <draftId> Use this draft as the source of title and content (mutually exclusive with --title/--content/--rich-text). On success, links the post back via draft.metadata. The draft's
79
+ vaultSlug seeds --vault-slug when not given explicitly.
80
+ --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
+ --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
82
+ post, or a post in a space you're a member of). Reposting someone else's personal-space post returns 404.
83
+ -h, --help display help for command
84
+ ```
85
+
86
+ ## edit-post
87
+
88
+ ```
89
+ Usage: gobi personal edit-post [options] <postId>
90
+
91
+ Edit a post you authored in your personal space.
92
+
93
+ 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
+ --auto-attachments Upload wiki-linked [[files]] to webdrive before editing (uses --vault-slug or .gobi vault)
99
+ -h, --help display help for command
100
+ ```
101
+
102
+ ## delete-post
103
+
104
+ ```
105
+ Usage: gobi personal delete-post [options] <postId>
106
+
107
+ Delete a post you authored in your personal space.
108
+
109
+ Options:
110
+ -h, --help display help for command
111
+ ```
112
+
113
+ ## create-reply
114
+
115
+ ```
116
+ Usage: gobi personal create-reply [options] <postId>
117
+
118
+ Reply to a personal-space post. The reply inherits the parent's private scope automatically.
119
+
120
+ Options:
121
+ --content <content> Reply content (markdown supported, use "-" for stdin)
122
+ --rich-text <richText> Rich-text JSON array (mutually exclusive with --content)
123
+ --vault-slug <vaultSlug> Attribute the reply to this vault (sets authorVaultSlug). Also used as upload destination for --auto-attachments.
124
+ --auto-attachments Upload wiki-linked [[files]] to webdrive before posting (also attributes the reply to that vault)
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
128
+ ```
129
+
130
+ ## edit-reply
131
+
132
+ ```
133
+ Usage: gobi personal edit-reply [options] <replyId>
134
+
135
+ Edit a reply you authored in your personal space.
136
+
137
+ 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). Also used as upload destination for --auto-attachments.
141
+ --auto-attachments Upload wiki-linked [[files]] to webdrive before editing (also attributes the reply to that vault)
142
+ -h, --help display help for command
143
+ ```
144
+
145
+ ## delete-reply
146
+
147
+ ```
148
+ Usage: gobi personal delete-reply [options] <replyId>
149
+
150
+ Delete a reply you authored in your personal space.
151
+
152
+ Options:
153
+ -h, --help display help for command
154
+ ```
@@ -10,9 +10,7 @@ Options:
10
10
  -h, --help display help for command
11
11
 
12
12
  Commands:
13
- list List spaces you are a member of.
14
13
  get [options] [spaceSlug] Get details for a space. Pass a slug or omit to use the current space (from .gobi/settings.yaml or --space-slug).
15
- warp [spaceSlug] Select the active space. Pass a slug to warp directly, or omit for interactive selection.
16
14
  list-topics [options] List topics in a space, ordered by most recent content linkage.
17
15
  list-topic-posts [options] <topicSlug> List posts tagged with a topic in a space (cursor-paginated).
18
16
  feed [options] List the unified feed (posts and replies, newest first) in a space.
@@ -121,7 +119,7 @@ Options:
121
119
  --content <content> Post content (markdown supported, use "-" for stdin)
122
120
  --rich-text <richText> Rich-text JSON array (mutually exclusive with --content)
123
121
  --auto-attachments Upload wiki-linked [[files]] to webdrive before posting (also attributes the post to that vault)
124
- --vault-slug <vaultSlug> Attribute the post to this vault (sets authorVaultId). Also used as upload destination for --auto-attachments.
122
+ --vault-slug <vaultSlug> Attribute the post to this vault (sets authorVaultSlug). Also used as upload destination for --auto-attachments.
125
123
  --space-slug <spaceSlug> Space slug (overrides .gobi/settings.yaml)
126
124
  --draft-id <draftId> Use this draft as the source of title and content (mutually exclusive with --title/--content/--rich-text). On success, links the post back by recording postId/spaceSlug
127
125
  on draft.metadata so the client can render an 'Open post' button. The draft's vaultSlug seeds --vault-slug when not given explicitly.
@@ -143,7 +141,7 @@ Options:
143
141
  --content <content> New content for the post (markdown supported, use "-" for stdin)
144
142
  --rich-text <richText> Rich-text JSON array (mutually exclusive with --content)
145
143
  --auto-attachments Upload wiki-linked [[files]] to webdrive before editing (also attributes the post to that vault)
146
- --vault-slug <vaultSlug> Attribute the post to this vault (sets authorVaultId). Also used as upload destination for --auto-attachments.
144
+ --vault-slug <vaultSlug> Attribute the post to this vault (sets authorVaultSlug). Also used as upload destination for --auto-attachments.
147
145
  --space-slug <spaceSlug> Space slug (overrides .gobi/settings.yaml)
148
146
  -h, --help display help for command
149
147
  ```
@@ -8,18 +8,23 @@ description: >-
8
8
  allowed-tools: Bash(gobi:*)
9
9
  metadata:
10
10
  author: gobi-ai
11
- version: "2.0.9"
11
+ version: "2.0.23"
12
12
  ---
13
13
 
14
14
  # gobi-vault
15
15
 
16
- Gobi vault commands for publishing your vault profile and syncing files (v2.0.9).
16
+ Gobi vault commands for publishing your vault profile and syncing files (v2.0.23).
17
17
 
18
18
  Requires gobi-cli installed and authenticated. See gobi-core skill for setup.
19
19
 
20
20
  ## Prerequisites
21
21
 
22
- Every `gobi vault …` command **except `vault init`** requires a vault to be configured in the current directory's `.gobi/settings.yaml` (specifically a `vaultSlug` entry). There is no per-call `--vault-slug` override on these commands — the vault is always resolved from `.gobi`. If `.gobi/settings.yaml` is missing or has no `vaultSlug`, run `gobi vault init` first.
22
+ Most `gobi vault …` commands resolve the target vault from the current directory's `.gobi/settings.yaml` (specifically the `vaultSlug` entry); run `gobi vault init` first if it's missing.
23
+
24
+ Exceptions:
25
+ - `vault init`, `vault list`, `vault create <slug>` — no `.gobi` required.
26
+ - `vault delete <slug>`, `vault set-primary <slug>` — slug is a positional, no `.gobi` fallback.
27
+ - `vault rename <newName>`, `vault status` — accept an optional `--vault-slug <slug>` to target a vault other than the one in `.gobi`.
23
28
 
24
29
  ## Gobi Vault
25
30
 
@@ -42,7 +47,7 @@ gobi --json vault publish
42
47
  - `gobi vault rename <newName>` — Rename the configured vault's display name. Pass `--vault-slug <slug>` to target another vault. Local handle only — the public profile title comes from `PUBLISH.md` frontmatter and is unaffected.
43
48
  - `gobi vault set-primary <slug>` — Mark a vault as your primary. Unsets primary on the others. Required arg, no `.gobi` fallback (avoids accidental promotion).
44
49
  - `gobi vault delete <slug>` — Delete a vault. Irreversible. Required arg, no `.gobi` fallback. The API will reject if the vault still owns content; clean up posts, members, and files first.
45
- - `gobi vault publish` — Upload `PUBLISH.md` to the vault root on webdrive. Triggers post-processing (vault profile sync, metadata update, Discord notification).
50
+ - `gobi vault publish` — Upload `PUBLISH.md` to the vault root on webdrive. Triggers post-processing (vault profile sync, metadata update).
46
51
  - `gobi vault unpublish` — Delete `PUBLISH.md` from the vault on webdrive.
47
52
  - `gobi vault sync` — Sync local vault files with Gobi Webdrive. Supports `--upload-only`, `--download-only`, `--conflict <ask|server|client|skip>`, `--dry-run`, `--full`, `--path <p>`, `--plan-file`, `--execute`.
48
53
 
@@ -59,9 +64,9 @@ When linking back to your own posts or files, assemble the URL from concrete fie
59
64
 
60
65
  ## Confirm before mutating
61
66
 
62
- Every command in this skill writes external state — webdrive files, the public vault profile, and a Discord notification on `publish`. Before running any of them, confirm with the user — show the exact command and the key changes (which `PUBLISH.md` fields, which paths will sync, which conflict policy). This applies even when running autonomously.
67
+ Every command in this skill writes external state — webdrive files and the public vault profile. Before running any of them, confirm with the user — show the exact command and the key changes (which `PUBLISH.md` fields, which paths will sync, which conflict policy). This applies even when running autonomously.
63
68
 
64
- - `vault publish` — public profile change + Discord ping. Always confirm.
69
+ - `vault publish` — public profile change. Always confirm.
65
70
  - `vault unpublish` — removes the live profile. Always confirm.
66
71
  - `vault sync` — can overwrite remote or local files. Run `--dry-run` first and show the user the plan before re-running without `--dry-run`. With `--conflict server` or `--conflict client`, name which side is going to be overwritten.
67
72
  - `vault delete <slug>` — irreversible; cannot undo. Confirm the slug and that the user actually means to delete *that* vault before running.
@@ -120,7 +125,7 @@ After editing `PUBLISH.md` frontmatter, follow these steps to make your changes
120
125
  ```bash
121
126
  gobi vault publish
122
127
  ```
123
- This uploads `PUBLISH.md` to webdrive, triggers post-processing that extracts metadata (title, description, tags, thumbnail, homepage path), updates the vault's public profile, and sends a Discord notification.
128
+ This uploads `PUBLISH.md` to webdrive, triggers post-processing that extracts metadata (title, description, tags, thumbnail, homepage path), and updates the vault's public profile.
124
129
  4. The vault is now live at `https://gobispace.com/@{vaultSlug}`.
125
130
 
126
131
  > **Important:** Any time you change `PUBLISH.md` frontmatter (e.g. adding or updating `homepage`), you must re-run `gobi vault publish` for the changes to take effect.
@@ -19,7 +19,7 @@ Commands:
19
19
  set-primary <slug> Mark a vault as your primary. Unsets primary on the other vaults you own. Slug must be passed explicitly.
20
20
  list List vaults you own.
21
21
  status [options] Show the configured vault's publish state and metadata (use before posting with --auto-attachments to confirm the vault is public).
22
- publish Upload PUBLISH.md to the vault root on webdrive. Triggers post-processing (vault sync, metadata update, Discord notification).
22
+ publish Upload PUBLISH.md to the vault root on webdrive. Triggers post-processing (vault sync, metadata update).
23
23
  unpublish Delete PUBLISH.md from the vault on webdrive.
24
24
  sync [options] Sync local vault files with Gobi Webdrive.
25
25
  help [command] display help for command
@@ -112,7 +112,7 @@ Options:
112
112
  ```
113
113
  Usage: gobi vault publish [options]
114
114
 
115
- Upload PUBLISH.md to the vault root on webdrive. Triggers post-processing (vault sync, metadata update, Discord notification).
115
+ Upload PUBLISH.md to the vault root on webdrive. Triggers post-processing (vault sync, metadata update).
116
116
 
117
117
  Options:
118
118
  -h, --help display help for command