@rizom/ops 0.2.0-alpha.12 → 0.2.0-alpha.14
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/README.md +4 -2
- package/dist/age-key-bootstrap.d.ts +17 -0
- package/dist/brains-ops.js +170 -152
- package/dist/cert-bootstrap.d.ts +2 -2
- package/dist/content-repo.d.ts +3 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +169 -151
- package/dist/load-registry.d.ts +5 -3
- package/dist/push-secrets.d.ts +1 -1
- package/dist/run-command.d.ts +0 -1
- package/dist/schema.d.ts +35 -4
- package/dist/secrets-encrypt.d.ts +32 -0
- package/dist/secrets-push.d.ts +1 -1
- package/package.json +5 -3
- package/templates/rover-pilot/.env.schema +5 -0
- package/templates/rover-pilot/.github/workflows/deploy.yml +37 -21
- package/templates/rover-pilot/README.md +3 -2
- package/templates/rover-pilot/deploy/Caddyfile +1 -1
- package/templates/rover-pilot/deploy/kamal/deploy.yml +1 -1
- package/templates/rover-pilot/deploy/scripts/decrypt-user-secrets.ts +83 -0
- package/templates/rover-pilot/deploy/scripts/provision-server.ts +1 -1
- package/templates/rover-pilot/deploy/scripts/resolve-deploy-handles.ts +3 -3
- package/templates/rover-pilot/deploy/scripts/resolve-user-config.ts +12 -12
- package/templates/rover-pilot/docs/onboarding-checklist.md +21 -12
- package/templates/rover-pilot/docs/operator-playbook.md +43 -5
- package/templates/rover-pilot/docs/user-onboarding.md +86 -58
- package/templates/rover-pilot/package.json +3 -0
- package/templates/rover-pilot/pilot.yaml +3 -0
- package/templates/rover-pilot/users/alice.yaml +2 -1
- package/dist/user-secret-names.d.ts +0 -6
|
@@ -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
|
|
41
|
-
2. `bunx brains-ops
|
|
42
|
-
3. `bunx brains-ops
|
|
43
|
-
4. `bunx brains-ops
|
|
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
|
-
|
|
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.
|
|
@@ -10,10 +10,10 @@ Rover is your private AI assistant for working with your own notes, links, and i
|
|
|
10
10
|
|
|
11
11
|
In this pilot, Rover is intentionally simple:
|
|
12
12
|
|
|
13
|
-
- you talk to it
|
|
13
|
+
- you will usually talk to it in **Discord**
|
|
14
14
|
- **there is no website to browse**
|
|
15
|
-
-
|
|
16
|
-
-
|
|
15
|
+
- **MCP is optional** and only needed for direct client access or specific testing workflows
|
|
16
|
+
- your content can also live in a normal git repo of markdown/text files; **Obsidian is optional** if you want a nicer note-editing interface
|
|
17
17
|
|
|
18
18
|
You can think of Rover as a private knowledge companion that helps you:
|
|
19
19
|
|
|
@@ -25,45 +25,66 @@ You can think of Rover as a private knowledge companion that helps you:
|
|
|
25
25
|
|
|
26
26
|
## What you will receive from us
|
|
27
27
|
|
|
28
|
-
We will send you the details you need to
|
|
28
|
+
We will send you the details you need to get started.
|
|
29
29
|
|
|
30
30
|
That usually includes:
|
|
31
31
|
|
|
32
|
-
-
|
|
33
|
-
- your
|
|
34
|
-
-
|
|
32
|
+
- confirmation that Discord is enabled for you, plus the invite/setup steps
|
|
33
|
+
- if needed, your Rover MCP URL: `https://<handle>.rizom.ai/mcp`
|
|
34
|
+
- if needed, your **Bearer token**
|
|
35
35
|
- if needed, an invite to your **private** Rover content repo
|
|
36
36
|
- any extra instructions if we are testing a specific workflow with your cohort
|
|
37
37
|
|
|
38
|
-
|
|
38
|
+
If we give you a **Bearer token**, treat it like a password. Do not share it.
|
|
39
39
|
|
|
40
|
-
## One important idea:
|
|
40
|
+
## One important idea: Discord is the default, MCP is optional
|
|
41
41
|
|
|
42
|
-
If you
|
|
42
|
+
If you are new to Rover, the shortest explanation is:
|
|
43
43
|
|
|
44
44
|
- **Rover** is the assistant
|
|
45
|
-
- **
|
|
45
|
+
- **Discord** is the default way most pilot users will talk to it
|
|
46
|
+
- **MCP** is an optional direct connection method for supported AI clients
|
|
46
47
|
|
|
47
|
-
You do not need to understand the protocol details.
|
|
48
|
+
You do not need to understand the protocol details unless we specifically ask you to use MCP.
|
|
48
49
|
|
|
49
|
-
For
|
|
50
|
+
For most users, the practical meaning is simple:
|
|
50
51
|
|
|
51
|
-
-
|
|
52
|
-
-
|
|
53
|
-
-
|
|
54
|
-
|
|
52
|
+
- join Discord
|
|
53
|
+
- message Rover there
|
|
54
|
+
- start using it
|
|
55
|
+
|
|
56
|
+
If your cohort is also testing MCP, we will send the URL, Bearer token, and setup help separately.
|
|
55
57
|
|
|
56
58
|
## What to use first
|
|
57
59
|
|
|
58
60
|
For most users, the easiest first setup is:
|
|
59
61
|
|
|
60
|
-
- **
|
|
61
|
-
- **
|
|
62
|
-
- **
|
|
62
|
+
- **Discord** for talking to Rover
|
|
63
|
+
- a normal **git repo of markdown/text files** only if you also want to work directly with your content later
|
|
64
|
+
- **Obsidian** only if you want a friendlier interface for those same files
|
|
65
|
+
- **Claude Desktop** or another MCP client only if we explicitly ask you to test a direct MCP workflow
|
|
66
|
+
|
|
67
|
+
## Default setup: Discord
|
|
68
|
+
|
|
69
|
+
For most users, getting started means:
|
|
70
|
+
|
|
71
|
+
- join the Discord server we send you
|
|
72
|
+
- open the Rover channel or DM
|
|
73
|
+
- send a first message
|
|
74
|
+
|
|
75
|
+
Try a first message like:
|
|
76
|
+
|
|
77
|
+
> What can you help me do, and what should I use you for?
|
|
78
|
+
|
|
79
|
+
Or:
|
|
80
|
+
|
|
81
|
+
> Help me save my first note.
|
|
82
|
+
|
|
83
|
+
If Discord is not enabled for you yet, tell us and we will share the right next step.
|
|
63
84
|
|
|
64
|
-
##
|
|
85
|
+
## Optional: direct MCP access
|
|
65
86
|
|
|
66
|
-
|
|
87
|
+
If we have asked you to use an MCP client, use one that supports:
|
|
67
88
|
|
|
68
89
|
- **HTTP / Streamable HTTP MCP**
|
|
69
90
|
- **Bearer token authentication**
|
|
@@ -78,9 +99,9 @@ If the client asks for a name, use something simple like:
|
|
|
78
99
|
|
|
79
100
|
- `Rover (<handle>)`
|
|
80
101
|
|
|
81
|
-
## Claude Desktop setup
|
|
102
|
+
## Optional: Claude Desktop setup
|
|
82
103
|
|
|
83
|
-
If
|
|
104
|
+
If we ask you to connect through Claude Desktop and your version supports a **remote HTTP / Streamable HTTP MCP server**, enter:
|
|
84
105
|
|
|
85
106
|
- **Server URL:** `https://<handle>.rizom.ai/mcp`
|
|
86
107
|
- **Authentication:** Bearer token
|
|
@@ -186,34 +207,38 @@ If Rover cannot do what you asked, a good response from Rover is something like:
|
|
|
186
207
|
|
|
187
208
|
If that does **not** happen, that is useful feedback for us too.
|
|
188
209
|
|
|
189
|
-
## Obsidian
|
|
210
|
+
## Git, text files, and Obsidian
|
|
190
211
|
|
|
191
|
-
|
|
212
|
+
The underlying content workflow is a normal **git repo** with normal **markdown/text files**.
|
|
213
|
+
|
|
214
|
+
Obsidian is optional. It is just one possible editor for those files.
|
|
192
215
|
|
|
193
216
|
That means:
|
|
194
217
|
|
|
195
|
-
- use **
|
|
196
|
-
- use **
|
|
218
|
+
- use **Discord** as the main way to talk to Rover
|
|
219
|
+
- use a normal editor plus **git** if you want to browse, draft, and edit your files directly
|
|
220
|
+
- use **Obsidian** only if you want a more note-focused interface for the same files
|
|
197
221
|
- Rover can pick up those file changes through the normal git-sync / directory-sync flow
|
|
198
222
|
|
|
199
223
|
A simple mental model:
|
|
200
224
|
|
|
201
|
-
- **
|
|
202
|
-
- **
|
|
225
|
+
- **Discord** = talk to Rover
|
|
226
|
+
- **git repo + text files** = the underlying content
|
|
227
|
+
- **Obsidian** = an optional editor for that content
|
|
203
228
|
|
|
204
229
|
### Important: your content repo is private
|
|
205
230
|
|
|
206
|
-
If you use the
|
|
231
|
+
If you use the git/text-file workflow, you will be working in your own **private** GitHub repo.
|
|
207
232
|
|
|
208
233
|
That means:
|
|
209
234
|
|
|
210
|
-
- you do **not** need repo access just to use Rover through MCP
|
|
235
|
+
- you do **not** need repo access just to use Rover in Discord or through MCP
|
|
211
236
|
- you **do** need GitHub access if you want to clone, edit, and push to your content repo
|
|
212
237
|
- we will invite you only to **your own** content repo, not to the operator repo and not to other users' repos
|
|
213
238
|
|
|
214
239
|
### How you get access
|
|
215
240
|
|
|
216
|
-
If you want the
|
|
241
|
+
If you want the git/text-file workflow, we will:
|
|
217
242
|
|
|
218
243
|
1. create or confirm your private content repo
|
|
219
244
|
2. invite your GitHub account to that repo
|
|
@@ -227,10 +252,9 @@ The easiest path for most first-time users is:
|
|
|
227
252
|
1. install **GitHub Desktop**
|
|
228
253
|
2. accept the repo invite in GitHub
|
|
229
254
|
3. clone the private repo with GitHub Desktop
|
|
230
|
-
4. open the cloned folder
|
|
231
|
-
5. optionally
|
|
232
|
-
6.
|
|
233
|
-
7. commit and push your changes
|
|
255
|
+
4. open the cloned folder in your normal editor and edit the markdown/text files directly
|
|
256
|
+
5. optionally open that same folder as an **Obsidian** vault if you prefer
|
|
257
|
+
6. commit and push your changes
|
|
234
258
|
|
|
235
259
|
### Authentication options
|
|
236
260
|
|
|
@@ -242,38 +266,38 @@ Usually the easiest order is:
|
|
|
242
266
|
2. **SSH key** if you already use git that way
|
|
243
267
|
3. a **fine-grained personal access token** only if another tool specifically requires it
|
|
244
268
|
|
|
245
|
-
You do **not** need a personal access token just to use Rover through MCP.
|
|
269
|
+
You do **not** need a personal access token just to use Rover in Discord or through MCP.
|
|
246
270
|
|
|
247
271
|
If we have already shared your content repo workflow with you, the normal setup is:
|
|
248
272
|
|
|
249
273
|
1. clone your Rover content repo locally
|
|
250
|
-
2. open that folder as an Obsidian vault
|
|
274
|
+
2. edit the markdown/text files in your normal editor, or open that same folder as an Obsidian vault if you prefer
|
|
251
275
|
3. optionally install the **Obsidian Git** plugin if you want in-app commit/push/pull support
|
|
252
|
-
4. edit or organize your
|
|
253
|
-
5. commit and push your changes through normal git or the Obsidian Git plugin
|
|
276
|
+
4. edit or organize your notes there
|
|
277
|
+
5. commit and push your changes through normal git, GitHub Desktop, or the Obsidian Git plugin
|
|
254
278
|
6. let the normal git-sync flow carry those changes into Rover
|
|
255
279
|
|
|
256
|
-
If we have **not** given you a direct content repo workflow yet, that is fine. You can ignore Obsidian for now and use Rover
|
|
280
|
+
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. If we have also asked you to test MCP, you can use that too.
|
|
257
281
|
|
|
258
|
-
## Discord (
|
|
282
|
+
## Discord (default)
|
|
259
283
|
|
|
260
|
-
Discord is
|
|
284
|
+
Discord is the default interface for this pilot.
|
|
261
285
|
|
|
262
|
-
|
|
286
|
+
Think of it as the main place to:
|
|
263
287
|
|
|
264
|
-
- quick
|
|
265
|
-
-
|
|
266
|
-
- short
|
|
288
|
+
- save quick notes
|
|
289
|
+
- drop in links to save
|
|
290
|
+
- ask short or long questions
|
|
291
|
+
- use Rover day to day without setting up a separate client
|
|
267
292
|
|
|
268
293
|
Important:
|
|
269
294
|
|
|
270
|
-
- **
|
|
271
|
-
-
|
|
272
|
-
- if you want Discord, tell us explicitly
|
|
273
|
-
- for this pilot, Discord-enabled users may need to supply their own bot token
|
|
295
|
+
- **Discord is the main pilot interface moving forward**
|
|
296
|
+
- MCP is **optional**
|
|
274
297
|
- if Discord is enabled, we will send the exact invite/setup steps separately
|
|
298
|
+
- for some pilot setups, Discord-enabled users may need to supply their own bot token
|
|
275
299
|
|
|
276
|
-
If Discord is **not** enabled for you,
|
|
300
|
+
If Discord is **not** enabled for you yet, ask us and we will tell you whether your cohort is on the Discord-first workflow.
|
|
277
301
|
|
|
278
302
|
## What to expect in the pilot
|
|
279
303
|
|
|
@@ -294,7 +318,7 @@ That is normal. The point of the pilot is to learn from real use.
|
|
|
294
318
|
For the pilot:
|
|
295
319
|
|
|
296
320
|
- your Rover is deployed specifically for you
|
|
297
|
-
- access to `/mcp` is protected by your Bearer token
|
|
321
|
+
- if you are using MCP, access to `/mcp` is protected by your Bearer token
|
|
298
322
|
- you should avoid putting highly sensitive material into the pilot unless we have explicitly agreed that it is in scope
|
|
299
323
|
|
|
300
324
|
If you are unsure whether something belongs in Rover, ask us first.
|
|
@@ -303,9 +327,9 @@ If you are unsure whether something belongs in Rover, ask us first.
|
|
|
303
327
|
|
|
304
328
|
### I opened the domain and it does not look like a normal site
|
|
305
329
|
|
|
306
|
-
That is expected. In this pilot, **there is no website to browse**. Rover
|
|
330
|
+
That is expected. In this pilot, **there is no website to browse**. Rover runs through Discord and, optionally, a direct MCP endpoint.
|
|
307
331
|
|
|
308
|
-
### I got an authentication error
|
|
332
|
+
### I got an authentication error in MCP
|
|
309
333
|
|
|
310
334
|
Usually this means one of three things:
|
|
311
335
|
|
|
@@ -347,10 +371,14 @@ Short, honest feedback is perfect.
|
|
|
347
371
|
When we onboard you, the message will look roughly like this:
|
|
348
372
|
|
|
349
373
|
```text
|
|
350
|
-
|
|
374
|
+
Discord enabled: yes/no
|
|
375
|
+
Discord setup: <invite link or setup steps>
|
|
376
|
+
MCP access: optional / enabled / not enabled
|
|
377
|
+
|
|
378
|
+
If MCP is enabled:
|
|
379
|
+
MCP URL: https://<handle>.rizom.ai/mcp
|
|
351
380
|
Auth type: Bearer token
|
|
352
381
|
Bearer token: <token>
|
|
353
|
-
Discord enabled: yes/no
|
|
354
382
|
```
|
|
355
383
|
|
|
356
384
|
If anything is unclear, reply with the exact error text or a screenshot and we will help.
|