@gobi-ai/cli 2.0.36 → 2.0.40

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.36",
7
+ "version": "2.0.40",
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.36",
12
+ "version": "2.0.40",
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.36",
4
+ "version": "2.0.40",
5
5
  "author": {
6
6
  "name": "gobi-ai"
7
7
  },
package/README.md CHANGED
@@ -53,9 +53,9 @@ gobi vault publish
53
53
  # Sync local files with the webdrive
54
54
  gobi vault sync
55
55
 
56
- # Browse the global feed and create a personal post
57
- gobi global feed
58
- gobi global create-post --title "Hello" --content "Trying gobi"
56
+ # Browse your personal feed and create a private post
57
+ gobi personal feed
58
+ gobi personal create-post --title "Hello" --content "Trying gobi"
59
59
  ```
60
60
 
61
61
  Each setup step unlocks a different family of commands — run only the ones the workflow needs:
@@ -74,7 +74,7 @@ Everything below applies whether you're building a Claude Code skill, an autonom
74
74
 
75
75
  ### JSON envelope
76
76
 
77
- Pass `--json` as a **global flag** (before the subcommand) and every command returns a structured envelope:
77
+ Pass `--json` as a **top-level flag** (before the subcommand) and every command returns a structured envelope:
78
78
 
79
79
  ```sh
80
80
  gobi --json space list-posts
@@ -165,7 +165,7 @@ Public vaults are accessible at `https://gobispace.com/@{vaultSlug}`.
165
165
 
166
166
  ### Spaces
167
167
 
168
- A *Space* is a community knowledge area. A *Space Post* lives in one space. The same `Post` data type, in a different scope, is a *Personal Post* (see Global feed below) — so anything you can do to a Space Post you can do to a Personal Post.
168
+ A *Space* is a community knowledge area. A *Space Post* lives in one space. The same `Post` data type, in a different scope, is a private *personal-space post* (see Personal space below) — so anything you can do to a Space Post you can do to a personal-space post.
169
169
 
170
170
  > Space and member administration (creating spaces, inviting/approving members, joining/leaving) is web-UI only and not available in the CLI.
171
171
 
@@ -184,50 +184,41 @@ A *Space* is a community knowledge area. A *Space Post* lives in one space. The
184
184
  | `gobi space edit-reply <replyId> [--content <c>] [--rich-text <json>]` | Edit a reply you authored. |
185
185
  | `gobi space delete-reply <replyId>` | Delete a reply you authored |
186
186
 
187
- ### Global feed (personal posts)
188
-
189
- A *Personal Post* surfaces in the public global feed. Same `Post` model as a Space Post, scoped to the user instead of a space.
190
-
191
- | Command | Description |
192
- |---------|-------------|
193
- | `gobi global feed [--following]` | List the global public feed (posts + replies, newest first). `--following` limits to authors you follow. |
194
- | `gobi global list-posts [--mine]` | List personal posts; filter to your own |
195
- | `gobi global get-post <postId> [--full]` | Get a personal post with its ancestors and replies. `--full` shows reply content without truncation. |
196
- | `gobi global create-post [--title <t>] (--content <c> \| --rich-text <json>) [--artifact <artifactId>]… [--repost-post-id <id>] [--attach <file>]…` | Create a personal post. `--artifact` attaches an existing artifact to the post (repeatable). `--repost-post-id` reposts an existing post. `--attach` uploads local media for inline rendering (see `gobi space create-post` above for the mix rule). |
197
- | `gobi global edit-post <postId> [--title <t>] [--content <c>]` | Edit a personal post you authored. |
198
- | `gobi global delete-post <postId>` | Delete a personal post you authored |
199
- | `gobi global create-reply <postId> (--content <c> \| --rich-text <json>) [--attach <file>]…` | Create a reply to a personal post |
200
- | `gobi global edit-reply <replyId> [--content <c>] [--rich-text <json>]` | Edit a reply you authored. |
201
- | `gobi global delete-reply <replyId>` | Delete a reply you authored |
202
-
203
187
  ### Personal space (private posts)
204
188
 
205
- > 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.
206
-
207
- 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.
189
+ Private posts and replies visible only to you. Same `Post` data model and subcommand shape as a Space Post, but scoped to a personal spacethey never appear in any public feed.
208
190
 
209
191
  | Command | Description |
210
192
  |---------|-------------|
211
193
  | `gobi personal feed` | Your personal-space feed (posts + replies, newest first) |
212
194
  | `gobi personal list-posts` | List personal-space posts |
