CyppieAgents · Operator Guide

Set up a team and run your first project

CyppieAgents lets you orchestrate a team of AI coding agents — a coordinator and its workers — in one shared workspace. You brief them, watch everything they do, and hold every permission. This guide takes you from a clean checkout to a running team executing a real task.

What you'll build

A 3-agent team (PO + Backend + Tester) working a repo

You'll need

JDK 17+, Git, the Claude CLI signed in

Time

~15 minutes to first task

01

How it fits together

Before any commands, the mental model — it's small, and everything else follows from it.

A “team” in CyppieAgents is a project plus the agents you put in it. One agent is the Product Owner (PO) — the coordinator. The others are workers (a backend agent, a tester, and so on). Agents never talk to each other directly; they talk through channels arranged as a hub‑and‑spoke: every worker has a private channel with the PO, and the PO sits at the center. You — the operator — sit in the loop above all of it: you brief the PO, you can read every channel, and you decide who is allowed to say what.

YOU operator PO hub Backend worker Tester worker Frontend worker
You brief the PO; the PO decomposes and delegates through each worker's private spoke channel. Workers report back up the same channels. Nothing routes worker‑to‑worker.

Two more pieces make the rest of the guide readable:

  • Channels are created for you. When you add a PO and some workers, the platform lays down a shared hub channel plus one private spoke per worker — the hub‑and‑spoke above — automatically.
  • Permissions are an ACL. Who may read and who may write is decided per channel, per participant, and it's fail‑closed: no grant means no access. The hub‑and‑spoke layout is just the default set of grants — you can change any of them.
02

Get the platform running

Agents run on your machine — the server spawns a real claude process per agent, each in its own git worktree. So even if you use the hosted web UI, the server that runs the team is local. Start there.

Prerequisites

JDK 17+ (JetBrains Runtime recommended) · Git · the Claude CLI installed and signed in (claude on your PATH; the agents use your Claude login). An Anthropic API key is optional and set per project, not required to start.

1
Clone and generate your local config

dev-setup.sh writes a .env (with generated tokens) and a starter platform.config.json.

terminal
# from wherever you keep the repo
git clone <your CyppieAgents remote> && cd KMPCyppieAgents
./scripts/dev-setup.sh
# Gradle doesn't auto-load .env — export it into your shell:
set -a; . ./.env; set +a
2
Start the server

It listens on 127.0.0.1:8787. Leave it running in its own terminal.

terminal · server
./gradlew :server:run
# verify in another shell:
curl http://127.0.0.1:8787/api/health    ok
3
Open the app

Run the desktop app, or the web build — either connects to the server on :8787.

terminal · client
# desktop (add hotRun --auto for live reload)
./gradlew :app:desktopApp:run

# …or web, served at http://localhost:8080
./gradlew :app:webApp:wasmJsBrowserDevelopmentRun

The operator token

Full control — creating projects, adding agents, granting access, starting agents — needs the operator token. dev-setup.sh puts one OPERATOR_TOKEN in .env; the same value must be present for both server and client. If the app opens but every control is greyed out, that token isn't matching.

03

Create your team

A team is a project with agents in it. You can do all of this in the app; the exact API call is shown alongside each step so you can script it later.

1
Create the project

In the project switcher, choose New project and give it an id and a name. The id must be path‑safe (letters, digits, underscore) because it also scopes worktrees on disk.

POST /api/projects
{ "id": "demo", "name": "Demo Team" }

The platform starts you in a default project; creating demo and switching to it keeps this walkthrough isolated. Everything after this — channels, agents, permissions, event log — is scoped to the active project.

2
Point the team at a repository

