seedproject-web/agents/console/PLAN.md
Carlos Arias 43ae1e2015 Baseline: full site build (brand, pages, DB, agent-editable)
Establishes the deploy baseline on main so the admin agent's publish/rollback
has a clean starting point. Everything built to date: sumi-e brand system,
homepage, projects (DB-driven case studies), resume, about, services +
website-design detail, contact form + DB, changelog, favicon + share card.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DoFYZY9gkGPNDqZ7NuEa9a
2026-07-23 20:21:28 +00:00

140 lines
6.7 KiB
Markdown

# Admin Agent — Plan
**Goal:** manage the site through an AI agent (headless Claude) — create pages,
edit content, upload images — from two surfaces: a full **/admin dashboard** and
an **in-page console** ("open a page, tell it what to change").
**Decisions locked (2026-07-23):**
- **Full-builder agent** — can create pages, edit any file, restructure. Highest
ceiling, highest risk; sandboxing is mandatory, not optional.
- **Both surfaces** — /admin dashboard + in-page console.
- **Long-lived token** — `claude setup-token` on the server; agent reuses it.
---
## What already exists (don't rebuild)
- `app/src/components/DevConsole.astro` — the in-page console UI (prompt box,
element picker, preview link, Publish). Already on every live page, dormant.
- `astroagent.config.json` — engine config: model, tools
(`Read Write Edit Glob Grep WebSearch`), confined `agentUser`
(`carlos-arias-agent`), skills (`brand`, `ui-ux`, `seo`), console route/port.
- `api/` auth — `account.php` sessions + `ADMIN_TOKEN`.
- Structured content already DB-driven and agent-friendly: `cja_projects`,
`cja_changelog`, `cja_contact`, plus the seed scripts that write them.
- Server has the `claude` CLI and Node 22. Project is a git repo on `main`.
## What's missing (the build)
- The **runner service** the console talks to (`/devconsole/run|publish|...`) —
frontend exists, backend does not.
- **Image upload** anywhere in the flow.
- **Model selector** and the structured **draft + prompt + images** panel.
- The **/admin dashboard**.
- **Media pipeline** (`cja_media` + optimisation).
- **Hardening** — the code-writing agent is the highest-risk surface on the site.
---
## Architecture
```
Browser (you, authed)
├── /admin ................ dashboard SPA: pages, media, agent chat
└── in-page console ........ DevConsole.astro on any page
│ (same-origin fetch, session-authed)
nginx ── /devconsole/* , /admin/* ──► localhost-only runner (Node, :3011)
│ auth gate on every request │
│ ├── headless Claude Code
│ │ (agentUser, confined to repo,
│ │ tools: Read/Write/Edit/Glob/Grep/WebSearch)
│ ├── preview build → public-preview/<jobId>/
│ ├── publish → build public/ + chown + git commit
│ └── media: optimise → app/public/media/ + cja_media
Static site (public/) — unchanged for visitors
```
**Content model — hybrid:**
- Freeform pages (`about`, `services/*`) → the agent edits `.astro` files directly.
- New pages → the agent writes new `.astro` files.
- Structured content (projects, changelog, services data) → DB, edited via
structured tools or the seed JSON/scripts.
- Images → `app/public/media/` (survives rebuilds) + `cja_media` rows.
**Why preview-first matters:** the site is static. Every agent run builds to an
isolated `public-preview/<jobId>/` you can open and review; **nothing goes live
until you press Publish**, which rebuilds `public/` and commits to git.
---
## Phases
### Phase 0 — Foundation & safety *(do first, no features yet)*
- Commit the current working tree as a clean baseline (75 files) so every future
publish is a diff you can roll back.
- Create/confirm the confined `carlos-arias-agent` OS user: can write only the
repo, no sudo, no interactive shell. Install/point `claude` for that user.
- `claude setup-token` on the server → store in `agents/.env` (git-ignored).
- Admin auth: session login (reuse `api/account.php` or a dedicated admin login).
- nginx: `/devconsole/*` and `/admin/*` → localhost runner, **auth-gated**, never
exposed directly. Runner binds `127.0.0.1` only.
- Audit log table (`cja_admin_log`): who ran what, when, published or discarded.
### Phase 1 — In-page console (finish the astroagent)
- Build the runner service: `run` (spawn headless Claude with prompt + page
context, stream output), `preview`, `publish`, `discard`, `ping`, `auth`,
`logout`. Conversation state so follow-ups work ("now make it bigger").
- Wire `DevConsole.astro` to it. Element picker already works.
- Publish pipeline: build → verify build passes → chown → git commit.
- Milestone: open /about, "tighten the opening paragraph," preview, publish.
### Phase 2 — Media
- `cja_media` table + `POST /devconsole/upload`.
- Optimise on upload (resize/compress, like the manual ffmpeg step), write to
`app/public/media/`, return URL + agent-generated alt text.
- Image upload in the console; agent can place uploaded images in a page.
- Milestone: on a project page, "add these three screenshots to the gallery."
### Phase 3 — Admin dashboard (/admin)
- Login → dashboard.
- **Pages**: list (filesystem scan of `app/src/pages` + DB content types),
create-page flow ("make a page for my accounting services"), edit (hands off
to the console or a structured form).
- **Media library**: browse/upload/reuse.
- **Agent panel — your exact spec**: model selector · draft-content box · prompt
box · image-upload area. Draft + prompt + images post to the same runner.
- **Activity log** from `cja_admin_log`.
### Phase 4 — Guardrails & polish
- Feed the agent the brand guide + `brand`/`ui-ux`/`seo` skills so edits stay
on-brand automatically.
- "Build passes" gate is required before Publish is offered.
- One-click **rollback** (git revert the last publish).
- Per-session run/token limits; rate limiting.
---
## Risks & mitigations
1. **Security is the whole game.** A code-writing agent on a public server is the
highest-value target here — a breach means full server control. Mitigations:
admin auth on every request, runner bound to localhost, confined OS user,
audit log, no direct exposure of the agent, rate limits.
2. **The agent can break the build.** → preview-first, build-passes gate, git
commit per publish, one-click rollback.
3. **Unbounded token spend.** → per-session limits; the long-lived token is one
account we can watch.
4. **On-brand drift.** → brand guide + skills injected into every agent run;
preview-before-publish is the human gate.
## Not in scope (yet)
- Multi-user / roles (single admin for now).
- Scheduled autonomous edits (the `agents/` content pipeline is separate and
currently tuned for the old blog — re-tune later if wanted).
## To start Phase 0, I need
- Your go-ahead to commit the current tree as the baseline.
- A decision on admin login: reuse the existing account system, or a simple
single-user admin password to start.