213
195
  | `gobi personal get-post <postId> [--full]` | Get a personal-space post with its ancestors and replies |
214
- | `gobi personal create-post [--title <t>] (--content <c> \| --rich-text <json>) [--artifact <artifactId>]… [--repost-post-id <id>] [--attach <file>]…` | Create a private post in your personal space. `--artifact` attaches an existing artifact to the post (repeatable). `--attach` works the same as on `gobi global create-post`. |
196
+ | `gobi personal create-post [--title <t>] (--content <c> \| --rich-text <json>) [--artifact <artifactId>]… [--repost-post-id <id>] [--attach <file>]…` | Create a private post in your personal space. `--artifact` attaches an existing artifact to the post (repeatable). `--attach` works the same as on `gobi space create-post`. |
215
197
  | `gobi personal edit-post <postId> [--title <t>] [--content <c>]` | Edit a personal-space post you authored |
216
198
  | `gobi personal delete-post <postId>` | Delete a personal-space post you authored |
217
199
  | `gobi personal create-reply <postId> (--content <c> \| --rich-text <json>) [--attach <file>]…` | Reply to a personal-space post (inherits the parent's private scope) |
218
200
  | `gobi personal edit-reply <replyId> [--content <c>] [--rich-text <json>]` | Edit a reply you authored |
219
201
  | `gobi personal delete-reply <replyId>` | Delete a reply you authored |
220
202
 
221
- ### Sense
203
+ ### Sense (activities & conversations)
204
+
205
+ Activity and conversation data captured by Gobi Sense (the wearable) and the mobile app, then ingested by the cloud pipeline. Read-only. See the `gobi-sense` skill for full workflows.
206
+
207
+ Like posts and artifacts, Sense data is **scoped to a space**: the subcommands live under `gobi personal …` (your personal space) and `gobi space …` (the active team space — `gobi space warp <slug>` or `gobi space --space-slug <slug> …`). `<scope>` below is `personal` or `space`.
222
208
 
223
- Activity and transcription data captured by Gobi Sense (or the mobile app).
209
+ - **activities** what you were doing (category + details, start/end times). In a team space, every member's activities show up, attributed to their recorder.
210
+ - **conversations** — phone-mic Audio Logs plus Sense-detected conversations, each with a transcript and auto-generated summary. In a team space, every member's conversations show up, attributed to their recorder (transcript/audio stay owner-only). (This replaces the old `list-transcriptions` — transcriptions were unified into conversations.)
224
211
 
225
212
  | Command | Description |
226
213
  |---------|-------------|
227
- | `gobi sense list-activities --start-time <iso> --end-time <iso>` | List activity records in a time range |
228
- | `gobi sense list-transcriptions --start-time <iso> --end-time <iso>` | List transcription records in a time range |
214
+ | `gobi <scope> activities list [--limit N] [--before <cursor>] [--mine]` | List Sense activities in this scope (newest first) |
215
+ | `gobi <scope> activities get <activityId>` | Get one activity's details |
216
+ | `gobi <scope> activities transcript <activityId>` | Get an activity's transcript (owner-only) |
217
+ | `gobi <scope> conversations list [--limit N] [--before <cursor>] [--mine]` | List conversations captured in this scope (newest first) |
218
+ | `gobi <scope> conversations transcript <conversationId>` | Get a conversation's transcript and summary |
219
+ | `gobi <scope> conversations audio <conversationId>` | Get a signed URL for the recording (owner-only) |
229
220
 
230
- Times are ISO 8601 UTC (e.g. `2026-03-20T00:00:00Z`).
221
+ `gobi space …` lists are a complete, fully-paginated per-space history (every member's records); add `--mine` to restrict either `list` to records you recorded. `gobi personal conversations list` is filtered from the cross-scope conversations feed, so it shows your recent personal conversations rather than a fully paginated history (`gobi personal activities list` is fully paginated).
231
222
 
232
223
  ### Artifacts
233
224
 
@@ -268,7 +259,7 @@ Image, video, and avatar generation. See the `gobi-media` skill for full workflo
268
259
  | `gobi media list-videos` / `gobi media get-video <id>` | List or get videos |
269
260
  | `gobi media upload <file>` | Upload a local file and get a media id |
270
261
 
271
- ### Global options
262
+ ### Top-level options
272
263
 
273
264
  | Option | Scope | Description |
274
265
  |--------|-------|-------------|
@@ -304,10 +295,10 @@ The CLI ships a `.claude-plugin/` manifest with skills that wrap the command gro
304
295
  |-------|--------|
305
296
  | `gobi-core` | Auth, update, space list/warp |
306
297
  | `gobi-vault` | `gobi vault init/list/publish/unpublish/sync` |
307
- | `gobi-space` | `gobi space …`, `gobi global …`, and `gobi personal …` |
298
+ | `gobi-space` | `gobi space …` and `gobi personal …` |
308
299
  | `gobi-artifact` | `gobi personal artifact …` and `gobi space artifact …` |
309
300
  | `gobi-media` | `gobi media …` |
310
- | `gobi-sense` | `gobi sense list-activities/list-transcriptions` |
301
+ | `gobi-sense` | `gobi personal activities/conversations …` and `gobi space activities/conversations …` |
311
302
  | `gobi-homepage` | Building custom HTML homepages with `window.gobi` |
312
303
 
313
304
  Each skill's `SKILL.md` is hand-written orientation; `references/` is regenerated from `--help` output by `npm run generate-skill-docs`.
package/commands/login.md CHANGED
@@ -4,7 +4,7 @@ description: Log in to Gobi via Google OAuth
4
4
  argument-hint: ""
5
5
  ---
6
6
 
7
- Always use the globally installed `gobi` binary (not via npx or ts-node).
7
+ Always use the installed `gobi` binary on your PATH (not via npx or ts-node).
8
8
 
9
9
  Log the user in to Gobi using device code flow:
10
10
 
@@ -4,7 +4,7 @@ description: Log out of Gobi and remove stored credentials
4
4
  argument-hint: ""
5
5
  ---
6
6
 
7
- Always use the globally installed `gobi` binary (not via npx or ts-node).
7
+ Always use the installed `gobi` binary on your PATH (not via npx or ts-node).
8
8
 
9
9
  Run `gobi auth logout` to log out of Gobi.
10
10
 
package/commands/post.md CHANGED
@@ -5,7 +5,7 @@ argument-hint: "[approval|bypass]"
5
5
  disable-model-invocation: true
6
6
  ---
7
7
 
8
- Always use the globally installed `gobi` binary (not via npx or ts-node).
8
+ Always use the installed `gobi` binary on your PATH (not via npx or ts-node).
9
9
 
10
10
  ## Argument: permissionMode
11
11
 
@@ -4,17 +4,15 @@ description: Explore what's happening in the active Gobi space — posts and lea
4
4
  argument-hint: "[topic or keyword]"
5
5
  ---
6
6
 
7
- Always use the globally installed `gobi` binary (not via npx or ts-node).
7
+ Always use the installed `gobi` binary on your PATH (not via npx or ts-node).
8
8
 
9
9
  Explore the active Gobi space to surface posts, topics, and learnings from others:
10
10
 
11
- 1. Run these three commands in parallel:
11
+ 1. Run these two commands in parallel:
12
12
  - `gobi --json space list-posts` — recent posts in the space
13
13
  - `gobi --json space list-topics` — available topics in the space
14
- - `gobi --json global feed` recent posts and replies shared by members across the platform
15
- 2. Display results in a readable summary, grouped by type (Topics / Space posts / Global feed).
14
+ 2. Display results in a readable summary, grouped by type (Topics / Space posts).
16
15
  3. If `$ARGUMENTS` is provided, filter or highlight entries relevant to that topic or keyword. If a matching topic is found, also run `gobi --json space list-topic-posts <topicSlug>` to show posts tagged with that topic.
17
16
  4. Ask the user if they'd like to read anything in full:
18
17
  - For a topic: run `gobi space list-topic-posts <topicSlug>` and show the posts.
19
18
  - For a space post: run `gobi space get-post <postId>` and show it with ancestors and replies.
20
- - For a global feed post: run `gobi global get-post <postId>` to show it with ancestors and replies.
@@ -1,10 +1,10 @@
1
1
  ---
2
2
  name: space-share
3
- description: Summarize recent learnings from this session and draft a personal post to share to the global feed.
3
+ description: Summarize recent learnings from this session and draft a post to share to a Gobi space.
4
4
  argument-hint: "[context]"
5
5
  ---
6
6
 
7
- Always use the globally installed `gobi` binary (not via npx or ts-node).
7
+ Always use the installed `gobi` binary on your PATH (not via npx or ts-node).
8
8
 
9
9
  ## Pre-flight check
10
10
 
@@ -16,7 +16,7 @@ gobi --json auth status
16
16
 
17
17
  Check that `.gobi/settings.yaml` exists. If you plan to publish to a Space (`gobi space create-post`), it must contain `selectedSpaceSlug` — otherwise stop and ask the user to run `gobi space warp` first.
18
18
 
19
- ## Draft a personal post
19
+ ## Draft a post
20
20
 
21
21
  If `$ARGUMENTS` is provided, treat it as additional context or emphasis to guide the draft (e.g. "Emphasize the auth fix" or "Focus on the API design decision").
22
22
 
@@ -36,16 +36,16 @@ Focus on:
36
36
 
37
37
  Format the draft as a short post (2–5 bullet points max). Show it to the user and ask for confirmation before posting.
38
38
 
39
- Once confirmed, post it to the global feed:
39
+ Once confirmed, post it to the active space:
40
40
 
41
41
  ```bash
42
- gobi global create-post --title "<short title>" --content "<confirmed content>"
42
+ gobi space create-post --title "<short title>" --content "<confirmed content>"
43
43
  ```
44
44
 
45
- Or to the active space:
45
+ Or keep it private in your personal space:
46
46
 
47
47
  ```bash
48
- gobi space create-post --title "<short title>" --content "<confirmed content>"
48
+ gobi personal create-post --title "<short title>" --content "<confirmed content>"
49
49
  ```
50
50
 
51
51
  Confirm success and show the user the result.
package/commands/warp.md CHANGED
@@ -6,7 +6,7 @@ argument-hint: "[spaceSlug]"
6
6
 
7
7
  Warp to a Gobi space:
8
8
 
9
- Always use the globally installed `gobi` binary (not npx or ts-node).
9
+ Always use the installed `gobi` binary on your PATH (not npx or ts-node).
10
10
 
11
11
  - If a space slug is provided as `$ARGUMENTS`, run `gobi space warp $ARGUMENTS` directly.
12
12
  - If no argument is given:
@@ -2,6 +2,7 @@ import { apiGet, apiPost, apiPatch, apiPut, apiDelete } from "../client.js";
2
2
  import { buildMentionMap, formatAttachmentLines, formatAttachmentSummary, formatPostLabel, formatReactionChips, formatReplyLine, isJsonMode, jsonOut, postBodyText, readStdin, unwrapResp, } from "./utils.js";
3
3
  import { uploadPostAttachments, assertPostAttachmentMix, } from "../attachments.js";
4
4
  import { registerArtifactSubcommands } from "./artifact.js";
5
+ import { registerActivitiesSubcommands, registerConversationsSubcommands, } from "./sense.js";
5
6
  function readContent(value) {
6
7
  if (value === "-")
7
8
  return readStdin();
@@ -32,8 +33,8 @@ export function registerPersonalCommand(program) {
32
33
  const personal = program
33
34
  .command("personal")
34
35
  .description("Personal-space commands (private posts and replies visible only to you). " +
35
- "Mirrors the `global` subcommand shape — posts/replies live in the same data " +
36
- "model, scoped via personalSpaceUserId so they never surface on the public feed.");
36
+ "Posts/replies live in the same data model as space posts, scoped via " +
37
+ "personalSpaceUserId so they never surface on the public feed.");
37
38
  // ── Feed (unified) ──
38
39
  personal
39
40
  .command("feed")
@@ -165,13 +166,13 @@ export function registerPersonalCommand(program) {
165
166
  });
166
167
  // ── Get post (with ancestors and replies) ──
167
168
  //
168
- // Same `/posts/:id` and `/posts/:id/ancestors` routes the global command
169
- // uses — the server gates these by `viewerUserId`, so private rows
170
- // resolve for the owner and 404 for everyone else. Personal-space posts
171
- // and global posts share this endpoint without ambiguity.
169
+ // The shared `/posts/:id` and `/posts/:id/ancestors` routes the server
170
+ // gates these by `viewerUserId`, so private rows resolve for the owner and
171
+ // 404 for everyone else. Personal-space and public posts share this
172
+ // endpoint without ambiguity.
172
173
  personal
173
174
  .command("get-post <postId>")
174
- .description("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.")
175
+ .description("Get a personal-space post with its ancestors and replies (paginated). Only the owner can resolve a private id.")
175
176
  .option("--limit <number>", "Items per page", "20")
176
177
  .option("--cursor <string>", "Pagination cursor from previous response")
177
178
  .option("--full", "Show full reply content without truncation")
@@ -245,8 +246,8 @@ export function registerPersonalCommand(program) {
245
246
  // ── Create post ──
246
247
  //
247
248
  // Targets `POST /posts/personal-space`, the only endpoint that stamps
248
- // `personalSpaceUserId` on the row. Body shape is identical to the
249
- // global `POST /posts` create (same CreatePostDto). The server skips the
249
+ // `personalSpaceUserId` on the row. Body shape is identical to the public
250
+ // `POST /posts` create (same CreatePostDto). The server skips the
250
251
  // `@gobi` mention dispatch and the notification fan-out for this lane —
251
252
  // private posts have no audience.
252
253
  personal
@@ -257,7 +258,7 @@ export function registerPersonalCommand(program) {
257
258
  .option("--rich-text <richText>", "Rich-text JSON array (mutually exclusive with --content)")
258
259
  .option("--artifact <artifactId>", "Attach an existing artifact to the post (repeatable). Create artifacts with `gobi personal artifact create`.", (value, prev = []) => [...prev, value], [])
259
260
  .option("--attach <file>", "Local media or document file to attach. Repeatable. Mix rule: up to 4 photos + up to 4 document files (pdf/md/txt/csv) OR 1 GIF OR 1 video. Size ceilings: 10MB photos / 15MB GIFs / 512MB video / 250MB files.", (value, prev = []) => [...prev, value], [])
260
- .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.")
261
+ .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 public post, or a post in a space you're a member of). Reposting someone else's personal-space post returns 404.")
261
262
  .action(async (opts) => {
262
263
  // A post is substantive if it has a text body OR carries an attachment
263
264
  // (artifact card / media) OR embeds a repost. Only block the truly empty
@@ -315,9 +316,9 @@ export function registerPersonalCommand(program) {
315
316
  });
316
317
  // ── Edit post ──
317
318
  //
318
- // Same `PATCH /posts/:postId` route the global command uses — the server
319
- // gates on `authorId === userId` and the read-path guard runs first, so
320
- // a non-owner can't edit (or even discover) a private post.
319
+ // The shared `PATCH /posts/:postId` route — the server gates on
320
+ // `authorId === userId` and the read-path guard runs first, so a non-owner
321
+ // can't edit (or even discover) a private post.
321
322
  personal
322
323
  .command("edit-post <postId>")
323
324
  .description("Edit a post you authored in your personal space.")
@@ -385,8 +386,8 @@ export function registerPersonalCommand(program) {
385
386
  //
386
387
  // `POST /posts/:postId/replies` inherits scope from the parent on the
387
388
  // server — reply to a personal-space parent → reply is scoped to that
388
- // personal space. The same command works for global and personal; we
389
- // expose it here for discoverability/symmetry with `gobi global`.
389
+ // personal space. The same server route backs space and personal replies;
390
+ // we expose it here for discoverability under `gobi personal`.
390
391
  personal
391
392
  .command("create-reply <postId>")
392
393
  .description("Reply to a personal-space post. The reply inherits the parent's private scope automatically.")
@@ -505,4 +506,27 @@ export function registerPersonalCommand(program) {
505
506
  registerArtifactSubcommands(personal, { resolve: () => ({}) }, "Versioned creations attached to posts, scoped to your personal space (visible " +
506
507
  "only to you). Kinds: image | video | gif | markdown | meeting_summary. Always " +
507
508
  "human-owned; revisions form a draft/published tree (one published per artifact).");
509
+ // ── Sense: activities + conversations (scoped to your personal space) ──
510
+ const senseScope = {
511
+ label: "personal",
512
+ listActivities: async (params) => {
513
+ const resp = (await apiGet("/app/activities", params));
514
+ return {
515
+ items: (resp.activities || []),
516
+ pagination: resp.pagination,
517
+ };
518
+ },
519
+ // `/app/conversations` spans all the user's scopes (newest ~50, no paging);
520
+ // filter to the personal scope (spaceId 0). Params are ignored — the endpoint
521
+ // takes none.
522
+ listConversations: async () => {
523
+ const resp = (await apiGet("/app/conversations"));
524
+ const all = (resp.conversations || []);
525
+ return { items: all.filter((c) => Number(c.spaceId ?? 0) === 0) };
526
+ },
527
+ };
528
+ registerActivitiesSubcommands(personal, senseScope, "Your personal Sense activities (what you were doing, from the wearable/app), " +
529
+ "browse-only. Recorded in your personal space (visible only to you).");
530
+ registerConversationsSubcommands(personal, senseScope, "Your personal Sense conversations (phone-mic Audio Logs + detected conversations), " +
531
+ "browse-only. Recorded in your personal space (visible only to you).");
508
532
  }