Skip to main content

Quickstart

This page takes you from nothing to a running Keeper with a Colony, an Agent and a Run. Everything here works against v0.1.0.

Read the honest ending first: the Run you create at the end will sit in RUN_PHASE_PENDING and never execute, because v0.1.0 has no Scheduler and no Executor. See Roadmap.

Prerequisites​

  • podman or docker, with compose support. The dev stack runs the Keeper and Postgres as containers.
  • Optionally a Go toolchain, if you want to go install the CLI or build from source.

Install the CLI​

Three options.

Release binaries. Every release attaches hived and hived-keeper binaries for linux, macOS and Windows on amd64 and arm64, plus a checksums.txt.

With a Go toolchain:

go install github.com/vibed-project/hiveD/cmd/hived@latest

From a checkout, which builds through the pinned toolchain container:

make build-cli # produces bin/hived
make build # produces bin/hived-keeper

The Keeper container image​

The Keeper ships as a container image:

docker pull ghcr.io/vibed-project/hived-keeper:v0.1.0

The image is multi-arch (linux amd64 and arm64).

Pin a version tag. :latest is republished on every push to main, not only on releases, so it does not track the newest release and can move under you.

Start a Keeper​

From a checkout of the repository:

make compose-up # Keeper + Postgres
make compose-logs
make compose-down # tears down, including volumes

make compose-up runs podman compose -f deploy/compose/docker-compose.yaml up -d --build. If you use docker instead, the same file works directly:

docker compose -f deploy/compose/docker-compose.yaml up -d --build

Check that it came up:

curl localhost:8080/healthz # {"status":"ok"}
curl localhost:8080/readyz # {"status":"ready"} once Postgres is reachable
curl localhost:9090/metrics # Prometheus metrics, separate port

The compose file also defines a mindD service behind the mind profile. It is a placeholder that documents a future integration point, it builds from a sibling checkout, and nothing in v0.1.0 uses it. You do not need it.

Keeper configuration​

The Keeper is configured entirely through environment variables.

VariableDefaultMeaning
HIVED_PG_DSNpostgres://hived:hived@localhost:5432/hived?sslmode=disablePostgres connection string
HIVED_LISTEN_ADDR:8080API listener (connect-go: gRPC, gRPC-Web, HTTP/JSON)
HIVED_METRICS_ADDR:9090Prometheus listener, deliberately a separate port
HIVED_LOG_LEVELinfodebug, info, warn, error
HIVED_LOG_FORMATjsonjson or text
HIVED_AUTO_MIGRATEtrueRun schema migrations on startup

hived-keeper has three subcommands: serve, migrate <up|down|status> and version.

Apply a Colony​

Manifests use a Kubernetes-style envelope: apiVersion, kind, metadata, spec. The only accepted apiVersion is hived/v1alpha1; anything else is rejected rather than silently reinterpreted. Unknown fields are also rejected, so a typo fails the apply instead of producing an empty spec.

# colony.yaml
apiVersion: hived/v1alpha1
kind: Colony
metadata:
name: acme
spec:
displayName: Acme Corp
quotas:
maxConcurrentRuns: 4
tokenBudget: 1000000
costBudget: "25.00"
memoryRoot: colony/acme
hived apply -f colony.yaml
hived get colonies

Colony is the only hive-scoped kind: it has no metadata.colony of its own. Quotas and policies are stored but not enforced in v0.1.0.

Apply an Agent and an AgentVersion​

Agent is the mutable envelope. The real definition lives on AgentVersion, whose spec is immutable after creation. Both carry metadata.colony, which is required.

# agent.yaml
apiVersion: hived/v1alpha1
kind: Agent
metadata:
name: greeter
colony: acme
spec:
description: says hello
---
apiVersion: hived/v1alpha1
kind: AgentVersion
metadata:
name: greeter-v1
colony: acme
spec:
agent: greeter
version: v1
instructions: "Say hello politely, then stop."
model:
provider: openai
name: gpt-4o-mini
limits:
maxSteps: 8
maxTokens: 20000
timeout: 300s
hived apply -f agent.yaml

apply -f accepts a file, a directory (which applies *.yaml, *.yml and *.json in filename order), or - for stdin. Multi-document YAML works, and so do --- separators with trailing comments and the ... end-of-document marker.

Applying a different AgentVersion spec to the same name is rejected as immutable. Re-applying an identical one is a no-op success and does not even advance resourceVersion.

List and inspect​

hived get colonies
hived --colony acme get agents
hived --colony acme get agentversions
hived --colony acme get agent greeter
hived --colony acme get agents -o json
hived --colony acme get agentversions -o yaml

get <kind> with no name lists; with a name it fetches one object. Lists in table format print a per-kind column set; a single object always prints as YAML unless you ask for -o json.

Aliases work as you would expect: co, colonies, ag, agents, av, agentversions, runs, tools. The full list is in the CLI reference.

Note that when --colony is empty, List is not colony-scoped: it returns every Colony's resources. This is a known v0.1.0 limitation.

Watch​

watch streams ADDED, MODIFIED, DELETED and BOOKMARK events for a kind, printing type, resource version and name as tab-separated lines. Press Ctrl-C to stop.

hived --colony acme watch agents

To pick up exactly where a List left off, pass the list's listMeta.resourceVersion:

hived --colony acme watch runs --since-resource-version 42

hived watch ignores --output and does not reconnect if the Keeper restarts.

Create a Run​

hived --colony acme run greeter --name run-1 --input '{"question":"hi"}'
hived --colony acme get runs

The CLI prints a warning to stderr, and the Run's phase is RUN_PHASE_PENDING:

COLONY NAME AGENT PHASE
acme run-1 greeter RUN_PHASE_PENDING

It stays there. RunService.Apply always persists a Run as PENDING with attempt 0, and the Scheduler that owns every later transition does not exist yet.

--name and --colony are both required. --input must be a JSON object.

Events​

hived --colony acme events run-1

The event log is append-only and per Run. In v0.1.0 nothing emits into it: the two emitters, the Scheduler and the Drone, are not built. The API accepts EventService.Append from a client, but the CLI has no command to write one, so this list is empty unless you appended events yourself. The vocabulary the emitters will use is fixed in ADR-0005.

What deliberately fails​

hived logs run-1
hived approve run-1

Both exit non-zero with a "not implemented until M1" message. logs needs an Executor to read a Cell's output; approve needs the Policy engine, an Approval resource and the Tool Broker. None of those exist. The Keeper's RunService.Logs RPC likewise returns CodeUnimplemented.

Pointing the CLI elsewhere​

hived --server https://keeper.example.internal --token "$HIVED_TOKEN" get colonies

--token is sent as a bearer token on every request, including streams. A v0.1.0 Keeper's stub verifier accepts anything, including no token at all.

Next​