@rizom/ops 0.2.0-alpha.119 → 0.2.0-alpha.120
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/dist/index.js
CHANGED
|
@@ -53,7 +53,7 @@ return `+str.trim()+`;
|
|
|
53
53
|
`).join(`
|
|
54
54
|
`+Y),$.push(Q+"m+"+SY.exports.humanize(this.diff)+"\x1B[0m")}else $[0]=bA()+q+" "+$[0]}function bA(){if(nM.inspectOpts.hideDate)return"";return new Date().toISOString()+" "}function kA(...$){return process.stderr.write(TY.formatWithOptions(nM.inspectOpts,...$)+`
|
|
55
55
|
`)}function mA($){if($)process.env.DEBUG=$;else delete process.env.DEBUG}function yA(){return process.env.DEBUG}function fA($){$.inspectOpts={};let q=Object.keys(nM.inspectOpts);for(let J=0;J<q.length;J++)$.inspectOpts[q[J]]=nM.inspectOpts[q[J]]}SY.exports=bX()(nM);var{formatters:cM}=SY.exports;cM.o=function($){return this.inspectOpts.colors=this.useColors,TY.inspect($,this.inspectOpts).split(`
|
|
56
|
-
`).map((q)=>q.trim()).join(" ")};cM.O=function($){return this.inspectOpts.colors=this.useColors,TY.inspect($,this.inspectOpts)}});var sM=X$((cv,yX)=>{if(typeof process>"u"||process.type==="renderer"||!1||process.__nwjs)yX.exports=uM();else yX.exports=aM()});var oz=X$((Ay,nz)=>{var bY=Object.prototype.hasOwnProperty,cz=Object.prototype.toString,uz=Object.defineProperty,pz=Object.getOwnPropertyDescriptor,lz=function(q){if(typeof Array.isArray==="function")return Array.isArray(q);return cz.call(q)==="[object Array]"},rz=function(q){if(!q||cz.call(q)!=="[object Object]")return!1;var J=bY.call(q,"constructor"),G=q.constructor&&q.constructor.prototype&&bY.call(q.constructor.prototype,"isPrototypeOf");if(q.constructor&&!J&&!G)return!1;var Q;for(Q in q);return typeof Q>"u"||bY.call(q,Q)},iz=function(q,J){if(uz&&J.name==="__proto__")uz(q,J.name,{enumerable:!0,configurable:!0,value:J.newValue,writable:!0});else q[J.name]=J.newValue},dz=function(q,J){if(J==="__proto__"){if(!bY.call(q,J))return;else if(pz)return pz(q,J).value}return q[J]};nz.exports=function $(){var q,J,G,Q,Y,X,U=arguments[0],W=1,V=arguments.length,M=!1;if(typeof U==="boolean")M=U,U=arguments[1]||{},W=2;if(U==null||typeof U!=="object"&&typeof U!=="function")U={};for(;W<V;++W)if(q=arguments[W],q!=null){for(J in q)if(G=dz(U,J),Q=dz(q,J),U!==Q){if(M&&Q&&(rz(Q)||(Y=lz(Q)))){if(Y)Y=!1,X=G&&lz(G)?G:[];else X=G&&rz(G)?G:{};iz(U,{name:J,newValue:$(M,X,Q)})}else if(typeof Q<"u")iz(U,{name:J,newValue:Q})}}return U}});import{access as vI,chmod as _U,mkdir as DD,readFile as HD,writeFile as KD}from"fs/promises";import{dirname as bI,join as bU}from"path";import{fileURLToPath as kI}from"url";var sQ={name:"@rizom/ops",description:"Operator CLI for managing private brain fleet registry repos",publishConfig:{access:"public"},version:"0.2.0-alpha.
|
|
56
|
+
`).map((q)=>q.trim()).join(" ")};cM.O=function($){return this.inspectOpts.colors=this.useColors,TY.inspect($,this.inspectOpts)}});var sM=X$((cv,yX)=>{if(typeof process>"u"||process.type==="renderer"||!1||process.__nwjs)yX.exports=uM();else yX.exports=aM()});var oz=X$((Ay,nz)=>{var bY=Object.prototype.hasOwnProperty,cz=Object.prototype.toString,uz=Object.defineProperty,pz=Object.getOwnPropertyDescriptor,lz=function(q){if(typeof Array.isArray==="function")return Array.isArray(q);return cz.call(q)==="[object Array]"},rz=function(q){if(!q||cz.call(q)!=="[object Object]")return!1;var J=bY.call(q,"constructor"),G=q.constructor&&q.constructor.prototype&&bY.call(q.constructor.prototype,"isPrototypeOf");if(q.constructor&&!J&&!G)return!1;var Q;for(Q in q);return typeof Q>"u"||bY.call(q,Q)},iz=function(q,J){if(uz&&J.name==="__proto__")uz(q,J.name,{enumerable:!0,configurable:!0,value:J.newValue,writable:!0});else q[J.name]=J.newValue},dz=function(q,J){if(J==="__proto__"){if(!bY.call(q,J))return;else if(pz)return pz(q,J).value}return q[J]};nz.exports=function $(){var q,J,G,Q,Y,X,U=arguments[0],W=1,V=arguments.length,M=!1;if(typeof U==="boolean")M=U,U=arguments[1]||{},W=2;if(U==null||typeof U!=="object"&&typeof U!=="function")U={};for(;W<V;++W)if(q=arguments[W],q!=null){for(J in q)if(G=dz(U,J),Q=dz(q,J),U!==Q){if(M&&Q&&(rz(Q)||(Y=lz(Q)))){if(Y)Y=!1,X=G&&lz(G)?G:[];else X=G&&rz(G)?G:{};iz(U,{name:J,newValue:$(M,X,Q)})}else if(typeof Q<"u")iz(U,{name:J,newValue:Q})}}return U}});import{access as vI,chmod as _U,mkdir as DD,readFile as HD,writeFile as KD}from"fs/promises";import{dirname as bI,join as bU}from"path";import{fileURLToPath as kI}from"url";var sQ={name:"@rizom/ops",description:"Operator CLI for managing private brain fleet registry repos",publishConfig:{access:"public"},version:"0.2.0-alpha.120",type:"module",exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.js"},"./deploy":{bun:"./dist/deploy.js",types:"./dist/deploy.d.ts",import:"./dist/deploy.js"}},main:"./dist/index.js",types:"./dist/index.d.ts",bin:{"brains-ops":"./dist/brains-ops.js"},files:["dist","templates"],scripts:{build:"bun scripts/build.ts",prepublishOnly:"bun scripts/build.ts",typecheck:"tsc --noEmit",lint:"eslint . --ext .ts","lint:fix":"eslint . --ext .ts --fix",test:"bun run build && bun test --timeout 20000","test:smoke":"bun run build && RUN_SMOKE_TESTS=1 bun test --timeout 60000"},dependencies:{"age-encryption":"^0.3.0"},devDependencies:{"@brains/deploy-support":"workspace:*","@brains/eslint-config":"workspace:*","@brains/typescript-config":"workspace:*","@brains/utils":"workspace:*","@types/bun":"latest",typescript:"^5.3.3"},repository:{type:"git",url:"https://github.com/rizom-ai/brains.git",directory:"packages/brains-ops"},license:"Apache-2.0",author:"Yeehaa <yeehaa@rizom.ai> (https://rizom.ai)",homepage:"https://github.com/rizom-ai/brains/tree/main/packages/brains-ops#readme",bugs:"https://github.com/rizom-ai/brains/issues",engines:{bun:">=1.3.3"},keywords:["brains","ops","cli","deploy","fleet","operator"]};var r7=`ARG BUN_VERSION=1.3.10
|
|
57
57
|
FROM oven/bun:\${BUN_VERSION}-slim AS runtime
|
|
58
58
|
|
|
59
59
|
WORKDIR /app
|
|
@@ -269,7 +269,7 @@ volumes:
|
|
|
269
269
|
.brains-ops/
|
|
270
270
|
users/*.secrets.yaml
|
|
271
271
|
`;if($==="deploy/Dockerfile")return n7();if($==="deploy/kamal/deploy.yml")return tQ({serviceName:"rover"});if($===".kamal/hooks/pre-deploy")return a9({deployConfigPath:"deploy/kamal/deploy.yml",brainYamlPath:"${BRAIN_YAML_PATH:-brain.yaml}"});let q=bU(yI,$),J=await HD(q,"utf8");return cI(J)}function cI($){return $.replaceAll("__BRAINS_OPS_VERSION__",sQ.version).replaceAll("__BUN_VERSION__",Bun.version)}function nI($,q){return typeof $==="object"&&$!==null&&"code"in $&&$.code===q}import{mkdir as H2,writeFile as O2}from"fs/promises";import{dirname as N2,join as ZD}from"path";import{mkdtemp as aI,mkdir as sI,readFile as tI,rm as eI,writeFile as $2}from"fs/promises";import{tmpdir as q2}from"os";import{dirname as J2,join as wD}from"path";import{spawn as oI}from"child_process";var b0=async($,q,J={})=>new Promise((G,Q)=>{let Y=oI($,q,{stdio:["pipe","inherit","inherit"],env:J.env?{...process.env,...J.env}:process.env,cwd:J.cwd});if(Y.on("error",Q),Y.on("close",(X)=>{if(X===0){G();return}Q(Error(`${$} ${q.join(" ")} exited with code ${X??1}`))}),J.stdin)Y.stdin.end(J.stdin);else Y.stdin.end()});var G2=["name: Your Name Here","Delete this and write your own"];async function jD($,q,J,G,Q={}){if(G.length===0)return;let Y=Q.env??process.env,X=u0($),U=OD(Y,X,J.effectiveGitSyncToken),W=Q.contentRepoAdminTokenSelector?OD(Y,X,Q.contentRepoAdminTokenSelector):void 0,V=Q.contentRepoRemoteResolver?.(J,q,U)??X2(q,J.contentRepo,U);if(!V)return;let M=await aI(wD(q2(),`brains-ops-content-sync-${J.handle}-`)),z=Q.runCommand??b0,D=Q.fetchImpl??fetch;try{if(!Q.contentRepoRemoteResolver){if(!W)throw Error(`${Q.contentRepoAdminTokenSelector??"CONTENT_REPO_ADMIN_TOKEN"} is required to check or create content repos`);await U2(q,J.contentRepo,W,D)}await z("git",["clone",V,M]),await W2(M,z),await z("git",["config","user.name","brains-ops[bot]"],{cwd:M}),await z("git",["config","user.email","41898282+github-actions[bot]@users.noreply.github.com"],{cwd:M});let R=!1;for(let N of G)if(await Q2(M,N))R=!0;if(!R)return;await z("git",["add","."],{cwd:M}),await z("git",["commit","-m",`chore(content): seed ${J.handle} anchor profile`],{cwd:M}),await z("git",["push","origin","HEAD:main"],{cwd:M})}finally{await eI(M,{recursive:!0,force:!0})}}async function Q2($,q){let J=wD($,q.path),G=await tI(J,"utf8").catch(()=>{return});if(G===q.content)return!1;if(G!==void 0&&!Y2(G))return!1;return await sI(J2(J),{recursive:!0}),await $2(J,q.content),!0}function Y2($){return G2.some((q)=>$.includes(q))}function OD($,q,J){return f$(J,$,q)}function X2($,q,J){if(!J)return;return`https://x-access-token:${encodeURIComponent(J)}@github.com/${$}/${q}.git`}async function U2($,q,J,G){let Y=`https://api.github.com/repos/${`${encodeURIComponent($)}/${encodeURIComponent(q)}`}`,X={Accept:"application/vnd.github+json",Authorization:`Bearer ${J}`,"User-Agent":"brains-ops","X-GitHub-Api-Version":"2022-11-28"},U=await G(Y,{headers:X});if(U.ok)return;if(U.status!==404)throw Error(`Failed to check GitHub repo ${$}/${q}: ${U.status} ${await ND(U)}`);let W=await G(`https://api.github.com/orgs/${encodeURIComponent($)}/repos`,{method:"POST",headers:X,body:JSON.stringify({name:q,private:!0,auto_init:!1})});if(W.ok){console.log(`Created missing content repo ${$}/${q}`);return}if(W.status===422){if((await G(Y,{headers:X})).ok)return}throw Error(`Failed to create GitHub repo ${$}/${q}: ${W.status} ${await ND(W)}`)}async function ND($){let q=await $.text();return q.trim().length===0?$.statusText:q}async function W2($,q){try{await q("git",["checkout","-B","main","origin/main"],{cwd:$})}catch{await q("git",["checkout","-B","main"],{cwd:$})}}function AD($){return async(q)=>({brainYaml:V2(q,$),envFile:K2(q,$),contentRepoFiles:R2(q)})}function V2($,q){let J=[`brain: ${$.model}`,`domain: ${$.domain}`,`preset: ${$.preset}`,"",z2($),"","plugins:",...$.setup?.delivery==="email"?[" auth-service:",...M2($.setup.email)]:[]," directory-sync:"," git:",` repo: ${q}/${$.contentRepo}`," authToken: ${GIT_SYNC_TOKEN}",...$.atproto?[" atproto:",` identifier: ${$.atproto.identifier}`," appPassword: ${ATPROTO_APP_PASSWORD}"]:[]];if($.discordEnabled)J.push(" discord:"),J.push(" botToken: ${DISCORD_BOT_TOKEN}");if($.setup?.delivery==="email")J.push(" email-resend:"),J.push(" apiKey: ${SETUP_EMAIL_API_KEY}"),J.push(" from: ${SETUP_EMAIL_FROM}");return J.push(""),J.join(`
|
|
272
|
-
`)}function M2($){return[" setupEmail:",` to: ${$}`," subject: Welcome to Rover \u2014 set up your passkey"," body: |"," Hi,",""," Your Rover is ready.",""," Rover is your
|
|
272
|
+
`)}function M2($){return[" setupEmail:",` to: ${$}`," subject: Welcome to Rover \u2014 set up your passkey"," body: |"," Hi,",""," Your Rover is ready.",""," Rover is your own AI \u2014 a private assistant deployed just for you, that holds your notes, links, and ideas, and gets more useful the more you put into it.",""," Set up your passkey:"," {{setupUrl}}",""," This link is single-use. Do not forward it."," It expires at {{expiresAt}}.",""," After setup, open your chat and say hello:"," {{origin}}/chat",""," Sign in with the passkey you just registered. The chat in your browser is where you and Rover will spend most of your time.",""," The onboarding guide shows the way of working \u2014 capture, ask back, shape:"," https://github.com/rizom-ai/brains/blob/main/packages/brains-ops/templates/rover-pilot/docs/user-onboarding.md",""," If this link is expired, does not work, or you did not expect this email, reply to your Rover operator and we will help."]}function z2($){if($.discordEnabled&&$.discordAnchorUserId)return`anchors: ["discord:${$.discordAnchorUserId}"]`;return"anchors: []"}function R2($){return[{path:"anchor-profile/anchor-profile.md",content:D2($)}]}function D2($){let q={kind:"professional",name:$.anchorProfile.name,...$.anchorProfile.description?{description:$.anchorProfile.description}:{},...$.anchorProfile.website?{website:$.anchorProfile.website}:{},...$.anchorProfile.email?{email:$.anchorProfile.email}:{},...$.anchorProfile.socialLinks?{socialLinks:$.anchorProfile.socialLinks}:{}},J=$.anchorProfile.story??"This profile was initialized by brains-ops. Edit it in your content repo.";return`---
|
|
273
273
|
${qQ(q).trimEnd()}
|
|
274
274
|
---
|
|
275
275
|
|
package/package.json
CHANGED
|
@@ -8,11 +8,12 @@
|
|
|
8
8
|
- use different tokens for `contentRepoAdminToken` and `gitSyncToken`: admin creates/checks content repos; sync is used by runtime directory-sync
|
|
9
9
|
- confirm `agePublicKey`
|
|
10
10
|
4. Run `bunx brains-ops user:add <repo> <handle> --cohort <cohort>`.
|
|
11
|
-
-
|
|
12
|
-
-
|
|
11
|
+
- Web chat is the primary interface; it needs no per-user setup beyond the passkey.
|
|
12
|
+
- `user:add` currently writes `discord: enabled: true`; set it to `false` unless the user's cohort actually uses Discord.
|
|
13
|
+
- if the user should be an anchor on Discord, add `--anchor-id <discord-user-id>`.
|
|
13
14
|
- the command creates `users/<handle>.yaml`, `users/<handle>.secrets.yaml`, and the cohort membership without duplicating existing entries.
|
|
14
15
|
5. Edit the generated user file if the anchor profile needs richer metadata.
|
|
15
|
-
-
|
|
16
|
+
- Set `setup.delivery: email` and `setup.email` so the user gets the passkey setup email — this is the default onboarding path.
|
|
16
17
|
- For ATProto publishing, add `atproto.identifier` to the user file; put only `atprotoAppPassword` in the per-user secrets file.
|
|
17
18
|
- Ensure `SETUP_EMAIL_API_KEY` and `SETUP_EMAIL_FROM` exist as GitHub Secrets before deploying any email-setup user.
|
|
18
19
|
6. Run `bunx brains-ops render <repo>`.
|
|
@@ -25,20 +26,21 @@
|
|
|
25
26
|
13. Verify the deployed Rover contract:
|
|
26
27
|
- all presets:
|
|
27
28
|
- `https://<handle>.rizom.ai/health` returns `200`
|
|
29
|
+
- `https://<handle>.rizom.ai/chat` loads the web chat and accepts passkey sign-in
|
|
30
|
+
- `https://<handle>.rizom.ai/` loads the dashboard (or site surface on `default` preset)
|
|
31
|
+
- `https://<handle>.rizom.ai/cms` loads the CMS/login surface
|
|
28
32
|
- unauthenticated `POST https://<handle>.rizom.ai/mcp` returns the expected auth failure
|
|
33
|
+
- content repo exists and runtime sync is healthy
|
|
29
34
|
- background jobs are not repeatedly failing, except for expected missing optional integrations
|
|
30
35
|
- for `presetOverride: default` users:
|
|
31
|
-
- `https://<handle>.rizom.ai/` loads the browser/site surface
|
|
32
|
-
- `https://<handle>.rizom.ai/cms` loads the CMS/login surface
|
|
33
36
|
- initial site build completes
|
|
34
|
-
- content repo exists and runtime sync is healthy
|
|
35
|
-
- passkey setup/handoff is completed
|
|
36
37
|
14. For fleet upgrades, edit `pilot.yaml.brainVersion` and push once; CI rebuilds the shared image tag, refreshes generated user env files, and redeploys affected users.
|
|
37
|
-
15.
|
|
38
|
-
16. Hand over the browser
|
|
38
|
+
15. Confirm the user received the setup email, registered their passkey, and can sign in to web chat at `https://<handle>.rizom.ai/chat`. That completes the default onboarding; everything below is per-cohort extras.
|
|
39
|
+
16. Hand over the browser surfaces:
|
|
40
|
+
- Chat (primary): `https://<handle>.rizom.ai/chat`
|
|
39
41
|
- Dashboard: `https://<handle>.rizom.ai/`
|
|
40
|
-
- CMS: `https://<handle>.rizom.ai/cms
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
42
|
+
- CMS: `https://<handle>.rizom.ai/cms`, plus GitHub token guidance if CMS editing is part of their cohort
|
|
43
|
+
17. For Discord-enabled cohorts, hand the Discord setup details to the user as a secondary chat surface.
|
|
44
|
+
18. If they need direct client access (MCP), use OAuth/passkey-capable clients where possible.
|
|
45
|
+
19. If you are also giving them a content repo workflow, describe it as optional and frame git/Obsidian as an advanced file-based path, not the default.
|
|
46
|
+
20. Send `docs/user-onboarding.md` to the user as the pilot handoff guide.
|
|
@@ -1,339 +1,217 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Welcome to Rover
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Rover is your own AI. Not a chatbot you share with the rest of the
|
|
4
|
+
world — a private assistant deployed just for you, that holds your
|
|
5
|
+
notes, links, and ideas, and gets more useful the more you put into
|
|
6
|
+
it.
|
|
4
7
|
|
|
5
|
-
This guide
|
|
8
|
+
This guide walks you through your first days. You don't need
|
|
9
|
+
experience with any particular tools — if you can use a browser, you
|
|
10
|
+
can use Rover.
|
|
6
11
|
|
|
7
|
-
##
|
|
12
|
+
## Get in and say hello
|
|
8
13
|
|
|
9
|
-
|
|
14
|
+
1. **Open the setup email** we sent you and click the setup link.
|
|
15
|
+
2. **Register a passkey** — your browser will offer fingerprint,
|
|
16
|
+
face, or PIN. This becomes how you sign in; there is no password.
|
|
17
|
+
3. **Open your chat**: `https://<handle>.rizom.ai/chat` — sign in
|
|
18
|
+
with the passkey you just made.
|
|
19
|
+
4. **Say hello.** Ask Rover:
|
|
10
20
|
|
|
11
|
-
|
|
21
|
+
> What can you help me do?
|
|
12
22
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
- **Dashboard** — your browser overview at `https://<handle>.rizom.ai/`
|
|
16
|
-
- **MCP** — optional direct access from OAuth/passkey-capable AI clients
|
|
23
|
+
That's the whole setup. The chat in your browser is where you and
|
|
24
|
+
Rover will spend most of your time.
|
|
17
25
|
|
|
18
|
-
|
|
26
|
+
One caution: the setup link works once and then expires. Don't
|
|
27
|
+
forward it, and if it has already expired when you click it, just
|
|
28
|
+
tell us — we'll send a fresh one.
|
|
19
29
|
|
|
20
|
-
|
|
21
|
-
- **GitHub/content repo** access for editing the underlying markdown files
|
|
22
|
-
- **Obsidian** instructions for a local file-based workflow
|
|
30
|
+
## What your Rover holds
|
|
23
31
|
|
|
24
|
-
|
|
32
|
+
Everything in Rover is one of a few simple kinds of things:
|
|
25
33
|
|
|
26
|
-
|
|
34
|
+
- **Notes** — thoughts, ideas, observations in your own words.
|
|
35
|
+
- **Links** — things from the web, saved with why they matter to you.
|
|
36
|
+
- **Documents** — files you drop into chat: Markdown, PDFs, images.
|
|
37
|
+
- **Topics** — the themes running through your material. You don't
|
|
38
|
+
create these; Rover notices them.
|
|
39
|
+
- **Wishes** — things you asked for that Rover can't do yet.
|
|
40
|
+
- **Agents** — other people's brains, saved to your directory so you
|
|
41
|
+
can ask them things.
|
|
27
42
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
3. Register a passkey in your browser.
|
|
31
|
-
4. Open your Dashboard: `https://<handle>.rizom.ai/`.
|
|
32
|
-
5. If Discord is enabled for you, send Rover a first message there.
|
|
33
|
-
6. If we asked you to test MCP, use the separate MCP connection instructions we sent for your pilot.
|
|
43
|
+
You'll meet each of these as you go. The first three you put in; the
|
|
44
|
+
last three grow out of how you use it.
|
|
34
45
|
|
|
35
|
-
##
|
|
46
|
+
## The way of working
|
|
36
47
|
|
|
37
|
-
|
|
48
|
+
Rover is built around a simple loop:
|
|
38
49
|
|
|
39
|
-
|
|
50
|
+
**Capture → ask back → shape.**
|
|
40
51
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
52
|
+
What makes it work: every note, link, and document you hand Rover
|
|
53
|
+
lands in one connected memory. Rover reads what you save, links it
|
|
54
|
+
to what's already there, and notices the topics running through it.
|
|
55
|
+
Nothing sits in a folder waiting to be found — every capture makes
|
|
56
|
+
the next answer better. Ten notes in, Rover is a notebook; a hundred
|
|
57
|
+
notes in, it starts knowing how you think.
|
|
45
58
|
|
|
46
|
-
|
|
59
|
+
The important part is what you _don't_ do: you don't organize. No
|
|
60
|
+
folders, no tags, no filing things in the right place. You throw
|
|
61
|
+
material in as it comes, and Rover makes sense of it when you need
|
|
62
|
+
it.
|
|
47
63
|
|
|
48
|
-
|
|
64
|
+
### Capture
|
|
49
65
|
|
|
50
|
-
|
|
66
|
+
Notes for what's in your head:
|
|
51
67
|
|
|
52
|
-
|
|
68
|
+
> Save a note: I keep explaining the same idea to clients — maybe
|
|
69
|
+
> it should be a workshop.
|
|
53
70
|
|
|
54
|
-
|
|
71
|
+
Links for what's on your screen:
|
|
55
72
|
|
|
56
|
-
|
|
73
|
+
> Save this link with my workshop idea — it's how someone else
|
|
74
|
+
> structures theirs: https://example.com
|
|
57
75
|
|
|
58
|
-
|
|
76
|
+
Documents for what you already have: drop a Markdown file, a PDF, or
|
|
77
|
+
an image into the chat and ask Rover to save or import it. If you
|
|
78
|
+
have notes living somewhere else, this is the fastest way to give
|
|
79
|
+
Rover a head start.
|
|
59
80
|
|
|
60
|
-
|
|
81
|
+
### Ask back
|
|
61
82
|
|
|
62
|
-
|
|
83
|
+
Ask in whatever words occur to you — Rover searches by meaning, not
|
|
84
|
+
exact phrases, so you don't have to remember what you called
|
|
85
|
+
something:
|
|
63
86
|
|
|
64
|
-
|
|
87
|
+
> What have I added about the workshop idea?
|
|
65
88
|
|
|
66
|
-
>
|
|
89
|
+
> What did I save this week?
|
|
67
90
|
|
|
68
|
-
|
|
91
|
+
And as material accumulates, the topics surface — the themes you
|
|
92
|
+
keep returning to without noticing:
|
|
69
93
|
|
|
70
|
-
>
|
|
94
|
+
> What themes do you see in what I've collected?
|
|
71
95
|
|
|
72
|
-
###
|
|
96
|
+
### Shape
|
|
73
97
|
|
|
74
|
-
|
|
98
|
+
When you want to make something from what you've gathered:
|
|
75
99
|
|
|
76
|
-
>
|
|
100
|
+
> Turn my workshop notes into a one-page outline.
|
|
77
101
|
|
|
78
|
-
|
|
102
|
+
> Make a reading list from the links I saved.
|
|
79
103
|
|
|
80
|
-
|
|
104
|
+
Capture is cheap, asking back is instant, and shaping turns a pile
|
|
105
|
+
of fragments into something you can use. That loop is Rover — and it
|
|
106
|
+
only proves itself on real material, so start with things you
|
|
107
|
+
actually want to keep.
|
|
81
108
|
|
|
82
|
-
|
|
109
|
+
## When Rover can't do something: make a wish
|
|
83
110
|
|
|
84
|
-
|
|
111
|
+
Sooner or later you'll ask for something Rover can't do yet. That's
|
|
112
|
+
where wishes come from: Rover says so honestly and offers to save
|
|
113
|
+
the request as a wish:
|
|
85
114
|
|
|
86
|
-
|
|
115
|
+
> I wish you could remind me about this next Monday.
|
|
87
116
|
|
|
88
|
-
|
|
117
|
+
Wishes flow back to us and shape what gets built next. Asking for
|
|
118
|
+
things Rover can't do is not a failure — it's one of the most useful
|
|
119
|
+
things a pilot user can do.
|
|
89
120
|
|
|
90
|
-
|
|
121
|
+
## Your Rover in the network
|
|
91
122
|
|
|
92
|
-
|
|
123
|
+
The loop has a second payoff. Rover isn't only a private assistant —
|
|
124
|
+
it's your agent in a network of brains, and the connection runs both
|
|
125
|
+
ways.
|
|
93
126
|
|
|
94
|
-
|
|
127
|
+
**Other people's brains become sources.** When someone you know runs
|
|
128
|
+
a brain, you don't have to send them a message and wait — you ask
|
|
129
|
+
their brain directly, from your own chat. Save it to your agents
|
|
130
|
+
once:
|
|
95
131
|
|
|
96
|
-
|
|
132
|
+
> Add yeehaa.io to my agents.
|
|
97
133
|
|
|
98
|
-
|
|
134
|
+
Then ask questions that put their knowledge next to yours:
|
|
99
135
|
|
|
100
|
-
|
|
136
|
+
> Ask yeehaa.io what they've published about designing workshops,
|
|
137
|
+
> and compare it with my own workshop notes.
|
|
101
138
|
|
|
102
|
-
|
|
139
|
+
One ask, both directions: Rover pulls their public knowledge over
|
|
140
|
+
the network, sets it against the material you've been capturing, and
|
|
141
|
+
answers in terms of your situation. What comes back you can think
|
|
142
|
+
with, push back on, or capture:
|
|
103
143
|
|
|
104
|
-
|
|
144
|
+
> Save that comparison as a note with my workshop idea.
|
|
105
145
|
|
|
106
|
-
|
|
146
|
+
That's the loop again, with someone else's knowledge feeding your
|
|
147
|
+
capture. Rover never contacts an agent you haven't saved without
|
|
148
|
+
telling you first, and your private material is never shared — only
|
|
149
|
+
the question you send.
|
|
107
150
|
|
|
108
|
-
|
|
151
|
+
**Your brain becomes a source for others.** The same way you ask
|
|
152
|
+
other agents, they can ask yours. Your Rover answers on your behalf,
|
|
153
|
+
drawing only on what you've chosen to make public — and it builds
|
|
154
|
+
its picture of what you know from everything you capture.
|
|
109
155
|
|
|
110
|
-
|
|
156
|
+
So the network is the quiet consequence of the loop: the more you
|
|
157
|
+
put in, the more useful your Rover is to you — and the better it
|
|
158
|
+
speaks for you when you're not in the room.
|
|
111
159
|
|
|
112
|
-
|
|
160
|
+
## The other doors
|
|
113
161
|
|
|
114
|
-
|
|
162
|
+
Chat is the primary interface, but your Rover has a few more
|
|
163
|
+
entrances. All optional — ignore them until you're curious:
|
|
115
164
|
|
|
116
|
-
|
|
165
|
+
- **Dashboard** — `https://<handle>.rizom.ai/` is your Rover's home
|
|
166
|
+
page in the browser: a quick overview that everything is running.
|
|
167
|
+
- **CMS** — `https://<handle>.rizom.ai/cms` is a browser editor for
|
|
168
|
+
your content, useful when you want to write or restructure
|
|
169
|
+
something longer than a chat message. If it asks for GitHub
|
|
170
|
+
access, use the instructions we sent; if we didn't send any, skip
|
|
171
|
+
the CMS for now.
|
|
172
|
+
- **Your own AI client (MCP)** — Rover can plug into AI apps you
|
|
173
|
+
already use (Claude, Cursor, and others), signed in with the same
|
|
174
|
+
passkey. If you want this, ask us and we'll send the short setup.
|
|
175
|
+
- **Discord** — available for some pilot cohorts as a secondary
|
|
176
|
+
chat. If it's enabled for you, we'll send the invite separately.
|
|
117
177
|
|
|
118
|
-
|
|
178
|
+
Under the hood, everything you save is plain Markdown in a private
|
|
179
|
+
repository that belongs to you. You never have to touch it — but
|
|
180
|
+
your material is never locked in, either.
|
|
119
181
|
|
|
120
|
-
|
|
182
|
+
## What to expect from the pilot
|
|
121
183
|
|
|
122
|
-
|
|
184
|
+
This is a real, working system, and an early one. Expect occasional
|
|
185
|
+
rough edges and visible improvement while you use it. Your Rover is
|
|
186
|
+
deployed specifically for you, your content lives in your own
|
|
187
|
+
private store, and sign-in is by passkey. One ask: avoid putting
|
|
188
|
+
highly sensitive material in during the pilot unless we've agreed
|
|
189
|
+
it's in scope — when unsure, ask.
|
|
123
190
|
|
|
124
|
-
|
|
191
|
+
For questions, feedback, or anything that feels off, join our
|
|
192
|
+
Discord server: `<discord-invite>`. That's the fastest way to reach
|
|
193
|
+
us, and you'll meet the other pilot users there too.
|
|
125
194
|
|
|
126
|
-
If
|
|
195
|
+
## If something doesn't work
|
|
127
196
|
|
|
128
|
-
|
|
197
|
+
- **No setup email** — check spam first, then tell us which address
|
|
198
|
+
to use.
|
|
199
|
+
- **Setup link expired** — tell us; we'll reissue it.
|
|
200
|
+
- **Browser asks for a passkey** — expected; use the one you
|
|
201
|
+
registered during setup.
|
|
202
|
+
- **Anything else** — post in the Discord server with the exact
|
|
203
|
+
error text or a screenshot and we'll sort it out. Never paste your
|
|
204
|
+
setup link anywhere except your own browser.
|
|
129
205
|
|
|
130
|
-
|
|
206
|
+
## Tell us what you notice
|
|
131
207
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
- **MCP** = optional direct client integration through OAuth/passkey login
|
|
135
|
-
- **CMS / git / Obsidian** = optional content-editing workflows when we enable them for you
|
|
208
|
+
The feedback that helps most is small and honest — drop it in the
|
|
209
|
+
Discord server as it occurs to you:
|
|
136
210
|
|
|
137
|
-
|
|
211
|
+
- where setup confused you
|
|
212
|
+
- what felt useful right away, and what felt pointless
|
|
213
|
+
- what you expected Rover to do that it couldn't
|
|
214
|
+
- whether the capture → ask back → shape loop fits how you work
|
|
215
|
+
- whether you'd keep using Rover after the pilot
|
|
138
216
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
- a passkey setup email from Rover
|
|
142
|
-
- this onboarding guide, or a link to it
|
|
143
|
-
- confirmation that Discord is enabled for you, plus the invite/setup steps
|
|
144
|
-
- your **Dashboard URL**: `https://<handle>.rizom.ai/`
|
|
145
|
-
- CMS URL and GitHub token instructions, if CMS editing is enabled
|
|
146
|
-
- private content repo access, if file-based editing is enabled
|
|
147
|
-
- separate MCP connection instructions, if MCP testing is enabled
|
|
148
|
-
- any extra instructions if we are testing a specific workflow with your cohort
|
|
149
|
-
|
|
150
|
-
Keep setup links, GitHub tokens, and any MCP credentials separate. Do not paste the passkey setup link into an MCP client.
|
|
151
|
-
|
|
152
|
-
## Discord
|
|
153
|
-
|
|
154
|
-
Discord is the default chat interface when it is enabled for your pilot. It is separate from the passkey setup email: the email sets up browser/client identity, while Discord is where many users chat with Rover day to day.
|
|
155
|
-
|
|
156
|
-
Use it to:
|
|
157
|
-
|
|
158
|
-
- save quick notes
|
|
159
|
-
- drop in links
|
|
160
|
-
- ask questions
|
|
161
|
-
- use Rover day to day without setting up a separate client
|
|
162
|
-
|
|
163
|
-
If Discord is enabled, we will send the exact invite/setup steps separately.
|
|
164
|
-
|
|
165
|
-
## Dashboard basics
|
|
166
|
-
|
|
167
|
-
The Dashboard is the browser landing page for your Rover.
|
|
168
|
-
|
|
169
|
-
Open it at:
|
|
170
|
-
|
|
171
|
-
```text
|
|
172
|
-
https://<handle>.rizom.ai/
|
|
173
|
-
```
|
|
174
|
-
|
|
175
|
-
Use it to confirm your Rover is up, see available endpoints, and orient yourself before using optional tools. This is not meant to be a public marketing website.
|
|
176
|
-
|
|
177
|
-
## Optional: Working in the CMS
|
|
178
|
-
|
|
179
|
-
If CMS is enabled for you, open:
|
|
180
|
-
|
|
181
|
-
```text
|
|
182
|
-
https://<handle>.rizom.ai/cms
|
|
183
|
-
```
|
|
184
|
-
|
|
185
|
-
The CMS is a browser editor for your Rover content. It may ask for GitHub access because your content lives in a private GitHub repo.
|
|
186
|
-
|
|
187
|
-
Use the CMS when you want to:
|
|
188
|
-
|
|
189
|
-
- create or edit notes in the browser
|
|
190
|
-
- add existing Markdown docs
|
|
191
|
-
- browse structured content collections
|
|
192
|
-
- make cleaner edits than you would in chat
|
|
193
|
-
|
|
194
|
-
A good first CMS task is:
|
|
195
|
-
|
|
196
|
-
1. open the **Notes** collection
|
|
197
|
-
2. create a note titled `Why I’m using Rover`
|
|
198
|
-
3. write 3 to 5 sentences
|
|
199
|
-
4. save it
|
|
200
|
-
5. refresh the CMS and confirm the note is still there
|
|
201
|
-
|
|
202
|
-
If the CMS asks for GitHub access, use the fine-grained GitHub token for your private Rover content repo. If you were not given CMS/GitHub instructions, skip this section.
|
|
203
|
-
|
|
204
|
-
## Optional: direct MCP access
|
|
205
|
-
|
|
206
|
-
MCP is an optional way to connect Rover directly to an AI client that supports remote HTTP MCP.
|
|
207
|
-
|
|
208
|
-
Use MCP only if we ask you to test it or if you already use a client that supports remote HTTP / Streamable HTTP MCP servers.
|
|
209
|
-
|
|
210
|
-
We will send MCP connection details separately when MCP testing is enabled. The normal hosted MCP path is `https://<handle>.rizom.ai/mcp`, but use the exact server URL we send for your pilot.
|
|
211
|
-
|
|
212
|
-
### What the MCP login flow looks like
|
|
213
|
-
|
|
214
|
-
If your client supports OAuth / browser login, the normal flow is:
|
|
215
|
-
|
|
216
|
-
1. In your MCP client, add a remote MCP server.
|
|
217
|
-
2. Enter the Rover MCP server URL we sent you.
|
|
218
|
-
3. The client discovers Rover's OAuth settings automatically.
|
|
219
|
-
4. The client opens a browser window for Rover login.
|
|
220
|
-
5. You sign in with your passkey.
|
|
221
|
-
6. Rover asks you to approve client access.
|
|
222
|
-
7. The client receives an access token automatically.
|
|
223
|
-
8. You can use Rover tools from that client.
|
|
224
|
-
|
|
225
|
-
You should not need to copy a setup link into the client. The setup link is only for registering your first passkey.
|
|
226
|
-
|
|
227
|
-
If your client asks for a token or other credential, use only the MCP instructions we sent separately. Treat any MCP credentials like a password. Do not share them.
|
|
228
|
-
|
|
229
|
-
### Client-specific notes
|
|
230
|
-
|
|
231
|
-
Different MCP clients support remote HTTP and OAuth at different speeds. If you are using Claude Desktop, Cursor, VS Code, MCP Inspector, or another client, tell us the exact version before assuming it should work.
|
|
232
|
-
|
|
233
|
-
### If MCP does not work
|
|
234
|
-
|
|
235
|
-
Send us:
|
|
236
|
-
|
|
237
|
-
- the client name
|
|
238
|
-
- the client version
|
|
239
|
-
- the exact error message
|
|
240
|
-
- a screenshot if possible
|
|
241
|
-
- the server URL you entered, without any secret token
|
|
242
|
-
|
|
243
|
-
Do not paste your passkey setup link into an MCP client.
|
|
244
|
-
|
|
245
|
-
## Optional: git, text files, and Obsidian
|
|
246
|
-
|
|
247
|
-
Rover content can also live as normal markdown/text files in a private GitHub repo.
|
|
248
|
-
|
|
249
|
-
This workflow is optional. Use it only if we explicitly enabled it for you or if you want more control.
|
|
250
|
-
|
|
251
|
-
If enabled, we will:
|
|
252
|
-
|
|
253
|
-
1. create or confirm your private content repo
|
|
254
|
-
2. invite your GitHub account to that repo
|
|
255
|
-
3. send you the repo URL
|
|
256
|
-
4. explain whether to use GitHub Desktop, command-line git, Obsidian, or the CMS
|
|
257
|
-
|
|
258
|
-
You do not need GitHub repo access just to use Rover in Discord.
|
|
259
|
-
|
|
260
|
-
## Wishlist: when Rover cannot do something yet
|
|
261
|
-
|
|
262
|
-
Rover has a built-in wishlist.
|
|
263
|
-
|
|
264
|
-
If you ask for something Rover cannot do yet, it should explain the limitation and save the request as a wish. This helps us see which missing capabilities matter most.
|
|
265
|
-
|
|
266
|
-
## What to expect in the pilot
|
|
267
|
-
|
|
268
|
-
This is a real working system, but it is still an early pilot. Expect some rough edges, setup steps that may still be a bit manual, and improvements during the pilot.
|
|
269
|
-
|
|
270
|
-
## Privacy and boundaries
|
|
271
|
-
|
|
272
|
-
For the pilot:
|
|
273
|
-
|
|
274
|
-
- your Rover is deployed specifically for you
|
|
275
|
-
- browser/client access uses passkeys/OAuth where supported
|
|
276
|
-
- if you are using MCP, we will send separate access instructions
|
|
277
|
-
- your content repo is private when repo access is enabled
|
|
278
|
-
- avoid putting highly sensitive material into the pilot unless we have explicitly agreed that it is in scope
|
|
279
|
-
|
|
280
|
-
If you are unsure whether something belongs in Rover, ask us first.
|
|
281
|
-
|
|
282
|
-
## Troubleshooting
|
|
283
|
-
|
|
284
|
-
### I did not receive the setup email
|
|
285
|
-
|
|
286
|
-
Check spam/promotions first. If it is not there, tell us which email address we should use.
|
|
287
|
-
|
|
288
|
-
### The setup link expired or does not work
|
|
289
|
-
|
|
290
|
-
Reply to your Rover operator. We can rotate/reissue setup.
|
|
291
|
-
|
|
292
|
-
### I opened the domain and it does not look like a normal public site
|
|
293
|
-
|
|
294
|
-
That is expected. The root URL is your Dashboard, not a public marketing site.
|
|
295
|
-
|
|
296
|
-
### The browser asks me to use a passkey
|
|
297
|
-
|
|
298
|
-
That is expected after setup. Use the same passkey you registered from the setup email.
|
|
299
|
-
|
|
300
|
-
### My MCP client cannot connect
|
|
301
|
-
|
|
302
|
-
Send us the client name, version, exact error message, and a screenshot if possible.
|
|
303
|
-
|
|
304
|
-
### The CMS asks for GitHub auth and I am not sure what to do
|
|
305
|
-
|
|
306
|
-
That is expected only if CMS is enabled for you. Use the GitHub token instructions we sent for your private Rover content repo. If you did not receive those instructions, ask us before continuing.
|
|
307
|
-
|
|
308
|
-
## What feedback helps us most
|
|
309
|
-
|
|
310
|
-
We especially want to hear:
|
|
311
|
-
|
|
312
|
-
- what was confusing during setup
|
|
313
|
-
- whether the setup email and passkey flow made sense
|
|
314
|
-
- whether Discord and Dashboard made sense
|
|
315
|
-
- what felt useful immediately
|
|
316
|
-
- what felt weak, awkward, or unclear
|
|
317
|
-
- what you expected Rover to do but could not get it to do
|
|
318
|
-
- whether you would keep using it after the pilot
|
|
319
|
-
|
|
320
|
-
Short, honest feedback is perfect.
|
|
321
|
-
|
|
322
|
-
## Quick handoff template
|
|
323
|
-
|
|
324
|
-
When we onboard you, the message will look roughly like this:
|
|
325
|
-
|
|
326
|
-
```text
|
|
327
|
-
Setup email: sent to <email>
|
|
328
|
-
Onboarding guide: attached / linked
|
|
329
|
-
Dashboard URL: https://<handle>.rizom.ai/
|
|
330
|
-
Discord enabled: yes/no
|
|
331
|
-
Discord setup: <invite link or setup steps>
|
|
332
|
-
MCP access: optional / enabled / not enabled
|
|
333
|
-
MCP setup: sent separately if enabled
|
|
334
|
-
CMS enabled: yes/no
|
|
335
|
-
CMS URL: https://<handle>.rizom.ai/cms
|
|
336
|
-
Content repo access: yes/no
|
|
337
|
-
```
|
|
338
|
-
|
|
339
|
-
If anything is unclear, reply with the exact error text or a screenshot and we will help.
|
|
217
|
+
A few plain sentences are perfect.
|