@rizom/ops 0.2.0-alpha.7 → 0.2.0-alpha.70

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.
Files changed (50) hide show
  1. package/README.md +6 -3
  2. package/dist/age-key-bootstrap.d.ts +17 -0
  3. package/dist/brains-ops.js +262 -156
  4. package/dist/cert-bootstrap.d.ts +3 -3
  5. package/dist/content-repo.d.ts +13 -0
  6. package/dist/default-user-runner.d.ts +1 -1
  7. package/dist/deploy.js +3 -170
  8. package/dist/entries/deploy.d.ts +2 -2
  9. package/dist/index.d.ts +3 -0
  10. package/dist/index.js +262 -156
  11. package/dist/load-registry.d.ts +19 -3
  12. package/dist/observed-status.d.ts +1 -1
  13. package/dist/onboard-user.d.ts +2 -2
  14. package/dist/origin-ca.d.ts +1 -1
  15. package/dist/parse-args.d.ts +2 -0
  16. package/dist/push-secrets.d.ts +1 -1
  17. package/dist/reconcile-all.d.ts +2 -2
  18. package/dist/reconcile-cohort.d.ts +2 -2
  19. package/dist/reconcile-lib.d.ts +4 -2
  20. package/dist/run-command.d.ts +1 -2
  21. package/dist/run-subprocess.d.ts +1 -0
  22. package/dist/schema.d.ts +100 -0
  23. package/dist/secrets-encrypt.d.ts +32 -0
  24. package/dist/secrets-push.d.ts +1 -1
  25. package/dist/ssh-key-bootstrap.d.ts +1 -1
  26. package/dist/user-add.d.ts +15 -0
  27. package/dist/user-runner.d.ts +5 -0
  28. package/package.json +7 -3
  29. package/templates/rover-pilot/.env.schema +11 -0
  30. package/templates/rover-pilot/.github/workflows/build.yml +4 -4
  31. package/templates/rover-pilot/.github/workflows/deploy.yml +75 -20
  32. package/templates/rover-pilot/.github/workflows/reconcile.yml +16 -2
  33. package/templates/rover-pilot/README.md +6 -3
  34. package/templates/rover-pilot/deploy/scripts/decrypt-user-secrets.ts +83 -0
  35. package/templates/rover-pilot/deploy/scripts/provision-server.ts +1 -1
  36. package/templates/rover-pilot/deploy/scripts/resolve-deploy-handles.ts +15 -4
  37. package/templates/rover-pilot/deploy/scripts/resolve-user-config.ts +12 -12
  38. package/templates/rover-pilot/deploy/scripts/sync-content-repo.ts +179 -0
  39. package/templates/rover-pilot/deploy/scripts/update-dns.ts +14 -4
  40. package/templates/rover-pilot/docs/onboarding-checklist.md +28 -12
  41. package/templates/rover-pilot/docs/operator-playbook.md +43 -5
  42. package/templates/rover-pilot/docs/user-onboarding.md +292 -99
  43. package/templates/rover-pilot/package.json +3 -0
  44. package/templates/rover-pilot/pilot.yaml +4 -0
  45. package/templates/rover-pilot/users/alice.yaml +5 -1
  46. package/dist/user-secret-names.d.ts +0 -6
  47. package/templates/rover-pilot/.kamal/hooks/pre-deploy +0 -9
  48. package/templates/rover-pilot/deploy/Caddyfile +0 -66
  49. package/templates/rover-pilot/deploy/Dockerfile +0 -38
  50. package/templates/rover-pilot/deploy/kamal/deploy.yml +0 -39
@@ -1,17 +1,33 @@
1
1
  # Onboarding Checklist
2
2
 
3
3
  1. Run `bun install` so the repo uses its pinned `@rizom/ops` version.
