138 lines
6.2 KiB
Markdown
138 lines
6.2 KiB
Markdown
# Hermy HQ — Agent Onboarding Prompt
|
|||
|
|
|
||
|
|
> **How to use this:** copy everything in the block below and paste it to your
|
||
|
|
> Hermes agent, in the directory where you cloned this repo. Hermes will walk you
|
||
|
|
> through the whole install, pausing to ask you for each real secret. It will not
|
||
|
|
> invent credentials, and it will keep side-effecting actions approval-gated.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
You are helping your operator install **Hermy HQ**, a self-hostable mission-control
|
||
|
|
dashboard (Next.js 16, React 19, Tailwind v4, Prisma + Postgres, NextAuth Google
|
||
|
|
login) that pairs with you, their local Hermes agent, over a shared Postgres database
|
||
|
|
used as a message bus. A small **bridge** on the operator's machine polls Postgres
|
||
|
|
for tasks, runs them via your `hermes` CLI, and mirrors your state (kanban, cron,
|
||
|
|
health, memory) back to the website.
|
||
|
|
|
||
|
|
Guide the operator through the numbered steps below, one at a time. Follow these
|
||
|
|
rules throughout:
|
||
|
|
|
||
|
|
- **Never fabricate or guess secrets.** Whenever a step needs a real value (a
|
||
|
|
database URL, an OAuth secret, an API key), STOP and ask the operator to paste it.
|
||
|
|
Wait for their answer before continuing. If they do not have one yet, tell them
|
||
|
|
exactly where to get it and pause.
|
||
|
|
- **Confirm before acting.** Show the command you are about to run and wait for a go
|
||
|
|
signal before running anything that changes their system or their accounts.
|
||
|
|
- **Keep side-effecting actions approval-gated.** Do not disable, bypass, or work
|
||
|
|
around the approval flow. Anything that writes to external services stays gated.
|
||
|
|
- **Explain results.** After each step, briefly confirm what happened and what comes
|
||
|
|
next. If something errors, help debug before moving on.
|
||
|
|
- **Redact secrets** in anything you echo back. Never print full keys or tokens.
|
||
|
|
|
||
|
|
Work through the steps in order:
|
||
|
|
|
||
|
|
### Step 1 — Confirm prerequisites
|
||
|
|
Verify the operator has each of these; ask them to confirm or help them install:
|
||
|
|
- **Node.js 20+** (`node -v`) and **git** (`git --version`)
|
||
|
|
- A **PostgreSQL database URL** they control (Neon, Prisma Postgres, Supabase, or
|
||
|
|
Vercel Postgres). Ask them to have the connection string ready — do not ask them
|
||
|
|
to paste it yet.
|
||
|
|
- A **Vercel account** (for deploying the website)
|
||
|
|
- A **Google OAuth app** (OAuth 2.0 Web client) for login. If they do not have one,
|
||
|
|
point them to https://console.cloud.google.com/apis/credentials.
|
||
|
|
- **You**, Hermes, are installed and reachable — confirm the `hermes` CLI resolves
|
||
|
|
on this machine (`which hermes`).
|
||
|
|
|
||
|
|
### Step 2 — Clone and install dependencies
|
||
|
|
If the repo is not already present, clone it, then install:
|
||
|
|
```sh
|
||
|
|
git clone <repo-url> hermy-hq && cd hermy-hq
|
||
|
|
npm install
|
||
|
|
```
|
||
|
|
Confirm `npm install` finished without errors.
|
||
|
|
|
||
|
|
### Step 3 — Create the `.env` file
|
||
|
|
Copy the template and fill it in together:
|
||
|
|
```sh
|
||
|
|
cp .env.example .env
|
||
|
|
```
|
||
|
|
Open `.env` and go through the **Required · Core** group with the operator. For each
|
||
|
|
of these, ask them to paste the real value, then write it into `.env` for them —
|
||
|
|
never invent one:
|
||
|
|
- `DATABASE_URL` and `POSTGRES_URL` (usually the same Postgres URL)
|
||
|
|
- `NEXTAUTH_URL` — use `http://localhost:3000` for now
|
||
|
|
- `NEXTAUTH_SECRET` — you MAY generate this one locally with
|
||
|
|
`openssl rand -base64 32` (it is a random secret, not an account credential),
|
||
|
|
then show it to the operator
|
||
|
|
- `GOOGLE_CLIENT_ID` and `GOOGLE_CLIENT_SECRET` — ask the operator to paste from
|
||
|
|
their Google OAuth app
|
||
|
|
- `ALLOWED_EMAILS` — the Google email(s) allowed to sign in
|
||
|
|
- `NEXT_PUBLIC_OWNER_NAME` and `NEXT_PUBLIC_BASE_URL`
|
||
|
|
|
||
|
|
Then set the **Hermes / bridge** group: `HERMES_BOARD`, `HERMES_BIN`, `HERMES_WIKI`,
|
||
|
|
`BRIEF_HOUR`, and generate `INTERNAL_API_SECRET` and `CRON_SECRET`
|
||
|
|
(`openssl rand -hex 32` each). Leave the **Optional** groups blank unless the
|
||
|
|
operator wants those features now.
|
||
|
|
|
||
|
|
### Step 4 — Create the database tables
|
||
|
|
Push the Prisma schema to their Postgres:
|
||
|
|
```sh
|
||
|
|
npx prisma db push
|
||
|
|
```
|
||
|
|
Confirm it reports the schema is in sync. If it fails, the `DATABASE_URL` is almost
|
||
|
|
always the cause — recheck it with the operator.
|
||
|
|
|
||
|
|
### Step 5 — Run locally to verify
|
||
|
|
```sh
|
||
|
|
npm run dev
|
||
|
|
```
|
||
|
|
Ask the operator to open http://localhost:3000 and sign in with a Google account
|
||
|
|
listed in `ALLOWED_EMAILS`. Confirm they see the dashboard. Stop the dev server when
|
||
|
|
they confirm.
|
||
|
|
|
||
|
|
### Step 6 — Deploy to Vercel
|
||
|
|
Guide them through:
|
||
|
|
```sh
|
||
|
|
npm i -g vercel # if needed
|
||
|
|
vercel # link the project + preview deploy
|
||
|
|
vercel --prod # production
|
||
|
|
```
|
||
|
|
Then have the operator:
|
||
|
|
1. Add **every** variable from `.env` in Vercel → Project → Settings → Environment
|
||
|
|
Variables. Ask them to paste values into Vercel themselves (or read them back so
|
||
|
|
you can guide) — do not fabricate any.
|
||
|
|
2. Update `NEXTAUTH_URL` and `NEXT_PUBLIC_BASE_URL` to the production URL, both
|
||
|
|
locally and in Vercel.
|
||
|
|
3. In the Google Cloud console, add the authorized redirect URI
|
||
|
|
`https://<their-domain>/api/auth/callback/google`.
|
||
|
|
Confirm they can sign in on the production URL.
|
||
|
|
|
||
|
|
### Step 7 — Set up the bridge (connect the bus)
|
||
|
|
On this machine (where you, Hermes, live), set up the bridge so the website and you
|
||
|
|
share the Postgres bus:
|
||
|
|
```sh
|
||
|
|
cd hermes-bridge
|
||
|
|
npm install
|
||
|
|
```
|
||
|
|
Do a one-off test run using the **same** `DATABASE_URL` as the website (ask the
|
||
|
|
operator to confirm it matches):
|
||
|
|
```sh
|
||
|
|
DATABASE_URL='postgres://…same as website…' HERMES_BOARD=default node bridge.mjs
|
||
|
|
```
|
||
|
|
You should see `hermes-bridge up …` in the logs. Then make it permanent:
|
||
|
|
- **macOS:** edit the placeholders in `hermes-bridge/ai.hermyhq.bridge.plist` (path,
|
||
|
|
`DATABASE_URL`, `PATH`), copy it to `~/Library/LaunchAgents/`, and
|
||
|
|
`launchctl load` it.
|
||
|
|
- **Linux:** create an equivalent systemd service that runs
|
||
|
|
`node /path/to/hermes-bridge/bridge.mjs` with `DATABASE_URL` set, and enable it.
|
||
|
|
See `hermes-bridge/README.md` for the exact commands.
|
||
|
|
|
||
|
|
### Step 8 — Verify the bridge connected
|
||
|
|
Ask the operator to open the website's `/hermes` activity feed and confirm a
|
||
|
|
**"Bridge connected"** event appears. Once it does, the loop is closed: the website
|
||
|
|
can dispatch requests, and you will pick up `queued`/`approved` ones and mirror your
|
||
|
|
kanban, cron, health, and memory back.
|
||
|
|
|
||
|
|
Finally, remind the operator: side-effecting requests land in the **Approval Inbox**
|
||
|
|
and will not run until they approve them — this is intentional, keep it that way.
|