@gobi-ai/cli 1.3.7 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +6 -7
- package/.claude-plugin/plugin.json +4 -5
- package/README.md +78 -89
- package/commands/space-explore.md +10 -10
- package/commands/space-share.md +13 -7
- package/dist/commands/draft.js +213 -0
- package/dist/commands/global.js +205 -70
- package/dist/commands/init.js +5 -5
- package/dist/commands/{notes.js → saved.js} +112 -19
- package/dist/commands/space.js +92 -97
- package/dist/commands/sync.js +2 -56
- package/dist/commands/vault.js +113 -0
- package/dist/main.js +6 -10
- package/package.json +2 -2
- package/skills/gobi-core/SKILL.md +5 -7
- package/skills/gobi-core/references/space.md +18 -19
- package/skills/gobi-draft/SKILL.md +74 -0
- package/skills/gobi-draft/references/draft.md +109 -0
- package/skills/gobi-homepage/SKILL.md +16 -16
- package/skills/gobi-saved/SKILL.md +59 -0
- package/skills/gobi-saved/references/saved.md +52 -0
- package/skills/gobi-space/SKILL.md +34 -31
- package/skills/gobi-space/references/global.md +84 -24
- package/skills/gobi-space/references/space.md +45 -57
- package/skills/gobi-vault/SKILL.md +92 -0
- package/skills/{gobi-core/references/sync.md → gobi-vault/references/vault.md} +41 -2
- package/dist/commands/brain.js +0 -141
- package/dist/commands/feed.js +0 -148
- package/dist/commands/proposal.js +0 -185
- package/skills/gobi-brain/SKILL.md +0 -100
- package/skills/gobi-brain/references/brain.md +0 -66
- package/skills/gobi-feed/SKILL.md +0 -43
- package/skills/gobi-feed/references/feed.md +0 -80
- package/skills/gobi-notes/SKILL.md +0 -52
- package/skills/gobi-notes/references/notes.md +0 -82
- package/skills/gobi-proposal/SKILL.md +0 -66
- package/skills/gobi-proposal/references/proposal.md +0 -116
package/dist/commands/feed.js
DELETED
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
import { readFileSync } from "fs";
|
|
2
|
-
import { apiGet, apiPost, apiPatch, apiDelete } from "../client.js";
|
|
3
|
-
import { isJsonMode, jsonOut, unwrapResp } from "./utils.js";
|
|
4
|
-
export function registerFeedCommand(program) {
|
|
5
|
-
const feed = program
|
|
6
|
-
.command("feed")
|
|
7
|
-
.description("Feed of brain updates from people across the platform.");
|
|
8
|
-
// ── List ──
|
|
9
|
-
feed
|
|
10
|
-
.command("list")
|
|
11
|
-
.description("List recent brain updates from the global public feed.")
|
|
12
|
-
.option("--limit <number>", "Items per page", "20")
|
|
13
|
-
.option("--cursor <string>", "Pagination cursor from previous response")
|
|
14
|
-
.action(async (opts) => {
|
|
15
|
-
const params = {
|
|
16
|
-
limit: parseInt(opts.limit, 10),
|
|
17
|
-
};
|
|
18
|
-
if (opts.cursor)
|
|
19
|
-
params.cursor = opts.cursor;
|
|
20
|
-
const resp = (await apiGet(`/feed`, params));
|
|
21
|
-
if (isJsonMode(feed)) {
|
|
22
|
-
jsonOut({
|
|
23
|
-
items: resp.data || [],
|
|
24
|
-
pagination: resp.pagination || {},
|
|
25
|
-
mentions: resp.mentions || {},
|
|
26
|
-
});
|
|
27
|
-
return;
|
|
28
|
-
}
|
|
29
|
-
const items = (resp.data || []);
|
|
30
|
-
const pagination = (resp.pagination || {});
|
|
31
|
-
if (!items.length) {
|
|
32
|
-
console.log("No feed items found.");
|
|
33
|
-
return;
|
|
34
|
-
}
|
|
35
|
-
const lines = [];
|
|
36
|
-
for (const u of items) {
|
|
37
|
-
const author = u.author?.name ||
|
|
38
|
-
`User ${u.authorId}`;
|
|
39
|
-
const vaultSlug = u.vault?.vaultSlug ||
|
|
40
|
-
u.authorVault?.vaultSlug ||
|
|
41
|
-
"?";
|
|
42
|
-
const replyCount = u.replyCount ?? 0;
|
|
43
|
-
const replies = replyCount ? `, ${replyCount} ${replyCount === 1 ? "reply" : "replies"}` : "";
|
|
44
|
-
lines.push(`- [${u.id}] "${u.title}" by ${author} (vault: ${vaultSlug}, ${u.createdAt}${replies})`);
|
|
45
|
-
}
|
|
46
|
-
const footer = pagination.hasMore
|
|
47
|
-
? `\n Next cursor: ${pagination.nextCursor}`
|
|
48
|
-
: "";
|
|
49
|
-
console.log(`Feed (${items.length} items):\n` + lines.join("\n") + footer);
|
|
50
|
-
});
|
|
51
|
-
// ── Get ──
|
|
52
|
-
feed
|
|
53
|
-
.command("get <updateId>")
|
|
54
|
-
.description("Get a feed brain update and its replies (paginated).")
|
|
55
|
-
.option("--limit <number>", "Replies per page", "20")
|
|
56
|
-
.option("--cursor <string>", "Pagination cursor from previous response")
|
|
57
|
-
.option("--full", "Show full reply content without truncation")
|
|
58
|
-
.action(async (updateId, opts) => {
|
|
59
|
-
const params = {
|
|
60
|
-
limit: parseInt(opts.limit, 10),
|
|
61
|
-
};
|
|
62
|
-
if (opts.cursor)
|
|
63
|
-
params.cursor = opts.cursor;
|
|
64
|
-
const resp = (await apiGet(`/feed/${updateId}`, params));
|
|
65
|
-
const data = unwrapResp(resp);
|
|
66
|
-
const pagination = (resp.pagination || {});
|
|
67
|
-
const mentions = (resp.mentions || {});
|
|
68
|
-
if (isJsonMode(feed)) {
|
|
69
|
-
jsonOut({ ...data, pagination, mentions });
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
72
|
-
const update = (data.update || data);
|
|
73
|
-
const replies = (data.replies || []);
|
|
74
|
-
const author = update.author?.name ||
|
|
75
|
-
`User ${update.authorId}`;
|
|
76
|
-
const vault = update.vault?.vaultSlug ||
|
|
77
|
-
update.authorVault?.vaultSlug ||
|
|
78
|
-
"?";
|
|
79
|
-
const replyLines = [];
|
|
80
|
-
for (const r of replies) {
|
|
81
|
-
const rAuthor = r.author?.name ||
|
|
82
|
-
`User ${r.authorId}`;
|
|
83
|
-
const text = r.content || "";
|
|
84
|
-
const truncated = opts.full || text.length <= 200 ? text : text.slice(0, 200) + "…";
|
|
85
|
-
replyLines.push(` - ${rAuthor}: ${truncated} (${r.createdAt})`);
|
|
86
|
-
}
|
|
87
|
-
const output = [
|
|
88
|
-
`Feed Update: ${update.title || "(no title)"}`,
|
|
89
|
-
`By: ${author} (vault: ${vault}) on ${update.createdAt}`,
|
|
90
|
-
"",
|
|
91
|
-
update.content || "",
|
|
92
|
-
"",
|
|
93
|
-
`Replies (${replies.length} items):`,
|
|
94
|
-
...replyLines,
|
|
95
|
-
...(pagination.hasMore
|
|
96
|
-
? [` Next cursor: ${pagination.nextCursor}`]
|
|
97
|
-
: []),
|
|
98
|
-
].join("\n");
|
|
99
|
-
console.log(output);
|
|
100
|
-
});
|
|
101
|
-
// ── Reply ──
|
|
102
|
-
feed
|
|
103
|
-
.command("post-reply <updateId>")
|
|
104
|
-
.description("Post a reply to a brain update in the feed.")
|
|
105
|
-
.requiredOption("--content <content>", 'Reply content (markdown supported, use "-" for stdin)')
|
|
106
|
-
.action(async (updateId, opts) => {
|
|
107
|
-
const content = opts.content === "-" ? readFileSync("/dev/stdin", "utf8") : opts.content;
|
|
108
|
-
const resp = (await apiPost(`/feed/${updateId}/replies`, {
|
|
109
|
-
content,
|
|
110
|
-
}));
|
|
111
|
-
const reply = unwrapResp(resp);
|
|
112
|
-
const mentions = (resp.mentions || {});
|
|
113
|
-
if (isJsonMode(feed)) {
|
|
114
|
-
jsonOut({ ...reply, mentions });
|
|
115
|
-
return;
|
|
116
|
-
}
|
|
117
|
-
console.log(`Reply created!\n ID: ${reply.id}\n Created: ${reply.createdAt}`);
|
|
118
|
-
});
|
|
119
|
-
// ── Edit reply ──
|
|
120
|
-
feed
|
|
121
|
-
.command("edit-reply <replyId>")
|
|
122
|
-
.description("Edit a reply you authored in the feed.")
|
|
123
|
-
.requiredOption("--content <content>", 'New reply content (markdown supported, use "-" for stdin)')
|
|
124
|
-
.action(async (replyId, opts) => {
|
|
125
|
-
const content = opts.content === "-" ? readFileSync("/dev/stdin", "utf8") : opts.content;
|
|
126
|
-
const resp = (await apiPatch(`/brain-updates/replies/${replyId}`, {
|
|
127
|
-
content,
|
|
128
|
-
}));
|
|
129
|
-
const reply = unwrapResp(resp);
|
|
130
|
-
if (isJsonMode(feed)) {
|
|
131
|
-
jsonOut(reply);
|
|
132
|
-
return;
|
|
133
|
-
}
|
|
134
|
-
console.log(`Reply edited!\n ID: ${reply.id}\n Edited: ${reply.editedAt}`);
|
|
135
|
-
});
|
|
136
|
-
// ── Delete reply ──
|
|
137
|
-
feed
|
|
138
|
-
.command("delete-reply <replyId>")
|
|
139
|
-
.description("Delete a reply you authored in the feed.")
|
|
140
|
-
.action(async (replyId) => {
|
|
141
|
-
await apiDelete(`/brain-updates/replies/${replyId}`);
|
|
142
|
-
if (isJsonMode(feed)) {
|
|
143
|
-
jsonOut({ replyId });
|
|
144
|
-
return;
|
|
145
|
-
}
|
|
146
|
-
console.log(`Reply ${replyId} deleted.`);
|
|
147
|
-
});
|
|
148
|
-
}
|
|
@@ -1,185 +0,0 @@
|
|
|
1
|
-
import { readFileSync } from "fs";
|
|
2
|
-
import { apiDelete, apiGet, apiPatch, apiPost } from "../client.js";
|
|
3
|
-
import { isJsonMode, jsonOut, unwrapResp } from "./utils.js";
|
|
4
|
-
function readContent(value) {
|
|
5
|
-
if (value === "-")
|
|
6
|
-
return readFileSync("/dev/stdin", "utf8");
|
|
7
|
-
return value;
|
|
8
|
-
}
|
|
9
|
-
function snippet(content, max = 80) {
|
|
10
|
-
const single = content.replace(/\s+/g, " ");
|
|
11
|
-
return single.length > max ? `${single.slice(0, max)}…` : single;
|
|
12
|
-
}
|
|
13
|
-
function formatProposalLine(p) {
|
|
14
|
-
const status = p.status === "pending" ? "·" : p.status === "accepted" ? "✓" : "✗";
|
|
15
|
-
return `- [${status}] p${p.priority} rev${p.revision} ${p.proposalId.slice(0, 8)} ${snippet(p.title)}`;
|
|
16
|
-
}
|
|
17
|
-
export function registerProposalCommand(program) {
|
|
18
|
-
const proposal = program
|
|
19
|
-
.command("proposal")
|
|
20
|
-
.description("Proposals authored by your agent during chat. Top-5 feed the system prompt; accept/reject/revise update state and the client posts the synthesized message into the session.");
|
|
21
|
-
// ── List ──
|
|
22
|
-
proposal
|
|
23
|
-
.command("list")
|
|
24
|
-
.description("List proposals (priority ASC, then newest first).")
|
|
25
|
-
.option("--limit <number>", "Max proposals to return (1-200)", "50")
|
|
26
|
-
.action(async (opts) => {
|
|
27
|
-
const params = { limit: parseInt(opts.limit, 10) };
|
|
28
|
-
const resp = (await apiGet("/app/proposals", params));
|
|
29
|
-
const items = (resp.data || []);
|
|
30
|
-
if (isJsonMode(proposal)) {
|
|
31
|
-
jsonOut(items);
|
|
32
|
-
return;
|
|
33
|
-
}
|
|
34
|
-
if (!items.length) {
|
|
35
|
-
console.log("No proposals.");
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
38
|
-
console.log(`Proposals (${items.length}):`);
|
|
39
|
-
for (const p of items)
|
|
40
|
-
console.log(formatProposalLine(p));
|
|
41
|
-
});
|
|
42
|
-
// ── Get ──
|
|
43
|
-
proposal
|
|
44
|
-
.command("get <proposalId>")
|
|
45
|
-
.description("Show one proposal with its history.")
|
|
46
|
-
.action(async (proposalId) => {
|
|
47
|
-
const resp = (await apiGet(`/app/proposals/${proposalId}`));
|
|
48
|
-
const p = unwrapResp(resp);
|
|
49
|
-
if (isJsonMode(proposal)) {
|
|
50
|
-
jsonOut(p);
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
|
-
console.log(`Proposal ${p.proposalId}`);
|
|
54
|
-
console.log(` title: ${p.title}`);
|
|
55
|
-
console.log(` status: ${p.status}`);
|
|
56
|
-
console.log(` priority: ${p.priority}`);
|
|
57
|
-
console.log(` revision: ${p.revision}`);
|
|
58
|
-
console.log(` session: ${p.sessionId}`);
|
|
59
|
-
console.log(` created: ${p.createdAt}`);
|
|
60
|
-
console.log("");
|
|
61
|
-
console.log("Content:");
|
|
62
|
-
console.log(p.content);
|
|
63
|
-
if (p.history.length) {
|
|
64
|
-
console.log("");
|
|
65
|
-
console.log("History:");
|
|
66
|
-
for (const h of p.history) {
|
|
67
|
-
console.log(` ${h.createdAt} rev${h.revision} ${h.type}`);
|
|
68
|
-
if (h.type === "created" || h.type === "revised") {
|
|
69
|
-
if (h.title !== undefined)
|
|
70
|
-
console.log(` title: ${h.title}`);
|
|
71
|
-
if (h.content !== undefined) {
|
|
72
|
-
console.log(` content: ${snippet(h.content, 200)}`);
|
|
73
|
-
}
|
|
74
|
-
if (h.comment !== undefined)
|
|
75
|
-
console.log(` comment: ${h.comment}`);
|
|
76
|
-
}
|
|
77
|
-
else if (h.type === "prioritized" && h.priority !== undefined) {
|
|
78
|
-
console.log(` priority=${h.priority}`);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
});
|
|
83
|
-
// ── Add ──
|
|
84
|
-
proposal
|
|
85
|
-
.command("add <title> <content>")
|
|
86
|
-
.description("Add a proposal. Pass '-' for content to read from stdin. Requires a chat session — the agent runtime exports GOBI_SESSION_ID automatically; outside that, pass --session.")
|
|
87
|
-
.option("--session <sessionId>", "Originating chat session UUID. Falls back to $GOBI_SESSION_ID when set.")
|
|
88
|
-
.option("--priority <number>", "Priority (lower = higher), default 100")
|
|
89
|
-
.action(async (title, content, opts) => {
|
|
90
|
-
const sessionId = opts.session || process.env.GOBI_SESSION_ID || "";
|
|
91
|
-
if (!sessionId) {
|
|
92
|
-
console.error("Error: missing session id. Pass --session <uuid> or set GOBI_SESSION_ID in the environment.");
|
|
93
|
-
process.exit(1);
|
|
94
|
-
}
|
|
95
|
-
const body = {
|
|
96
|
-
title,
|
|
97
|
-
content: readContent(content),
|
|
98
|
-
sessionId,
|
|
99
|
-
};
|
|
100
|
-
if (opts.priority)
|
|
101
|
-
body.priority = parseInt(opts.priority, 10);
|
|
102
|
-
const resp = (await apiPost("/app/proposals", body));
|
|
103
|
-
const p = unwrapResp(resp);
|
|
104
|
-
if (isJsonMode(proposal)) {
|
|
105
|
-
jsonOut(p);
|
|
106
|
-
return;
|
|
107
|
-
}
|
|
108
|
-
console.log(`Created ${p.proposalId} (priority ${p.priority}).`);
|
|
109
|
-
});
|
|
110
|
-
// ── Delete ──
|
|
111
|
-
proposal
|
|
112
|
-
.command("delete <proposalId>")
|
|
113
|
-
.description("Delete a proposal.")
|
|
114
|
-
.action(async (proposalId) => {
|
|
115
|
-
await apiDelete(`/app/proposals/${proposalId}`);
|
|
116
|
-
if (isJsonMode(proposal)) {
|
|
117
|
-
jsonOut({ deleted: proposalId });
|
|
118
|
-
return;
|
|
119
|
-
}
|
|
120
|
-
console.log(`Deleted ${proposalId}.`);
|
|
121
|
-
});
|
|
122
|
-
// ── Prioritize ──
|
|
123
|
-
proposal
|
|
124
|
-
.command("prioritize <proposalId> <priority>")
|
|
125
|
-
.description("Set priority (lower = higher). Top 5 feed the system prompt.")
|
|
126
|
-
.action(async (proposalId, priority) => {
|
|
127
|
-
const resp = (await apiPatch(`/app/proposals/${proposalId}/priority`, {
|
|
128
|
-
priority: parseInt(priority, 10),
|
|
129
|
-
}));
|
|
130
|
-
const p = unwrapResp(resp);
|
|
131
|
-
if (isJsonMode(proposal)) {
|
|
132
|
-
jsonOut(p);
|
|
133
|
-
return;
|
|
134
|
-
}
|
|
135
|
-
console.log(`Set ${p.proposalId} priority to ${p.priority}.`);
|
|
136
|
-
});
|
|
137
|
-
// ── Accept ──
|
|
138
|
-
proposal
|
|
139
|
-
.command("accept <proposalId>")
|
|
140
|
-
.description("Mark the proposal accepted. The client posts the synthesized message into the session.")
|
|
141
|
-
.action(async (proposalId) => {
|
|
142
|
-
const resp = (await apiPost(`/app/proposals/${proposalId}/accept`));
|
|
143
|
-
const p = unwrapResp(resp);
|
|
144
|
-
if (isJsonMode(proposal)) {
|
|
145
|
-
jsonOut(p);
|
|
146
|
-
return;
|
|
147
|
-
}
|
|
148
|
-
console.log(`Accepted ${p.proposalId}.`);
|
|
149
|
-
});
|
|
150
|
-
// ── Reject ──
|
|
151
|
-
proposal
|
|
152
|
-
.command("reject <proposalId>")
|
|
153
|
-
.description("Mark the proposal rejected. The client posts the synthesized message into the session.")
|
|
154
|
-
.action(async (proposalId) => {
|
|
155
|
-
const resp = (await apiPost(`/app/proposals/${proposalId}/reject`));
|
|
156
|
-
const p = unwrapResp(resp);
|
|
157
|
-
if (isJsonMode(proposal)) {
|
|
158
|
-
jsonOut(p);
|
|
159
|
-
return;
|
|
160
|
-
}
|
|
161
|
-
console.log(`Rejected ${p.proposalId}.`);
|
|
162
|
-
});
|
|
163
|
-
// ── Revise ──
|
|
164
|
-
proposal
|
|
165
|
-
.command("revise <proposalId> <comment>")
|
|
166
|
-
.description("Bump the proposal to a new revision. Comment is required; pass --title and/or --content to update the proposal in the same call. Pass '-' for any of comment/title/content to read from stdin.")
|
|
167
|
-
.option("--title <title>", "Replacement title")
|
|
168
|
-
.option("--content <content>", "Replacement content; pass '-' to read from stdin")
|
|
169
|
-
.action(async (proposalId, comment, opts) => {
|
|
170
|
-
const body = {
|
|
171
|
-
comment: readContent(comment),
|
|
172
|
-
};
|
|
173
|
-
if (opts.title !== undefined)
|
|
174
|
-
body.title = opts.title;
|
|
175
|
-
if (opts.content !== undefined)
|
|
176
|
-
body.content = readContent(opts.content);
|
|
177
|
-
const resp = (await apiPost(`/app/proposals/${proposalId}/revise`, body));
|
|
178
|
-
const p = unwrapResp(resp);
|
|
179
|
-
if (isJsonMode(proposal)) {
|
|
180
|
-
jsonOut(p);
|
|
181
|
-
return;
|
|
182
|
-
}
|
|
183
|
-
console.log(`Revised ${p.proposalId} → rev${p.revision}.`);
|
|
184
|
-
});
|
|
185
|
-
}
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: gobi-brain
|
|
3
|
-
description: >-
|
|
4
|
-
Gobi brain commands for knowledge management: search public brains by text
|
|
5
|
-
and semantic similarity, ask brains questions, and publish/unpublish
|
|
6
|
-
BRAIN.md. Use when the user wants to search knowledge, ask a brain, or
|
|
7
|
-
publish their brain document.
|
|
8
|
-
allowed-tools: Bash(gobi:*)
|
|
9
|
-
metadata:
|
|
10
|
-
author: gobi-ai
|
|
11
|
-
version: "0.9.13"
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
# gobi-brain
|
|
15
|
-
|
|
16
|
-
Gobi brain commands for knowledge management (v0.9.13).
|
|
17
|
-
|
|
18
|
-
Requires gobi-cli installed and authenticated. See gobi-core skill for setup.
|
|
19
|
-
|
|
20
|
-
## Gobi Brain — Knowledge Management
|
|
21
|
-
|
|
22
|
-
`gobi brain` commands manage your vault's brain: search across all spaces, ask brains questions, and publish/unpublish your BRAIN.md. Public brains are accessible at `https://gobispace.com/@{vaultSlug}`.
|
|
23
|
-
|
|
24
|
-
> **Brain updates have moved to threads.** To post user-level content, use `gobi global create-thread` (global space) or `gobi space create-thread` (a specific space). See the **gobi-space** skill.
|
|
25
|
-
|
|
26
|
-
## Important: JSON Mode
|
|
27
|
-
|
|
28
|
-
For programmatic/agent usage, always pass `--json` as a **global** option (before the subcommand):
|
|
29
|
-
|
|
30
|
-
```bash
|
|
31
|
-
gobi --json brain search --query "machine learning"
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
## Available Commands
|
|
35
|
-
|
|
36
|
-
- `gobi brain search` — Search public brains by text and semantic similarity.
|
|
37
|
-
- `gobi brain ask` — Ask a brain a question. Creates a targeted session (1:1 conversation).
|
|
38
|
-
- `gobi brain publish` — Upload BRAIN.md to the vault root on webdrive. Triggers post-processing (brain sync, metadata update, Discord notification).
|
|
39
|
-
- `gobi brain unpublish` — Delete BRAIN.md from the vault on webdrive.
|
|
40
|
-
|
|
41
|
-
## BRAIN.md Frontmatter Reference
|
|
42
|
-
|
|
43
|
-
`BRAIN.md` is the metadata file at the root of every vault. Its YAML frontmatter controls the vault's public profile, homepage, and AI agent behavior. Example:
|
|
44
|
-
|
|
45
|
-
```yaml
|
|
46
|
-
---
|
|
47
|
-
title: My Brain
|
|
48
|
-
tags:
|
|
49
|
-
- topic1
|
|
50
|
-
- topic2
|
|
51
|
-
description: A short description of what this brain is about.
|
|
52
|
-
thumbnail: "[[BRAIN.png]]"
|
|
53
|
-
homepage: "[[app/home.html?nav=false]]"
|
|
54
|
-
prompt: "[[system-prompt.md]]"
|
|
55
|
-
---
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
### Fields
|
|
59
|
-
|
|
60
|
-
- **`title`** (required) — Display name of the brain/vault.
|
|
61
|
-
- **`description`** (required for public listing) — Short description shown on the brain card and public profile. Without both `title` and `description`, the brain won't appear in the public catalog.
|
|
62
|
-
- **`tags`** — Tags for categorization and discovery. Supports YAML block list or inline array format:
|
|
63
|
-
```yaml
|
|
64
|
-
# Block list
|
|
65
|
-
tags:
|
|
66
|
-
- ambient ai
|
|
67
|
-
- wearables
|
|
68
|
-
|
|
69
|
-
# Inline array
|
|
70
|
-
tags: [ambient ai, wearables]
|
|
71
|
-
```
|
|
72
|
-
- **`thumbnail`** — Profile image for the brain card. Uses wiki-link syntax pointing to an image file in the vault (e.g. `"[[BRAIN.png]]"`).
|
|
73
|
-
- **`homepage`** — Custom HTML page to serve as the vault's public homepage at `gobispace.com/@{vaultSlug}`. Uses wiki-link syntax pointing to an HTML file in the vault. Supports a `nav` query parameter to control Gobi's sidebar navigation:
|
|
74
|
-
- `"[[app/home.html]]"` — Shows the Gobi sidebar alongside the homepage (default)
|
|
75
|
-
- `"[[app/home.html?nav=false]]"` — Full-screen, no Gobi sidebar/chrome
|
|
76
|
-
- **`prompt`** — Wiki-link to a custom system prompt file for the brain's AI agent (e.g. `"[[system-prompt.md]]"`).
|
|
77
|
-
|
|
78
|
-
> For details on building custom HTML homepages and using the `window.gobi` API, see the **gobi-homepage** skill.
|
|
79
|
-
|
|
80
|
-
## Publishing Workflow
|
|
81
|
-
|
|
82
|
-
After editing `BRAIN.md` frontmatter, follow these steps to make your changes live:
|
|
83
|
-
|
|
84
|
-
1. **Edit `BRAIN.md`** in the vault root with the desired frontmatter fields.
|
|
85
|
-
2. **Sync referenced files** — if the homepage HTML, thumbnail image, or prompt file is new or updated, upload them first:
|
|
86
|
-
```bash
|
|
87
|
-
gobi sync
|
|
88
|
-
```
|
|
89
|
-
3. **Publish the brain**:
|
|
90
|
-
```bash
|
|
91
|
-
gobi brain publish
|
|
92
|
-
```
|
|
93
|
-
This uploads `BRAIN.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.
|
|
94
|
-
4. The vault is now live at `https://gobispace.com/@{vaultSlug}`.
|
|
95
|
-
|
|
96
|
-
> **Important:** Any time you change `BRAIN.md` frontmatter (e.g. adding or updating `homepage`), you must re-run `gobi brain publish` for the changes to take effect.
|
|
97
|
-
|
|
98
|
-
## Reference Documentation
|
|
99
|
-
|
|
100
|
-
- [gobi brain](references/brain.md)
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
# gobi brain
|
|
2
|
-
|
|
3
|
-
```
|
|
4
|
-
Usage: gobi brain [options] [command]
|
|
5
|
-
|
|
6
|
-
Brain commands (search, ask, publish, unpublish).
|
|
7
|
-
|
|
8
|
-
Options:
|
|
9
|
-
-h, --help display help for command
|
|
10
|
-
|
|
11
|
-
Commands:
|
|
12
|
-
search [options] Search public brains by text and semantic similarity.
|
|
13
|
-
ask [options] Ask a brain a question. Creates a targeted session (1:1 conversation).
|
|
14
|
-
publish Upload BRAIN.md to the vault root on webdrive. Triggers post-processing (brain sync, metadata update, Discord notification).
|
|
15
|
-
unpublish Delete BRAIN.md from the vault on webdrive.
|
|
16
|
-
help [command] display help for command
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
## search
|
|
20
|
-
|
|
21
|
-
```
|
|
22
|
-
Usage: gobi brain search [options]
|
|
23
|
-
|
|
24
|
-
Search public brains by text and semantic similarity.
|
|
25
|
-
|
|
26
|
-
Options:
|
|
27
|
-
--query <query> Search query
|
|
28
|
-
-h, --help display help for command
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
## ask
|
|
32
|
-
|
|
33
|
-
```
|
|
34
|
-
Usage: gobi brain ask [options]
|
|
35
|
-
|
|
36
|
-
Ask a brain a question. Creates a targeted session (1:1 conversation).
|
|
37
|
-
|
|
38
|
-
Options:
|
|
39
|
-
--vault-slug <vaultSlug> Slug of the brain/vault to ask
|
|
40
|
-
--question <question> The question to ask (markdown supported)
|
|
41
|
-
--rich-text <richText> Rich-text JSON array (e.g. [{"type":"text","text":"hello"}])
|
|
42
|
-
--mode <mode> Session mode: "auto" or "manual"
|
|
43
|
-
-h, --help display help for command
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
## publish
|
|
47
|
-
|
|
48
|
-
```
|
|
49
|
-
Usage: gobi brain publish [options]
|
|
50
|
-
|
|
51
|
-
Upload BRAIN.md to the vault root on webdrive. Triggers post-processing (brain sync, metadata update, Discord notification).
|
|
52
|
-
|
|
53
|
-
Options:
|
|
54
|
-
-h, --help display help for command
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
## unpublish
|
|
58
|
-
|
|
59
|
-
```
|
|
60
|
-
Usage: gobi brain unpublish [options]
|
|
61
|
-
|
|
62
|
-
Delete BRAIN.md from the vault on webdrive.
|
|
63
|
-
|
|
64
|
-
Options:
|
|
65
|
-
-h, --help display help for command
|
|
66
|
-
```
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: gobi-feed
|
|
3
|
-
description: >-
|
|
4
|
-
Gobi feed commands for the global brain-update feed: list recent brain
|
|
5
|
-
updates from people across the platform, read a single update with its
|
|
6
|
-
replies, and post replies. Use when the user wants to browse what others
|
|
7
|
-
are sharing, follow public discussions, or join a thread.
|
|
8
|
-
allowed-tools: Bash(gobi:*)
|
|
9
|
-
metadata:
|
|
10
|
-
author: gobi-ai
|
|
11
|
-
version: "1.3.1"
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
# gobi-feed
|
|
15
|
-
|
|
16
|
-
Gobi feed commands for the global brain-update feed (v1.3.1).
|
|
17
|
-
|
|
18
|
-
Requires gobi-cli installed and authenticated. See gobi-core skill for setup.
|
|
19
|
-
|
|
20
|
-
## What is the feed?
|
|
21
|
-
|
|
22
|
-
The feed is the platform-wide stream of brain updates from public vaults — short posts, learnings, and announcements people share publicly. Use `gobi feed` to read what others are posting and to reply to a discussion.
|
|
23
|
-
|
|
24
|
-
To post your own brain update, use `gobi brain post-update` (the feed is read-mostly; posts are scoped to your vault).
|
|
25
|
-
|
|
26
|
-
## Important: JSON Mode
|
|
27
|
-
|
|
28
|
-
For programmatic/agent usage, always pass `--json` as a **global** option (before the subcommand):
|
|
29
|
-
|
|
30
|
-
```bash
|
|
31
|
-
gobi --json feed list
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
## Available Commands
|
|
35
|
-
|
|
36
|
-
- `gobi feed` — Feed of brain updates from people across the platform.
|
|
37
|
-
- `gobi feed list` — List recent brain updates from the global public feed.
|
|
38
|
-
- `gobi feed get` — Get a feed brain update and its replies (paginated).
|
|
39
|
-
- `gobi feed reply` — Reply to a brain update in the feed.
|
|
40
|
-
|
|
41
|
-
## Reference Documentation
|
|
42
|
-
|
|
43
|
-
- [gobi feed](references/feed.md)
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
# gobi feed
|
|
2
|
-
|
|
3
|
-
```
|
|
4
|
-
Usage: gobi feed [options] [command]
|
|
5
|
-
|
|
6
|
-
Feed of brain updates from people across the platform.
|
|
7
|
-
|
|
8
|
-
Options:
|
|
9
|
-
-h, --help display help for command
|
|
10
|
-
|
|
11
|
-
Commands:
|
|
12
|
-
list [options] List recent brain updates from the global public feed.
|
|
13
|
-
get [options] <updateId> Get a feed brain update and its replies (paginated).
|
|
14
|
-
post-reply [options] <updateId> Post a reply to a brain update in the feed.
|
|
15
|
-
edit-reply [options] <replyId> Edit a reply you authored in the feed.
|
|
16
|
-
delete-reply <replyId> Delete a reply you authored in the feed.
|
|
17
|
-
help [command] display help for command
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
## list
|
|
21
|
-
|
|
22
|
-
```
|
|
23
|
-
Usage: gobi feed list [options]
|
|
24
|
-
|
|
25
|
-
List recent brain updates from the global public feed.
|
|
26
|
-
|
|
27
|
-
Options:
|
|
28
|
-
--limit <number> Items per page (default: "20")
|
|
29
|
-
--cursor <string> Pagination cursor from previous response
|
|
30
|
-
-h, --help display help for command
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
## get
|
|
34
|
-
|
|
35
|
-
```
|
|
36
|
-
Usage: gobi feed get [options] <updateId>
|
|
37
|
-
|
|
38
|
-
Get a feed brain update and its replies (paginated).
|
|
39
|
-
|
|
40
|
-
Options:
|
|
41
|
-
--limit <number> Replies per page (default: "20")
|
|
42
|
-
--cursor <string> Pagination cursor from previous response
|
|
43
|
-
--full Show full reply content without truncation
|
|
44
|
-
-h, --help display help for command
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
## post-reply
|
|
48
|
-
|
|
49
|
-
```
|
|
50
|
-
Usage: gobi feed post-reply [options] <updateId>
|
|
51
|
-
|
|
52
|
-
Post a reply to a brain update in the feed.
|
|
53
|
-
|
|
54
|
-
Options:
|
|
55
|
-
--content <content> Reply content (markdown supported, use "-" for stdin)
|
|
56
|
-
-h, --help display help for command
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
## edit-reply
|
|
60
|
-
|
|
61
|
-
```
|
|
62
|
-
Usage: gobi feed edit-reply [options] <replyId>
|
|
63
|
-
|
|
64
|
-
Edit a reply you authored in the feed.
|
|
65
|
-
|
|
66
|
-
Options:
|
|
67
|
-
--content <content> New reply content (markdown supported, use "-" for stdin)
|
|
68
|
-
-h, --help display help for command
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
## delete-reply
|
|
72
|
-
|
|
73
|
-
```
|
|
74
|
-
Usage: gobi feed delete-reply [options] <replyId>
|
|
75
|
-
|
|
76
|
-
Delete a reply you authored in the feed.
|
|
77
|
-
|
|
78
|
-
Options:
|
|
79
|
-
-h, --help display help for command
|
|
80
|
-
```
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: gobi-notes
|
|
3
|
-
description: >-
|
|
4
|
-
Gobi notes commands for personal note-taking: create, list (by day or
|
|
5
|
-
cursor), get, edit, and delete notes. Notes are private, dated entries
|
|
6
|
-
optionally tied to an agent. Use when the user wants to capture, review,
|
|
7
|
-
or modify their own notes.
|
|
8
|
-
allowed-tools: Bash(gobi:*)
|
|
9
|
-
metadata:
|
|
10
|
-
author: gobi-ai
|
|
11
|
-
version: "1.3.2"
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
# gobi-notes
|
|
15
|
-
|
|
16
|
-
Gobi notes commands for personal note-taking (v1.3.2).
|
|
17
|
-
|
|
18
|
-
Requires gobi-cli installed and authenticated. See gobi-core skill for setup.
|
|
19
|
-
|
|
20
|
-
## What is a note?
|
|
21
|
-
|
|
22
|
-
A note is a private, dated entry you keep for yourself. Each note has:
|
|
23
|
-
- **content** — markdown text (optional if attachments are present, but the CLI requires `--content` since it doesn't yet upload attachments)
|
|
24
|
-
- **eventDate** — derived from your timezone at create time, used to group notes by day
|
|
25
|
-
- **agentId** — optional association with a Gobi agent
|
|
26
|
-
|
|
27
|
-
Notes are user-private — only you can see, edit, or delete your own notes.
|
|
28
|
-
|
|
29
|
-
## Timezone
|
|
30
|
-
|
|
31
|
-
`gobi notes list` and `gobi notes create` need a timezone to compute the calendar day. The CLI auto-detects your system timezone via `Intl.DateTimeFormat().resolvedOptions().timeZone`. Override with `--timezone <iana-name>` (e.g. `America/Los_Angeles`).
|
|
32
|
-
|
|
33
|
-
## Important: JSON Mode
|
|
34
|
-
|
|
35
|
-
For programmatic/agent usage, always pass `--json` as a **global** option (before the subcommand):
|
|
36
|
-
|
|
37
|
-
```bash
|
|
38
|
-
gobi --json notes list --date 2026-04-27
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
## Available Commands
|
|
42
|
-
|
|
43
|
-
- `gobi notes` — Personal notes (create, list, get, edit, delete).
|
|
44
|
-
- `gobi notes list` — List your notes. Without --date, returns recent notes via cursor pagination. With --date, returns all notes for that day.
|
|
45
|
-
- `gobi notes get` — Get a single note by id.
|
|
46
|
-
- `gobi notes create` — Create a note. Provide --content (use '-' for stdin) and/or attachments.
|
|
47
|
-
- `gobi notes edit` — Edit a note. Provide --content and/or --agent-id.
|
|
48
|
-
- `gobi notes delete` — Delete a note you authored.
|
|
49
|
-
|
|
50
|
-
## Reference Documentation
|
|
51
|
-
|
|
52
|
-
- [gobi notes](references/notes.md)
|