4
- 2. Fill in `pilot.yaml`.
5
- 3. Add or edit `users/<handle>.yaml`.
6
- 4. Add the user to a cohort in `cohorts/*.yaml`.
7
- 5. Run `bunx brains-ops render <repo>`.
8
- 6. Run `bunx brains-ops ssh-key:bootstrap <repo> --push-to gh`.
9
- 7. Run `bunx brains-ops cert:bootstrap <repo> <handle> --push-to gh`.
10
- 8. Run `bunx brains-ops secrets:push <repo> <handle>`.
11
- 9. Run `bunx brains-ops onboard <repo> <handle>`.
12
- 10. Verify the deployed rover core contract:
4
+ 2. Run `bunx brains-ops age-key:bootstrap <repo> --push-to gh`.
5
+ 3. Fill in `pilot.yaml`.
6
+ - keep your pinned `brainVersion`
7
+ - confirm shared selectors for `aiApiKey`, `gitSyncToken`, `contentRepoAdminToken`, and `mcpAuthToken`
8
+ - use different tokens for `contentRepoAdminToken` and `gitSyncToken`: admin creates/checks content repos; sync is used by runtime directory-sync
9
+ - confirm `agePublicKey`
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>`.
13
+ - the command creates `users/<handle>.yaml`, `users/<handle>.secrets.yaml`, and the cohort membership without duplicating existing entries.
14
+ 5. Edit the generated user file if the anchor profile needs richer metadata.
15
+ 6. Run `bunx brains-ops render <repo>`.
16
+ 7. Run `bunx brains-ops ssh-key:bootstrap <repo> --push-to gh`.
17
+ 8. Run `bunx brains-ops cert:bootstrap <repo> --push-to gh`.
18
+ 9. Keep raw user secret material locally for now (`.env.local`, file-backed env vars, or equivalent local inputs), including `CONTENT_REPO_ADMIN_TOKEN` for operator onboarding.
19
+ 10. Run `bunx brains-ops secrets:encrypt <repo> <handle>`.
20
+ 11. Commit and push `users/<handle>.secrets.yaml.age`.
21
+ 12. Run `bunx brains-ops onboard <repo> <handle>`.
22
+ 13. Verify the deployed rover core contract:
13
23
  - `https://<handle>.rizom.ai/health` returns `200`
14
24
  - unauthenticated `POST https://<handle>.rizom.ai/mcp` returns `401`
15
- 11. 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.
16
- 12. Hand the MCP connection details to the user.
17
- 13. Send `docs/user-onboarding.md` to the user as the pilot handoff guide.
25
+ 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.
26
+ 15. Hand the Discord setup details to the user.
27
+ 16. Hand over the browser defaults:
28
+ - Dashboard: `https://<handle>.rizom.ai/`
29
+ - CMS: `https://<handle>.rizom.ai/cms`
30
+ - GitHub token guidance for CMS access to the user's private content repo
31
+ 17. If they need direct client access, also hand over the MCP connection details.
32
+ 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.
33
+ 19. Send `docs/user-onboarding.md` to the user as the pilot handoff guide.
@@ -35,14 +35,21 @@ They are scaffolded from `@rizom/ops`, then versioned in this repo like any othe
35
35
 
36
36
  ## Bootstrap flow
37
37
 
38
+ For this fleet, operator-local secret material remains the source of truth during onboarding and rotation. The repo stores encrypted per-user secrets, not raw values.
39
+
38
40
  For a new pilot user, the operator bootstrap order is:
39
41
 
40
- 1. `bunx brains-ops ssh-key:bootstrap <repo> --push-to gh`
41
- 2. `bunx brains-ops cert:bootstrap <repo> <handle> --push-to gh`
42
- 3. `bunx brains-ops secrets:push <repo> <handle>`
43
- 4. `bunx brains-ops onboard <repo> <handle>`
42
+ 1. `bunx brains-ops age-key:bootstrap <repo> --push-to gh`
43
+ 2. `bunx brains-ops ssh-key:bootstrap <repo> --push-to gh`
44
+ 3. `bunx brains-ops cert:bootstrap <repo> --push-to gh`
45
+ 4. `bunx brains-ops secrets:encrypt <repo> <handle>`
46
+ 5. `bunx brains-ops onboard <repo> <handle>`
47
+
48
+ `age-key:bootstrap` keeps a repo-local canonical age identity under `.brains-ops/age/identity.txt`, writes the matching public recipient to `pilot.yaml.agePublicKey`, and can push the private key to GitHub as `AGE_SECRET_KEY`.
49
+
50
+ The shared cert bootstrap writes local cert artifacts under `.brains-ops/certs/shared/`, which stays repo-local and ignored by git.
44
51
 
