Skip to content

Commit 48436c4

Browse files
JAORMXclaude
andcommitted
docs: update README with experimental banner, badges, and accurate prerequisites
The Quick Start and prerequisites were outdated — they still referenced propolis as a sibling directory requirement, but `task build` now auto-downloads the runtime from GitHub Releases. Also fixes Go version (1.25.7 → 1.26), adds CI/license/Go badges, a TOC, contributing section, experimental warning banner, and a health check verification step. Updates docs/DEVELOPMENT.md to match. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 8a5b9ff commit 48436c4

3 files changed

Lines changed: 60 additions & 27 deletions

File tree

CLAUDE.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ Run a single test: `go test -v -race -run TestName ./pkg/path/to/package`
2727

2828
## Things That Will Bite You
2929

30-
- **propolis is a tagged dependency (v0.0.15)**: `task build` embeds propolis-runner, libkrun, and libkrunfw into the binary (downloaded via `task fetch-runtime`/`task fetch-firmware`, verified with sha256sums). Use `build-dev-system` for the system libkrun-devel path.
30+
- **propolis is a tagged dependency (v0.0.16)**: `task build` embeds propolis-runner, libkrun, and libkrunfw into the binary (downloaded via `task fetch-runtime`/`task fetch-firmware`, verified with sha256sums). Use `build-dev-system` for the system libkrun-devel path.
3131
- **Image cache and log level**: `WAGGLE_IMAGE_CACHE_DIR` (default `~/.cache/waggle/images/`) enables shared OCI image cache with layer-level caching and COW rootfs cloning. `WAGGLE_IMAGE_CACHE_MAX_AGE` (default `168h`/7d) controls eviction. `WAGGLE_LOG_LEVEL` (0-5, default 0) sets libkrun verbosity; levels > 3 leak hypervisor internals.
3232
- **Layered images**: Runtime images (python/node/shell) inherit from `images/base/` via `ARG BASE_IMAGE`. Build base first: `task build-image-base`. All runtime image tasks depend on it automatically.
3333
- **MCP error handling has two paths**: Return `mcp.NewToolResultError("msg"), nil` for user-facing errors (bad input, not found). Return `nil, err` only for internal server failures. Mixing these up breaks the MCP protocol.

README.md

Lines changed: 49 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,30 @@
11
# Waggle
22

