@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.119",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
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 private AI assistant for working with your own notes, links, and ideas.",""," Set up your passkey:"," {{setupUrl}}",""," This link is single-use. Do not forward it."," It expires at {{expiresAt}}.",""," After setup:"," - Open your dashboard: {{origin}}/"," - If Discord is enabled for your pilot, start there."," - If you are testing MCP, connect your client to {{origin}}/mcp and use OAuth/browser login with your passkey.",""," Read the Rover Pilot User Onboarding guide for Discord, content repo, CMS, and client-specific MCP details:"," 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`---
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
@@ -4,7 +4,7 @@
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
7
- "version": "0.2.0-alpha.119",
7
+ "version": "0.2.0-alpha.120",
8
8
  "type": "module",
9
9
  "exports": {
10
10
  ".": {
@@ -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
- - Discord is enabled by default for pilot users.
12
- - if the user should be an anchor there, add `--anchor-id <discord-user-id>`.
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
- - For browser/CMS-first onboarding, add `setup.delivery: email` and `setup.email` to the user file.
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. For Discord users, hand the Discord setup details to the user. For email-setup users, confirm they received the setup email and completed passkey registration.
38
- 16. Hand over the browser defaults:
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
- - GitHub token guidance for CMS access to the user's private content repo
42
- 17. If they need direct client access, use OAuth/passkey-capable clients where possible.
43
- 18. 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.
44
- 19. Send `docs/user-onboarding.md` to the user as the pilot handoff guide.
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
- # Rover Pilot User Onboarding
1
+ # Welcome to Rover
2
2
 
3
- Welcome to the Rover pilot.
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 is for first-time Rover users. You do not need prior experience with Rover, MCP, git, GitHub, or Obsidian to get started.
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
- ## What Rover is
12
+ ## Get in and say hello
8
13
 
9
- Rover is your private AI assistant for working with your own notes, links, and ideas.
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
- For the current pilot, the normal core experience is:
21
+ > What can you help me do?
12
22
 
13
- - **Passkey setup email** your secure first step
14
- - **Discord** the main chat interface when enabled for your pilot
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
- Some users may also receive:
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
- - **CMS** access at `https://<handle>.rizom.ai/cms`
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
- If we did not explicitly give you CMS, GitHub, MCP, or Obsidian instructions, you can ignore those sections for now.
32
+ Everything in Rover is one of a few simple kinds of things:
25
33
 
26
- ## Start here: setup
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
- 1. Open the setup email from Rover.
29
- 2. Click the passkey setup link.
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
- ## Your setup email
46
+ ## The way of working
36
47
 
37
- The setup email contains a single-use passkey setup link.
48
+ Rover is built around a simple loop:
38
49
 
39
- Treat that link like a temporary password:
50
+ **Capture ask back shape.**
40
51
 
41
- - do not forward it
42
- - use it once
43
- - expect it to expire
44
- - ask us for help if it has expired or does not work
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
- After you register your passkey, the setup link closes. Your passkey becomes the sign-in method for Rover's browser and OAuth-capable client flows.
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
- If your Rover already existed before you received this email, nothing is being reset. The email is just the secure handoff for registering your own passkey so you can sign in yourself.
64
+ ### Capture
49
65
 
50
- ## Your first Rover session
66
+ Notes for what's in your head:
51
67
 
52
- Start in **Discord** if it is enabled for your pilot. That is the normal first interface.
68
+ > Save a note: I keep explaining the same idea to clients maybe
69
+ > it should be a workshop.
53
70
 
54
- ### 1. Say hello
71
+ Links for what's on your screen:
55
72
 
56
- Send:
73
+ > Save this link with my workshop idea — it's how someone else
74
+ > structures theirs: https://example.com
57
75
 
58
- > What can you help me do, and what should I use you for?
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
- Rover should answer with a short overview of what it can do.
81
+ ### Ask back
61
82
 
62
- ### 2. Create your first note
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
- Ask Rover to save a simple note:
87
+ > What have I added about the workshop idea?
65
88
 
66
- > Save a note: I am trying Rover because I want a better way to collect ideas, links, and questions in one place.
89
+ > What did I save this week?
67
90
 
68
- Or:
91
+ And as material accumulates, the topics surface — the themes you
92
+ keep returning to without noticing:
69
93
 
70
- > Help me save my first note.
94
+ > What themes do you see in what I've collected?
71
95
 
72
- ### 3. Add your first link
96
+ ### Shape
73
97
 
74
- Send Rover a link you want to remember:
98
+ When you want to make something from what you've gathered:
75
99
 
76
- > Save this link and tell me why it might be useful later: https://example.com
100
+ > Turn my workshop notes into a one-page outline.
77
101
 
78
- Or:
102
+ > Make a reading list from the links I saved.
79
103
 
80
- > Add this as a link about tools I want to revisit: https://example.com
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
- Rover should save the link and, when possible, keep a short description of why it matters.
109
+ ## When Rover can't do something: make a wish
83
110
 
84
- ### 4. Upload an existing Markdown doc
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
- If you already have notes or docs in Markdown, you do not need to retype them.
115
+ > I wish you could remind me about this next Monday.
87
116
 
88
- Upload a `.md` file and ask Rover to save or import it:
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
- > Save this Markdown doc in my notes.
121
+ ## Your Rover in the network
91
122
 
92
- Or:
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
- > Import this doc and tell me what it is about.
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
- This is often the fastest way to give Rover useful context.
132
+ > Add yeehaa.io to my agents.
97
133
 
98
- ### 5. Ask Rover about what you just added
134
+ Then ask questions that put their knowledge next to yours:
99
135
 
100
- After you have saved a note, link, or Markdown doc, ask Rover to reflect it back:
136
+ > Ask yeehaa.io what they've published about designing workshops,
137
+ > and compare it with my own workshop notes.
101
138
 
102
- > What have I added so far?
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
- Or:
144
+ > Save that comparison as a note with my workshop idea.
105
145
 
106
- > What do you know about what I am interested in so far?
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
- This is the basic Rover loop: add material, then ask Rover to help you think with it.
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
- ### 6. Try a more useful task
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
- Once Rover has a little context, try one of these:
160
+ ## The other doors
113
161
 
114
- > Summarize my notes so far.
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
- > What themes do you see in what I have added?
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
- > Turn my rough note into a clearer paragraph.
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
- > Help me make a small reading list from the links I saved.
182
+ ## What to expect from the pilot
121
183
 
122
- These examples show the main scope of Rover: saving material, organizing it, reflecting on it, and helping you make something from it.
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
- ### 7. Ask another agent
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 your pilot has agent-to-agent access enabled, we will tell you which other agents you can address and how to talk to them. Otherwise Rover should clearly say that this workflow is not available yet.
195
+ ## If something doesn't work
127
196
 
128
- ## The default mental model
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
- If you remember only one thing, remember this:
206
+ ## Tell us what you notice
131
207
 
132
- - **Discord** = talk to Rover, when enabled
133
- - **Dashboard** = browser overview
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
- ## What you will receive from us
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
- Depending on your pilot cohort, we will send you some or all of these:
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.