45
- `brains-ops cert:bootstrap` writes local cert artifacts under `.brains-ops/`, which stays repo-local and ignored by git.
52
+ Preview hosts use the shape `<handle>-preview.rizom.ai`, so one wildcard origin cert for `*.rizom.ai` covers both the primary and preview hosts for every pilot user.
46
53
 
47
54
  ## Upgrading operator behavior
48
55
 
@@ -63,6 +70,37 @@ Use these checks after deploy:
63
70
  - unauthenticated `POST https://<handle>.rizom.ai/mcp` should return `401 Unauthorized: Bearer token required`
64
71
  - a bare `GET /` may also return `401`; that is expected for rover core and does not indicate a bad deploy
65
72
 
73
+ ## Discord bot token checklist
74
+
75
+ Use this when enabling Discord for a pilot user.
76
+
77
+ 1. Pick the user handle (for example `smoke`).
78
+ 2. Open the Discord Developer Portal.
79
+ 3. Create a **new application** for that user's rover.
80
+ 4. Add a **Bot** to the application.
81
+ 5. Copy the bot token.
82
+ 6. Put that value in `.env` or `.env.local` in this repo as `DISCORD_BOT_TOKEN=...` while onboarding that user.
83
+ 7. Keep `discord.enabled: true` in `users/<handle>.yaml` unless you explicitly want to disable the primary pilot interface.
84
+ 8. Encrypt the current per-user secret payload:
85
+ - `bunx brains-ops secrets:encrypt . <handle>`
86
+ 9. Reconcile/deploy the user or cohort:
87
+
88
+ - `bunx brains-ops onboard . <handle>`
89
+ - or `bunx brains-ops reconcile-cohort . <cohort>`
90
+
91
+ 11. In the Discord Developer Portal, generate an install URL and invite the bot to the right server.
92
+ 12. Send a test message in Discord and confirm the rover responds.
93
+
94
+ Notes:
95
+
96
+ - Use **one bot token per user/rover**.
97
+ - Do not reuse the same Discord bot token across multiple pilot users.
98
+ - Discord is the default pilot interface moving forward.
99
+ - The encrypted `users/<handle>.secrets.yaml.age` file is the durable checked-in deploy input; your local env is only the operator staging source.
100
+ - MCP is optional and mainly for direct client access or specific testing workflows.
101
+ - When explaining the content workflow, describe it first as a normal **git repo** of **markdown/text files**.
102
+ - Position **Obsidian** as optional: it is just one possible editor for those same files, not the default requirement.
103
+
66
104
  ## Recovery notes
67
105
 
68
106
  Document known failure modes, recovery steps, and operator notes here.
@@ -2,18 +2,23 @@
2
2
 
3
3
  Welcome to the Rover pilot.
4
4
 
5
- This document is written for **first-time users**. You do **not** need prior experience with Rover, MCP, git, or the rest of the system to get started.
5
+ This guide is written for **first-time users**. You do **not** need prior experience with Rover, MCP, git, GitHub, or Obsidian to get started.
6
6
 
7
7
  ## What Rover is
8
8
 
9
9
  Rover is your private AI assistant for working with your own notes, links, and ideas.
10
10
 
11
- In this pilot, Rover is intentionally simple:
11
+ In this pilot, the normal experience is:
12
12
 
13
- - you talk to it through an **MCP client**
14
- - **there is no website to browse**
15
- - Discord is optional
16
- - Obsidian fits through the git-sync/content-repo workflow, not as the main chat interface
13
+ - **Discord** for chatting with Rover
14
+ - the **Dashboard** in your browser at `https://<handle>.rizom.ai/`
15
+ - the **CMS** in your browser at `https://<handle>.rizom.ai/cms`
16
+
17
+ Optional workflows exist too:
18
+
19
+ - **MCP** for direct client access from supported AI tools
20
+ - **git** if you want to work with the underlying files directly
21
+ - **Obsidian** if you want a nicer note-focused editor for those same files
17
22
 
18
23
  You can think of Rover as a private knowledge companion that helps you:
19
24
 
@@ -23,46 +28,184 @@ You can think of Rover as a private knowledge companion that helps you:
23
28
  - find patterns in what you have collected
24
29
  - think through questions with AI
25
30
 