3+
[![Build](https://github.com/stacklok/waggle/actions/workflows/build.yml/badge.svg)](https://github.com/stacklok/waggle/actions/workflows/build.yml)
4+
[![Tests](https://github.com/stacklok/waggle/actions/workflows/test.yml/badge.svg)](https://github.com/stacklok/waggle/actions/workflows/test.yml)
5+
[![License: Apache 2.0](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](LICENSE)
6+
[![Go](https://img.shields.io/github/go-mod/go-version/stacklok/waggle)](go.mod)
7+
8+
> [!WARNING]
9+
> **Experimental** — Waggle is under active development. APIs, configuration, and behavior may change without notice. Use at your own risk and expect breaking changes between releases.
10+
311
An MCP server that gives AI agents their own isolated coding environments. Each environment is a real microVM — spin one up, write code, execute it, install packages, read results, tear it down. All through 8 simple MCP tools.
412

513
> The waggle dance is one of the most fascinating things in nature — bees encode distance, direction, and quality of resources in a figure-eight dance pattern. Waggle encodes execution environments, runs code, and communicates structured results back to the AI.
614
15+
## Table of Contents
16+
17+
- [What It Looks Like](#what-it-looks-like)
18+
- [MCP Tools](#mcp-tools)
19+
- [Why MicroVMs](#why-microvms)
20+
- [Quick Start](#quick-start)
21+
- [Configuration](#configuration)
22+
- [Security](#security)
23+
- [Runtime Images](#runtime-images)
24+
- [Development](#development)
25+
- [Contributing](#contributing)
26+
- [License](#license)
27+
728
## What It Looks Like
829

930
When an AI agent connects to Waggle, it gets tools to create and use isolated environments. Here's a typical interaction:
@@ -101,31 +122,29 @@ The trade-off is startup time (seconds vs milliseconds), but you get a real Linu
101122

102123
## Quick Start
103124

125+
### Prerequisites
126+
127+
- [Go](https://go.dev/dl/) 1.26+
128+
- [Task](https://taskfile.dev/) (`go install github.com/go-task/task/v3/cmd/task@latest`)
129+
- [GitHub CLI](https://cli.github.com/) (`gh`) — used to download the propolis runtime
130+
- KVM access on Linux (`/dev/kvm`) or Hypervisor.framework on macOS
131+
132+
### Build and Run
133+
104134
```bash
105-
# Clone alongside propolis (required as sibling directory)
106-
cd ~/Development/stacklok
107135
git clone https://github.com/stacklok/waggle.git
108-
109-
# Build
110136
cd waggle
111-
task build
112-
113-
# Optional: override runtime images
114-
# export WAGGLE_IMAGE_PYTHON=ghcr.io/stacklok/waggle/python:latest
115-
# export WAGGLE_IMAGE_NODE=ghcr.io/stacklok/waggle/node:latest
116-
# export WAGGLE_IMAGE_SHELL=ghcr.io/stacklok/waggle/shell:latest
117-
task run
137+
task build # Downloads propolis runtime + firmware, builds a self-contained binary
138+
task run # Starts the MCP server
118139
```
119140

120141
The server starts on `127.0.0.1:8080` with the MCP endpoint at `/mcp` (Streamable HTTP transport).
121142

122-
### Prerequisites
143+
Verify it's running:
123144

124-
- Go 1.25.7+, [Task](https://taskfile.dev/)
125-
- [propolis](https://github.com/stacklok/propolis) checked out at `../propolis`
126-
- `propolis-runner` binary in PATH (see propolis docs)
127-
- libkrun (Linux: `libkrun-devel`, macOS: Homebrew)
128-
- KVM access on Linux (`/dev/kvm`) or Hypervisor.framework on macOS
145+
```bash
146+
curl -s http://127.0.0.1:8080/healthz
147+
```
129148

130149
## Configuration
131150

@@ -208,6 +227,18 @@ task verify # Full CI gate (fmt + lint + test)
208227

209228
See [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) for the DDD layer breakdown and [docs/DEVELOPMENT.md](docs/DEVELOPMENT.md) for the full dev guide.
210229

230+
## Contributing
231+
232+
Contributions are welcome! Whether it's bug reports, feature requests, or pull requests — all contributions help.
233+
234+
To get started with development:
235+
236+
```bash
237+
task verify # Full CI gate: format, lint, test
238+
```
239+
240+
See [docs/DEVELOPMENT.md](docs/DEVELOPMENT.md) for the full development guide, including how to add new MCP tools and runtimes.
241+
211242
## License
212243

213-
Apache-2.0 — see [LICENSE](LICENSE).
244+
This project is licensed under the Apache 2.0 License — see the [LICENSE](LICENSE) file for details.

docs/DEVELOPMENT.md

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,19 @@
44

55
| Requirement | Purpose |
66
|-------------|---------|
7-
| Go 1.25.7+ | Language runtime |
7+
| [Go](https://go.dev/dl/) 1.26+ | Language runtime |
88
| [Task](https://taskfile.dev/) | Build system (`go install github.com/go-task/task/v3/cmd/task@latest`) |
9+
| [GitHub CLI](https://cli.github.com/) (`gh`) | Downloads propolis runtime from GitHub Releases |
910
| [golangci-lint](https://golangci-lint.run/) | Linting |
1011
| [goimports](https://pkg.go.dev/golang.org/x/tools/cmd/goimports) | Import formatting |
11-
| [propolis](https://github.com/stacklok/propolis) | VM substrate (checked out as sibling directory) |
12-
| libkrun-devel | VM hypervisor (Linux: `dnf install libkrun-devel`, macOS: `brew install libkrun`) |
1312
| KVM access | Linux: ensure `/dev/kvm` is accessible to your user |
1413

14+
For the `build-dev-system` target (builds propolis-runner from source instead of downloading):
15+
16+
| Requirement | Purpose |
17+
|-------------|---------|
18+
| libkrun-devel | VM hypervisor (Linux: `dnf install libkrun-devel`, macOS: `brew install libkrun`) |
19+
1520
## Repository Layout
1621

1722
```
@@ -36,16 +41,13 @@ waggle/
3641
├── docs/ # Architecture and development docs
3742
├── Taskfile.yaml # Build system
3843
├── CLAUDE.md # AI assistant instructions
39-
└── go.mod # Go module (with propolis replace)
44+
└── go.mod # Go module
4045
```
4146

4247
## Getting Started
4348

4449
```bash
45-
# Ensure propolis is checked out alongside waggle
46-
ls ../propolis/go.mod # Should exist
47-
48-
# Build
50+
# Build (automatically downloads propolis runtime + firmware from GitHub Releases)
4951
task build
5052

5153
# Run tests

0 commit comments

Comments
 (0)