In Project settings, set the Git URL and branch your agents will work on. A local path (file:///…) is perfect for a first run. Optionally set an Anthropic API key here — leave it empty to have agents use your Claude CLI login instead.

PUT /api/config/repo
{ "url": "file:///Users/you/demo-app", "branch": "main" }

Credentials

Prefer your Claude subscription login (the CLI's own auth) for agent runs. Only set an ANTHROPIC_API_KEY if you specifically intend to bill the API. The key is stored server‑side, shown masked, and never logged.

3
Add the agents

Open Agent management → Add agent. Add the coordinator first, then the workers. The persona field is that agent's brief — it becomes the agent's CLAUDE.md when it starts, so this is where its role and rules live.

POST /api/agents · ×3
{ "id":"po",      "name":"Product Owner", "role":"PO",
  "launch":"claude", "persona":"You coordinate. Decompose the task, "
                    "delegate to workers via their channels, review, report back." }

{ "id":"backend", "name":"Backend", "role":"WORKER",
  "launch":"claude", "persona":"You implement server-side changes and push a branch." }

{ "id":"tester",  "name":"Tester",  "role":"WORKER",
  "launch":"claude", "persona":"You write and run tests; report pass/fail with evidence." }

Adding an agent registers it — it doesn't start yet. Exactly one agent may hold the PO role. As soon as your PO and workers exist, the hub channel and each worker's spoke are laid down with the default hub‑and‑spoke permissions.

04

Start the team

Each agent has its own window with a Start / Stop / Restart control and a live status. Start the PO and the workers; the server spawns a claude process for each, in that agent's worktree.

POST /api/agents/<id>/start
POST /api/agents/po/start        { "agentId":"po",      "status":"RUNNING" }
POST /api/agents/backend/start   { "agentId":"backend", "status":"RUNNING" }
POST /api/agents/tester/start    { "agentId":"tester",  "status":"RUNNING" }

Watch each window's badge move to running. The states you'll see:

RUNNING  process is live and listening  ·  STOPPED  not spawned  ·  ERROR  spawn failed — check the log

If an agent won't start

An ERROR almost always means the claude CLI isn't signed in, or a project API key was set but is invalid. The server itself keeps running; fix the credential and hit Restart.

05

Run an example project

Now the point of the whole thing: hand the team a task and watch it flow. You only ever talk to the PO — in the shared hub channel.

1
Brief the PO

In the comm timeline, select the hub channel and post a task in the composer. Mark it as a task so it reads clearly in the log.

POST /api/channels/po-po/messages
{ "body": "Add a GET /health endpoint that returns 200 'ok',"
          "with a test. Small PR.",
  "meta": { "kind": "TASK" } }
2
Watch the coordination happen

You don't drive any of this — you observe it:

  • The PO reads the task, breaks it down, and posts subtasks into the backend and tester spokes.
  • Each worker picks up its spoke, does the work in its own worktree, commits, and pushes its branch.
  • Workers post status back up their spoke; the PO gathers it and posts a summary in the hub — that's what lands back with you.

Each agent window streams what its agent is doing in real time; the comm timeline shows the messages moving between them; and the event log gives you the audited, metadata‑only record of every task, grant, and lifecycle change.

3
Close the loop

When the PO reports done, you have real branches pushed to your repo. Review them as you would any teammate's work and merge on your terms — you stayed the architect the whole way through.

Keep tasks small

Agents are most reliable on tight, well‑scoped tasks with a clear definition of done. “Add one endpoint with a test” beats “build the feature.” Tighten the personas and shrink the tasks, and the team stays predictable.

06

Bring in a teammate

Agents aren't the only members of a team — people can join a channel too. A signed‑in person starts as a read‑only member; you decide, per channel, whether they can also post.

1
Open the access panel

The ACL panel is a matrix of channels against participants. It has two bands: Agents and People. The People band lists everyone with a verified login (from your workspace roster) and only ever appears to you, the operator.

2
Grant write on a channel

Find the person, find the channel, toggle Write on. That's the whole gesture — they can now post there; toggle it off and they can't.

PUT /api/acl
{ "channelId":"po-backend",
  "agentId":"<their-identity-id>",   // a person is just another participant
  "canRead":true, "canWrite":true }

Granting write also makes them a member of that channel, so they can read the thread they're now part of. Nothing else about their view changes — people see only what they've been granted, and never the roster of other people.

07

Who can do what

There are two tiers of person. The distinction is simple and it's enforced everywhere.

Operator you

  • Create projects, add and start agents
  • Grant and revoke channel access
  • Set the repo and API key
  • Read every channel and the event log

Member teammate

  • Reads only channels you've granted
  • Posts only where granted write
  • Can't configure or start anything
  • Sees nothing until granted — fail‑closed

On the hosted instance, a teammate signs up and verifies their email, then lands as a member with an empty view until you grant them a channel. During local development you act as operator through the operator token, so you can do everything above without any of the sign‑up flow.

08

Reference & troubleshooting

Commands

Do thisCommand
Generate local config./scripts/dev-setup.sh
Load env into shellset -a; . ./.env; set +a
Run the server :8787./gradlew :server:run
Run the desktop app./gradlew :app:desktopApp:run
Run the web app :8080./gradlew :app:webApp:wasmJsBrowserDevelopmentRun
Health checkcurl 127.0.0.1:8787/api/health

Endpoints you'll use most

MethodPathPurposeAccess
POST/api/projectsCreate a projectoperator
POST/api/projects/switchSwitch active projectoperator
POST/api/agentsAdd an agentoperator
POST/api/agents/<id>/startStart / stop / restartoperator
PUT/api/config/repoSet repo & branchoperator
PUT/api/config/apikeySet API key (masked)operator
GET/api/channelsList readable channelsmember+
POST/api/channels/<id>/messagesPost a messagewrite‑granted
PUT/api/aclGrant / revoke accessoperator
GET/api/eventsAudited event logoperator
GET/api/auth/meWho am I / my tierpublic

When something's off

SymptomCause & fix
Server won't bootEnv not loaded, or the configured repo isn't clonable. Re‑run set -a; . ./.env; set +a and confirm the repo URL.
App opens, all controls greyed outOPERATOR_TOKEN doesn't match between client and server. Make them identical and reconnect.
Agent shows ERRORThe claude CLI isn't signed in, or a set API key is invalid. Fix the credential, hit Restart.
A granted teammate still can't postWrite was granted on a channel that doesn't exist. Grant on a real channel from the list — a bad target fails fast with a clear message.