31
+ ## The default mental model
32
+
33
+ If you remember only one thing, remember this:
34
+
35
+ - **Discord** = talk to Rover
36
+ - **Dashboard** = browser overview
37
+ - **CMS** = browser editing interface
38
+ - **MCP** = optional direct client integration
39
+ - **git / Obsidian** = optional file-based workflow
40
+
41
+ Most pilot users should start with the first three.
42
+
26
43
  ## What you will receive from us
27
44
 
28
- We will send you the details you need to connect.
45
+ We will send you the details you need to get started.
29
46
 
30
47
  That usually includes:
31
48
 
32
- - your Rover URL: `https://<handle>.rizom.ai/mcp`
33
- - your **Bearer token**
34
- - confirmation of whether Discord is enabled for you
49
+ - confirmation that Discord is enabled for you, plus the invite/setup steps
50
+ - your **Dashboard URL**: `https://<handle>.rizom.ai/`
51
+ - your **CMS URL**: `https://<handle>.rizom.ai/cms`
52
+ - if you will use the CMS, an invite to your **private** Rover content repo plus instructions for creating a GitHub token
53
+ - if needed, your Rover MCP URL: `https://<handle>.rizom.ai/mcp`
54
+ - if needed, your **Bearer token**
35
55
  - any extra instructions if we are testing a specific workflow with your cohort
36
56
 
37
- Treat the **Bearer token** like a password. Do not share it.
57
+ If we give you a **Bearer token**, treat it like a password. Do not share it.
58
+
59
+ ## Start here: your first 5 minutes
60
+
61
+ For most users, the best first setup is:
38
62
 
39
- ## One important idea: MCP is just the connection method
63
+ 1. join the Discord server we send you
64
+ 2. open your Dashboard at `https://<handle>.rizom.ai/`
65
+ 3. open the CMS at `https://<handle>.rizom.ai/cms`
66
+ 4. when the CMS asks for GitHub access, use a fine-grained GitHub token with access to your private Rover content repo
67
+ 5. send a first message in Discord and make one small edit in the CMS
68
+
69
+ A simple first chat message is:
70
+
71
+ > What can you help me do, and what should I use you for?
72
+
73
+ Or:
74
+
75
+ > Help me save my first note.
40
76
 
41
- If you have never used MCP before, the shortest explanation is:
77
+ A simple first CMS action is:
78
+
79
+ - open the **Notes** collection
80
+ - create a short note about why you want to use Rover
81
+ - save it
82
+
83
+ If Discord is not enabled for you yet, tell us and we will share the right next step.
84
+
85
+ ## One important idea: Discord + Dashboard + CMS are the default, MCP is optional
86
+
87
+ If you are new to Rover, the shortest explanation is:
42
88
 
43
89
  - **Rover** is the assistant
44
- - **MCP** is the way your AI client connects to Rover
90
+ - **Discord** is the default chat interface
91
+ - the **Dashboard** is the default browser view
92
+ - the **CMS** is the default browser editing interface
93
+ - **MCP** is an optional direct connection method for supported AI clients
94
+
95
+ You do not need to understand the protocol details unless we specifically ask you to use MCP.
96
+
97
+ For most users, the practical meaning is simple:
98
+
99
+ - join Discord
100
+ - open your dashboard in the browser
101
+ - use the CMS when you want to edit structured content directly
102
+ - start using it
103
+
104
+ If your cohort is also testing MCP, we will send the URL, Bearer token, and setup help separately.
105
+
106
+ ## Working in the CMS
107
+
108
+ The CMS is the easiest way to edit Rover content in the browser.
109
+
110
+ Use it when you want to:
111
+
112
+ - create notes without touching git directly
113
+ - edit existing content in a structured form
114
+ - browse your collections in one place
115
+ - make quick updates from the browser
116
+
117
+ ### Why the CMS asks for GitHub access
118
+
119
+ Your Rover content lives in a **private GitHub repo**.
45
120
 
46
- You do not need to understand the protocol details.
121
+ The CMS edits that repo for you.
47
122
 
48
- For the pilot, the practical meaning is simple:
123
+ That is why it asks for a **GitHub token**.
49
124
 
50
- - open a supported client
51
- - add your Rover URL
52
- - paste your Bearer token
53
- - start talking to Rover
125
+ In practice, that means:
54
126
 
55
- ## What to use first
127
+ - you can use the CMS without cloning the repo locally
128
+ - your changes still go into your private content repo
129
+ - if you later open that repo with git or Obsidian, you are looking at the same underlying content
56
130
 
57
- For most users, the easiest first setup is:
131
+ ### What to expect the first time you open it
58
132
 
59
- - **Claude Desktop** for talking to Rover
60
- - **Obsidian** only if you also want to work directly with markdown files later
61
- - **Discord** only if we explicitly enable it for you
133
+ When you open `https://<handle>.rizom.ai/cms`, you should expect something like this:
62
134
 
63
- ## How to connect
135
+ 1. the CMS asks you to authenticate with GitHub
136
+ 2. you enter the GitHub token we told you to create
137
+ 3. the CMS loads your content collections
138
+ 4. you can open an entry, edit it, and save your changes
64
139
 
65
- Use an MCP client that supports:
140
+ If the CMS loads correctly, that is a good sign that:
141
+
142
+ - your browser access is working
143
+ - your repo access is working
144
+ - the token is working
145
+
146
+ ### What you will see in the CMS
147
+
148
+ The exact collections may change over time, but a normal pilot setup includes collections for things like:
149
+
150
+ - **Notes**
151
+ - links or saved resources
152
+ - settings or other structured content
153
+
154
+ The important idea is not the exact list — it is that the CMS is the browser-based editor for your Rover content.
155
+
156
+ ### A good first CMS task
157
+
158
+ A good first CMS task is to create a short note.
159
+
160
+ For example:
161
+
162
+ - open **Notes**
163
+ - create a new note
164
+ - title it something like `Why I’m using Rover`
165
+ - write 3 to 5 sentences
166
+ - save it
167
+
168
+ Then go back to Discord and ask Rover something like:
169
+
170
+ > What do you know about why I’m using Rover so far?
171
+
172
+ That connects the browser editing workflow with the chat workflow.
173
+
174
+ ### When to use Discord vs CMS
175
+
176
+ A good rule of thumb is:
177
+
178
+ Use **Discord** when you want to:
179
+
180
+ - think out loud
181
+ - ask questions
182
+ - capture something quickly
183
+ - use Rover as a day-to-day assistant
184
+
185
+ Use the **CMS** when you want to:
186
+
187
+ - deliberately create or revise content
188
+ - browse existing entries
189
+ - make cleaner edits than you would in chat
190
+ - work in a more editor-like browser interface
191
+
192
+ Use both together. That is the default pilot workflow.
193
+
194
+ ### If the CMS feels confusing
195
+
196
+ That is useful feedback.
197
+
198
+ Please tell us:
199
+
200
+ - what part was confusing
201
+ - whether the problem was authentication, navigation, editing, or saving
202
+ - what you expected to happen instead
203
+
204
+ We want to improve this workflow.
205
+
206
+ ## Optional: direct MCP access
207
+
208
+ If we have asked you to use an MCP client, use one that supports:
66
209
 
67
210
  - **HTTP / Streamable HTTP MCP**
68
211
  - **Bearer token authentication**
@@ -77,9 +220,9 @@ If the client asks for a name, use something simple like:
77
220
 
78
221
  - `Rover (<handle>)`
79
222
 
80
- ## Claude Desktop setup
223
+ ## Optional: Claude Desktop setup
81
224
 
82
- If your Claude Desktop version supports connecting to a **remote HTTP / Streamable HTTP MCP server**, enter:
225
+ If we ask you to connect through Claude Desktop and your version supports a **remote HTTP / Streamable HTTP MCP server**, enter:
83
226
 
84
227
  - **Server URL:** `https://<handle>.rizom.ai/mcp`
85
228
  - **Authentication:** Bearer token
@@ -95,45 +238,108 @@ Or:
95
238
 
96
239
  If your Claude Desktop version only supports local MCP servers and not remote HTTP MCP cleanly, tell us what version you are using and we will help you.
97
240
 
98
- ## Your first 5 minutes
241
+ ## Optional: git, text files, and Obsidian
99
242
 
100
- Once you are connected, try this sequence:
243
+ The underlying content workflow is still a normal **git repo** with normal **markdown/text files**.
101
244
 
102
- ### 1. Check that Rover responds
245
+ But for this pilot, treat that as **optional**.
103
246
 
104
- Ask:
247
+ Use direct git or file-based workflows only if you want more control.
105
248
 
106
- > What can you help me do?
249
+ Obsidian is optional. It is just one possible editor for those files.
107
250
 
108
- ### 2. Save a first note
251
+ That means:
109
252
 
110
- Ask:
253
+ - use **Discord** as the main way to talk to Rover
254
+ - use the **Dashboard** and **CMS** as the normal browser workflow
255
+ - use a normal editor plus **git** only if you want to browse, draft, and edit your files directly
256
+ - use **Obsidian** only if you want a more note-focused interface for the same files
257
+ - Rover can pick up those file changes through the normal git-sync / directory-sync flow
111
258
 
112
- > Save a note: I want to use Rover to collect ideas from my work, reading, and conversations.
259
+ ### Important: your content repo is private
113
260
 
114
- ### 3. Save a useful link
261
+ If you use the git/text-file workflow, you will be working in your own **private** GitHub repo.
115
262
 
116
- Ask:
263
+ That means:
117
264
 
118
- > Save this link and note why it matters to me: <paste URL>
265
+ - you do **not** need repo access just to use Rover in Discord
266
+ - you **do** need GitHub access if you want to clone, edit, and push to your content repo
267
+ - we will invite you only to **your own** content repo, not to the operator repo and not to other users' repos
119
268
 
120
- ### 4. Ask Rover to reflect back what it knows
269
+ ### How you get access
121
270
 
122
- Ask:
271
+ If you want the git/text-file workflow, we will:
123
272
 
124
- > Based on what I’ve stored so far, what themes are starting to emerge?
273
+ 1. create or confirm your private content repo
274
+ 2. invite your GitHub account to that repo
275
+ 3. ask you to accept the GitHub invite
276
+ 4. send you the repo URL
125
277
 
126
- ### 5. Use it as a thinking partner
278
+ ### Authentication options
127
279
 
128
- Ask:
280
+ To work with a private repo or the CMS, you need GitHub authentication.
129
281
 
130
- > I am thinking through a problem in my work. Help me structure the question and identify what context is missing.
282
+ Usually the easiest order is:
283
+
284
+ 1. **GitHub sign-in** to accept the private repo invite
285
+ 2. a **fine-grained personal access token** for the CMS, with access to your private Rover content repo
286
+ 3. **GitHub Desktop** or normal git auth if you also want to clone the repo locally
287
+ 4. **SSH key** only if you already use git that way
288
+
289
+ You do **not** need a GitHub token just to use Rover in Discord.
290
+ You do **not** need an MCP Bearer token unless we explicitly ask you to use MCP.
291
+
292
+ ### If you want the local file workflow
293
+
294
+ If we have already shared your content repo workflow with you, the normal setup is:
295
+
296
+ 1. clone your Rover content repo locally
297
+ 2. edit the markdown/text files in your normal editor, or open that same folder as an Obsidian vault if you prefer
298
+ 3. optionally install the **Obsidian Git** plugin if you want in-app commit/push/pull support
299
+ 4. edit or organize your notes there
300
+ 5. commit and push your changes through normal git, GitHub Desktop, or the Obsidian Git plugin
301
+ 6. let the normal git-sync flow carry those changes into Rover
302
+
303
+ If we have **not** given you a direct content repo workflow yet, that is fine. You can ignore git, text files, and Obsidian for now and use Rover in Discord and the CMS. If we have also asked you to test MCP, you can use that too.
304
+
305
+ ## Discord (default chat interface)
306
+
307
+ Discord is the default chat interface for this pilot.
308
+
309
+ Think of it as the main place to:
310
+
311
+ - save quick notes
312
+ - drop in links to save
313
+ - ask short or long questions
314
+ - use Rover day to day without setting up a separate client
315
+
316
+ Important:
317
+
318
+ - **Discord is the main pilot chat interface**
319
+ - the **Dashboard** and **CMS** are the main browser interfaces
320
+ - MCP is **optional**
321
+ - if Discord is enabled, we will send the exact invite/setup steps separately
322
+ - for some pilot setups, Discord-enabled users may need to supply their own bot token
323
+
324
+ If Discord is **not** enabled for you yet, ask us and we will tell you whether your cohort is on the Discord-first workflow.
325
+
326
+ ## Dashboard basics
327
+
328
+ The Dashboard is the browser landing page for your Rover.
329
+
330
+ Use it when you want to:
331
+
332
+ - confirm the instance is up
333
+ - see the browser-side operator surface
334
+ - jump into the CMS quickly
335
+
336
+ This is not meant to be a public website. It is part of your Rover control surface.
131
337
 
132
338
  ## Wishlist: when Rover cannot do something yet
133
339
 
134
340
  Rover has a built-in **wishlist**.
135
341
 
136
- This is important for first-time users because Rover will not be able to do everything yet.
342
+ This matters because Rover will not be able to do everything yet.
137
343
 
138
344
  If you ask for something Rover cannot do, it should add that request to the wishlist instead of just failing silently.
139
345
 
@@ -185,52 +391,6 @@ If Rover cannot do what you asked, a good response from Rover is something like:
185
391
 
186
392
  If that does **not** happen, that is useful feedback for us too.
187
393
 
188
- ## Obsidian
189
-
190
- Obsidian is part of the pilot through the **git-synced content repo workflow**, not through MCP.
191
-
192
- That means:
193
-
194
- - use **Claude Desktop** as the main way to talk to Rover
195
- - use **Obsidian** if you want to browse, draft, and edit markdown files directly
196
- - Rover can pick up those file changes through the normal git-sync / directory-sync flow
197
-
198
- A simple mental model:
199
-
200
- - **Claude Desktop** = talk to Rover
201
- - **Obsidian** = edit the underlying notes
202
-
203
- If we have already shared your content repo workflow with you, the simplest setup is:
204
-
205
- 1. clone your Rover content repo locally
206
- 2. open that folder as an Obsidian vault
207
- 3. optionally install the **Obsidian Git** plugin if you want in-app commit/push/pull support
208
- 4. edit or organize your markdown notes there
209
- 5. commit and push your changes through normal git or the Obsidian Git plugin
210
- 6. let the normal git-sync flow carry those changes into Rover
211
-
212
- If we have **not** given you a direct content repo workflow yet, that is fine. You can ignore Obsidian for now and use Rover purely through MCP.
213
-
214
- ## Discord (optional)
215
-
216
- Discord is optional in this pilot.
217
-
218
- If it is enabled for you, think of it as a lightweight secondary interface for:
219
-
220
- - quick note capture
221
- - dropping in links to save
222
- - short questions when you do not want to open Claude Desktop
223
-
224
- Important:
225
-
226
- - **MCP remains the main interface**
227
- - Discord is **off by default**
228
- - if you want Discord, tell us explicitly
229
- - for this pilot, Discord-enabled users may need to supply their own bot token
230
- - if Discord is enabled, we will send the exact invite/setup steps separately
231
-
232
- If Discord is **not** enabled for you, that is completely normal.
233
-
234
394
  ## What to expect in the pilot
235
395
 
236
396
  This is a real working system, but it is still an early pilot.
@@ -250,18 +410,43 @@ That is normal. The point of the pilot is to learn from real use.
250
410
  For the pilot:
251
411
 
252
412
  - your Rover is deployed specifically for you
253
- - access to `/mcp` is protected by your Bearer token
413
+ - if you are using MCP, access to `/mcp` is protected by your Bearer token
414
+ - your content repo is private
254
415
  - you should avoid putting highly sensitive material into the pilot unless we have explicitly agreed that it is in scope
255
416
 
256
417
  If you are unsure whether something belongs in Rover, ask us first.
257
418
 
258
419
  ## Troubleshooting
259
420
 
260
- ### I opened the domain and it does not look like a normal site
421
+ ### I opened the domain and it does not look like a normal public site
422
+
423
+ That is expected. The root URL is your **Dashboard**, not a public website. The CMS lives at `/cms`. Rover also runs through Discord and, optionally, a direct MCP endpoint.
424
+
425
+ ### The CMS asks for GitHub auth and I am not sure what to do
426
+
427
+ That is expected.
428
+
429
+ Use the GitHub token we told you to create for your **private Rover content repo**.
261
430
 
262
- That is expected. In this pilot, **there is no website to browse**. Rover core is MCP-first.
431
+ If you are missing one of these pieces, tell us:
263
432
 
264
- ### I got an authentication error
433
+ - you did not get the repo invite
434
+ - you did not accept the repo invite yet
435
+ - you are not sure how to create the token
436
+ - the token was accepted but the CMS still does not load
437
+
438
+ ### The CMS loads, but I am not sure whether my change worked
439
+
440
+ A good quick test is:
441
+
442
+ 1. edit a short note in the CMS
443
+ 2. save it
444
+ 3. refresh the CMS and confirm the change is still there
445
+ 4. ask Rover in Discord about that note
446
+
447
+ If anything in that loop feels unclear, tell us exactly where it became confusing.
448
+
449
+ ### I got an authentication error in MCP
265
450
 
266
451
  Usually this means one of three things:
267
452
 
@@ -291,6 +476,7 @@ If that happens, send us:
291
476
  We especially want to hear:
292
477
 
293
478
  - what was confusing during setup
479
+ - whether Discord, Dashboard, and CMS each made sense
294
480
  - what felt useful immediately
295
481
  - what felt weak, awkward, or unclear
296
482
  - what you expected Rover to do but could not get it to do
@@ -303,10 +489,17 @@ Short, honest feedback is perfect.
303
489
  When we onboard you, the message will look roughly like this:
304
490
 
305
491
  ```text
306
- Rover URL: https://<handle>.rizom.ai/mcp
492
+ Discord enabled: yes/no
493
+ Discord setup: <invite link or setup steps>
494
+ Dashboard URL: https://<handle>.rizom.ai/
495
+ CMS URL: https://<handle>.rizom.ai/cms
496
+ CMS auth: GitHub token with access to your private Rover content repo
497
+ MCP access: optional / enabled / not enabled
498
+
499
+ If MCP is enabled:
500
+ MCP URL: https://<handle>.rizom.ai/mcp
307
501
  Auth type: Bearer token
308
502
  Bearer token: <token>
309
- Discord enabled: yes/no
310
503
  ```
311
504
 
312
505
  If anything is unclear, reply with the exact error text or a screenshot and we will help.
@@ -3,6 +3,9 @@
3
3
  "private": true,
4
4
  "type": "module",
5
5
  "packageManager": "bun@__BUN_VERSION__",
6
+ "dependencies": {
7
+ "age-encryption": "^0.3.0"
8
+ },
6
9
  "devDependencies": {
7
10
  "@rizom/ops": "__BRAINS_OPS_VERSION__"
8
11
  }
@@ -6,3 +6,7 @@ contentRepoPrefix: rover-
6
6
  domainSuffix: .rizom.ai
7
7
  preset: core
8
8
  aiApiKey: AI_API_KEY
9
+ gitSyncToken: GIT_SYNC_TOKEN
10
+ contentRepoAdminToken: CONTENT_REPO_ADMIN_TOKEN
11
+ mcpAuthToken: MCP_AUTH_TOKEN
12
+ agePublicKey: age1replace-with-your-public-key
@@ -1,3 +1,7 @@
1
1
  handle: alice
2
+ anchorProfile:
3
+ name: Alice Example
4
+ description: Replace this with Alice's real public profile summary.
2
5
  discord:
3
- enabled: false
6
+ enabled: true
7
+ # anchorUserId: "123456789012345678"
@@ -1,6 +0,0 @@
1
- export interface UserSecretNames {
2
- gitSyncTokenSecretName: string;
3
- mcpAuthTokenSecretName: string;
4
- discordBotTokenSecretName: string;
5
- }
6
- export declare function deriveUserSecretNames(handle: string): UserSecretNames;
@@ -1,9 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- BRAIN_FILE="${BRAIN_YAML_PATH:-brain.yaml}"
5
- SSH_USER="$(ruby -e 'require "yaml"; config = YAML.load_file("deploy/kamal/deploy.yml") || {}; puts(config.dig("ssh", "user") || "root")')"
6
- IFS=',' read -ra HOSTS <<< "$KAMAL_HOSTS"
7
- for host in "${HOSTS[@]}"; do
8
- scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null "$BRAIN_FILE" "${SSH_USER}@${host}:/opt/brain.yaml"
9
- done