No description
Find a file
Viktor Barzin 6180ae6acb [beadboard] Add Dockerfile and GHA build-and-deploy workflow
## Context

BeadBoard does not yet have a container image or a CI pipeline that
produces one. The infra pattern (see `infra/.claude/CLAUDE.md` →
"CI/CD Architecture") is GHA builds + Woodpecker deploys: GHA builds
the image on every push to the default branch, tags it with the
8-character git SHA, and POSTs the tag to Woodpecker to trigger a
`kubectl set image` roll-out.

We follow that exact pattern here, mirroring `broker-sync`'s
`.github/workflows/ci.yml` (the closest functioning example) but
targeting the private `registry.viktorbarzin.me:5050` registry that the
cluster's containerd `hosts.toml` rewrites to the LAN IP for
pull-through.

## This change

### `Dockerfile`

- Three-stage build using `node:20-alpine`:
    1. `deps` — `npm ci` (with devDeps) so the builder has TypeScript
       and ESLint available during `next build`.
    2. `builder` — runs `npm run build`; `NEXT_TELEMETRY_DISABLED=1` to
       suppress the telemetry prompt in CI logs.
    3. `runner` — copies only `.next`, `public`, `node_modules`,
       `package.json`, and `next.config.ts`; runs as a non-root user
       (`nextjs:1001`).
- `CMD ["npm", "start"]` invokes Next.js' production server on port 3000.
- `next.config.ts` does not opt into the `output: 'standalone'` build,
  so we ship the full `node_modules`. We can trim to standalone in a
  follow-up once we confirm all route handlers and SSE endpoints work
  with the standalone tracer.

### `.dockerignore`

- Excludes `.git`, `node_modules`, `.next`, `.beads`, docs, reference
  materials, Remotion assets, and local env files so the build context
  stays small. `.beads` is sensitive (contains the local Dolt snapshot).

### `.github/workflows/build-and-deploy.yml`

- Triggers on `push` to `main` / `master` (upstream uses `main`;
  `master` added so the fork's current branch also publishes).
- `build` job: buildx, login to the private registry via
  `REGISTRY_USERNAME` / `REGISTRY_PASSWORD` secrets, then
  `docker/build-push-action@v6` for `linux/amd64`, tagging both
  `:<8-char-sha>` and `:latest`. GHA layer cache (`type=gha`) is wired.
- `deploy` job: POSTs to Woodpecker's `/api/repos/<id>/pipelines`.
  `WOODPECKER_REPO_ID` is deliberately set to the literal string `TBD`
  with a guard — the repo needs to be registered with Woodpecker before
  the deploy step can fire. Until then the workflow reports success
  with the image tag so the upstream image is still published. The
  pattern, retry loop, and numeric-repo-id convention are lifted from
  `broker-sync/.github/workflows/ci.yml`, which is the canonical
  example in the infra migration doc.

## What is NOT in this change

- No `.woodpecker/deploy.yml` yet — that lives in the infra repo per
  convention (infra serves the deploy step via `kubectl set image`
  against the cluster SA). The orchestrator will register the repo
  and land the deploy side.
- No standalone Next.js build. `output: 'standalone'` changes the
  working directory layout enough to warrant a dedicated follow-up.
- No smoke test on the image. The existing `npm run test` gate
  guarantees code-level correctness; container smoke-tests can be
  added if the image breaks in production.

## Test Plan

### Automated

The GHA workflow itself cannot be exercised locally. YAML parses as
valid GitHub Actions syntax (same shape as `broker-sync/.github/
workflows/ci.yml` which currently runs green). The Dockerfile has
not been built in this commit to avoid dragging a ~700 MB node image
into a local session; the orchestrator should build it in CI first
or with:

```
docker buildx build --platform linux/amd64 -t beadboard:local .
```

Test suite still green:

```
$ node --import tsx --test tests/components/shared/left-panel-filtering.test.ts \
    tests/components/shared/dispatch-button.test.tsx \
    tests/lib/dispatch-prompt.test.ts \
    tests/api/agent-dispatch-route.test.ts \
    tests/api/agent-status-route.test.ts \
    tests/lib/parser.test.ts \
    tests/components/shared/left-panel.test.tsx \
    tests/components/shared/unified-shell-hide-closed-contract.test.ts
# tests 40 pass 40 fail 0
```

### Manual Verification

1. Set repo secrets on GitHub: `REGISTRY_USERNAME`, `REGISTRY_PASSWORD`,
   `WOODPECKER_TOKEN`.
2. Push to `master` (or `main`).
3. Expected: `build` job succeeds; image appears at
   `registry.viktorbarzin.me:5050/beadboard:<sha>`.
4. `deploy` job: with `WOODPECKER_REPO_ID` still `TBD`, logs the image
   tag and exits 0. Once the repo is registered, replace `TBD` with the
   numeric id and the deploy will trigger the cluster roll-out.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-18 14:08:51 +00:00
.beads chore: recreate orchestrator backlog with proper bead naming and descriptions 2026-03-25 23:15:36 -05:00
.github [beadboard] Add Dockerfile and GHA build-and-deploy workflow 2026-04-18 14:08:51 +00:00
assets fix(layout): unified right sidebar with chat mode and collapsing activity rail 2026-02-16 23:50:20 -08:00
bin feat(cli): route runtime commands and add bd diagnostics to status 2026-03-02 21:19:12 -08:00
components/ui checkpoint: pre-split branch cleanup 2026-03-03 16:43:42 -08:00
docs fix: orchestrator button + Pi SDK session error 2026-03-24 19:02:04 -05:00
help checkpoint: pre-split branch cleanup 2026-03-03 16:43:42 -08:00
install Cleanup: Runtime artifacts, hard-coded paths, PR 14 bug fixes 2026-03-05 15:57:33 -08:00
lib chore: misc updates and fixes 2026-02-26 10:25:31 -08:00
public fix(bb-ui2): integrate ThreadView into detail panels with sample data 2026-02-16 10:10:50 -08:00
reference/routes checkpoint: pre-split branch cleanup 2026-03-03 16:43:42 -08:00
scripts checkpoint: pre-split branch cleanup 2026-03-03 16:43:42 -08:00
skills Cleanup: Runtime artifacts, hard-coded paths, PR 14 bug fixes 2026-03-05 15:57:33 -08:00
src [beadboard] Add agent-dispatch and agent-status API routes 2026-04-18 14:07:21 +00:00
tests [beadboard] Add agent-dispatch and agent-status API routes 2026-04-18 14:07:21 +00:00
tools checkpoint: pre-split branch cleanup 2026-03-03 16:43:42 -08:00
.dockerignore [beadboard] Add Dockerfile and GHA build-and-deploy workflow 2026-04-18 14:08:51 +00:00
.eslintrc.json checkpoint: pre-split branch cleanup 2026-03-03 16:43:42 -08:00
.gitattributes chore: initialize beadboard baseline 2026-02-11 17:42:51 -08:00
.gitignore beads back 2026-03-24 19:02:04 -05:00
AGENTS.md bd init: initialize beads issue tracking 2026-03-24 19:02:04 -05:00
CLAUDE.md feat(ux): consolidate Launch Swarm + telemetry UX with minimized strip 2026-03-01 18:17:58 -08:00
components.json feat(ui): complete bb-ui2.2 - shadcn/ui Setup 2026-02-15 21:16:26 -08:00
CONTRIBUTING.md Update CONTRIBUTING.md 2026-03-29 13:37:46 -07:00
Dockerfile [beadboard] Add Dockerfile and GHA build-and-deploy workflow 2026-04-18 14:08:51 +00:00
eslint.config.mjs checkpoint: pre-split branch cleanup 2026-03-03 16:43:42 -08:00
LICENSE checkpoint: pre-split branch cleanup 2026-03-03 16:43:42 -08:00
next-env.d.ts checkpoint: pre-split branch cleanup 2026-03-03 16:43:42 -08:00
next.config.ts checkpoint: pre-split branch cleanup 2026-03-03 16:43:42 -08:00
NEXT_SESSION_PROMPT.md Cleanup: Runtime artifacts, hard-coded paths, PR 14 bug fixes 2026-03-05 15:57:33 -08:00
package-lock.json fix: orchestrator button + Pi SDK session error 2026-03-24 19:02:04 -05:00
package.json [beadboard] Add agent-dispatch and agent-status API routes 2026-04-18 14:07:21 +00:00
postcss.config.js feat: establish tokenized kanban design foundation 2026-02-11 18:38:51 -08:00
project.md refactor: extract agent bounded context + fix SSE comments + cleanup unused 2026-03-04 22:06:40 -08:00
README.md Revise installation section in README.md 2026-03-27 18:35:24 -07:00
remotion.config.ts fix(bb-ui2): integrate ThreadView into detail panels with sample data 2026-02-16 10:10:50 -08:00
tailwind.config.ts checkpoint: pre-split branch cleanup 2026-03-03 16:43:42 -08:00
tsconfig.json feat(ux): consolidate Launch Swarm + telemetry UX with minimized strip 2026-03-01 18:17:58 -08:00

🚧 The bb-pi orchestrator is under construction — help us build it! Use your own coding agent alongside BeadBoard for now. 🚧

BeadBoard

License: MIT GitHub stars Built on Beads

Multi-agent orchestration and communication system built on Beads.

Agents claim tasks, send structured mail to each other, track dependencies, and close work with evidence. BeadBoard is the coordination layer — a dashboard that shows it all happening live, a CLI (bb) that hosts the orchestrator and manages agent communication, and a built-in execution runtime (bb-pi) that can spawn and manage agent workers directly.

Built on Beads and inspired by Gastown.

BeadBoard Dashboard


📦 Installation

Prerequisites

  • Node.js 18.18+ (Node 20 LTS recommended)
  • npm 7.0+
  • Dolt (recommended — see Dolt section)

Install from Source

git clone https://github.com/zenchantlive/beadboard.git
cd beadboard
npm install
npm install -g .

This installs:

  • beadboard / bb — BeadBoard CLI: dashboard, orchestrator host, agent communication commands
  • bd — Beads CLI for task management (also available standalone: npm install -g @beads/bd)
beadboard --version
bd --version

Alternative: POSIX install script (Linux/macOS):

bash ./install/install.sh    # installs bb + beadboard shims to ~/.beadboard/bin

Or just tell your agent:

Install Beadboard, and the beadboard-driver skill from https://github.com/zenchantlive/beadboard and use it to coordinate your work. Run npx skills add zenchantlive/beadboard --skill beadboard-driver then follow the SKILL.md runbook.

Then add to your project's AGENTS.md or CLAUDE.md:

## BeadBoard

You have access to the **beadboard-driver** skill.

- Always use beadboard-driver as your entrypoint for coordination work (tasks, context, status)
  instead of inventing your own workflow.
- Use it to read and update Beads via `bd`, keep work state consistent with the BeadBoard UI,
  and obey the verification rules described in the Beadboard-Driver Skill.
- When in doubt about what to do next or how to record progress, call beadboard-driver and
  follow its guidance rather than editing markdown ad hoc.

See skills/beadboard-driver/SKILL.md for the complete agent runbook.


🚀 Add BeadBoard Skill to Your Agent

npx skills add zenchantlive/beadboard --skill beadboard-driver

This installs the beadboard-driver skill — a 9-step operating contract that gives your agent:

  • 📋 Task coordination through dependency-constrained graphs
  • 💬 Structured agent-to-agent messaging (HANDOFF, BLOCKED, DECISION, INFO)
  • 🔒 Scope-based work reservations with liveness-aware conflict resolution
  • 📡 Realtime progress tracking via heartbeats and activity streams
  • Evidence-required workflow — agents can't close work without verification gates

Quick Start

cd ~/my-project
bd init                        # initialize Beads in your project
beadboard start --dolt         # start the dashboard with Dolt (recommended)

Open http://localhost:3000.

bd create --title "My first task" --type task --priority 0

🗄️ Dolt

BeadBoard uses Dolt — a version-controlled SQL database — as its primary backend. Dolt gives you:

  • Full version history of every issue state change
  • SQL queries across all your issues and projects
  • bd dolt pull / bd dolt push for multi-agent sync across machines
  • Branch-based workflows
# macOS
brew install dolt

# Linux / Windows
curl -L https://github.com/dolthub/dolt/releases/latest/download/install.sh | bash

Without Dolt, BeadBoard falls back to reading .beads/issues.jsonl directly. This is enough to poke around, but you'll want Dolt for real work.


🔧 What BeadBoard Does

BeadBoard is three things:

The Dashboard

A live operations console with Social, Graph, and Activity views — updating in realtime via SSE as agents work.

The CLI (bb)

A full agent command center — not just a dashboard launcher:

# Agent lifecycle
bb agent register --name <id> --role <role>
bb agent list
bb agent activity-lease --agent <id>

# Agent-to-agent communication
bb agent send --from <id> --to <id> --bead <id> --category HANDOFF --subject "..."
bb agent inbox --agent <id>
bb agent ack --agent <id> --message <msg-id>

# Work reservations
bb agent reserve --agent <id> --scope <scope> --bead <id>
bb agent release --agent <id> --scope <scope>

# Orchestrator runtime
bb daemon start
bb daemon tui                    # interactive orchestrator REPL
bb daemon bootstrap              # install Pi runtime

The Orchestrator (bb-pi)

A built-in execution runtime that spawns and manages typed worker agents.


🧩 Core Features

💬 Agent Communication System

Structured message lifecycle for inter-agent coordination:

  • Message categories: HANDOFF, BLOCKED, DECISION, INFO
  • Required acknowledgment for high-signal categories (HANDOFF, BLOCKED)
  • Broadcast & role-based routing — send to all agents or by role (role:tester)
  • Per-task threads combining activity events, agent mail, and local interactions
  • Message states: unreadreadacked
bd mail inbox
bd mail send --to <agent> --bead <id> --category HANDOFF --subject "Ready for review"
bd mail ack <message-id>

🔒 Work Reservations

Agents can lock scopes (file paths, task regions) to prevent conflicting work:

  • TTL-based reservations (default 120 min)
  • Liveness-aware conflict resolution — stale agents (15min no heartbeat) can be taken over
  • File-based mutex prevents race conditions

📊 DAG Graph Visualization

DAG-oriented workspace for execution decisions:

  • Task and dependency tab modes for different planning lenses
  • Blocked chains highlighted, assignees on nodes
  • Cycle detection and blocked-chain identification

Dependency Graph View

👥 Swarm Coordination

Agent pool monitor with:

  • Archetypes — typed agent roles (architect, engineer, reviewer, tester, investigator, shipper)
  • Templates — preset team compositions (feature-dev, bug-fix, full-squad, greenfield, research-and-discovery)
  • "Needs Agent" queue for unassigned work
  • Pre-assigned queue and squad roster

Swarm Coordination Panel

📡 Realtime Operations

  • Live updates via Chokidar file watchers + Server-Sent Events
  • Activity stream with session/task context
  • Agent heartbeat and liveness tracking (active → stale → evicted)

🌐 Multi-Project Scope

  • Project registry with scanner-backed discovery
  • Single-project and aggregate modes
  • Runtime scope switching without leaving the workspace

🤖 bb-pi Orchestrator

🚧 Under active construction. The orchestrator works but has known issues being fixed. Use your own coding agent alongside BeadBoard for now, or help us improve it!

bb-pi is BeadBoard's embedded execution runtime, built on Pi (@mariozechner/pi-coding-agent). It runs a long-lived orchestrator per project that spawns typed worker agents, tracks their bead claims, and streams a live transcript.

Working today (Phases 1-3):

  • Embedded orchestrator with BeadBoard-aware tools (bb_spawn_worker, bb_worker_status, bb_create, bb_close, etc.)
  • Worker spawning with numbered display names (Engineer 01, Engineer 02...)
  • Capability-gated agent types — architects/reviewers get read-only tools, engineers/testers get full code edit/write/bash
  • Template-based team spawning via bb_spawn_team — spin up a full squad from a preset
  • Bead-required workflow — every worker claims a bead, posts progress, closes with evidence
  • Async coordination — non-blocking spawn with status polling and result reads
  • Chat-style orchestrator transcript with realtime telemetry
  • Interactive orchestrator REPL via bb daemon tui

Known issues being fixed:

  • Double-reply rendering in orchestrator chat
  • Silent failures — errors not yet surfaced to UI
  • Session race condition under rapid use

Phases 4-7 (launch-anywhere UX, agent presence in views, hardening, full test coverage) are on the roadmap. See docs/plans/2026-03-05-embedded-pi-roadmap.md.


🏗️ Architecture

┌─────────────────────────────────────────────────────────────┐
│                      BeadBoard UI                           │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌──────────┐    │
│  │  Social  │  │  Graph   │  │ Activity │  │  Swarm   │    │
│  │  View    │  │  View    │  │  View    │  │  Panel   │    │
│  └──────────┘  └──────────┘  └──────────┘  └──────────┘    │
└─────────────────────────────────────────────────────────────┘
         │              │              │              │
    ┌────▼──────────────▼──────────────▼──────────────▼────┐
    │                  bb CLI / bb-pi runtime               │
    │  agent register · agent send · daemon tui · spawn     │
    └──────────────────────────┬───────────────────────────┘
                               │
              ┌────────────────┼────────────────┐
              │                │                │
        ┌─────▼─────┐  ┌──────▼──────┐  ┌──────▼──────┐
        │    SSE     │  │    Dolt     │  │  Chokidar   │
        │   Events   │  │  (SQL DB)   │  │  Watchers   │
        └───────────┘  └─────────────┘  └─────────────┘
              │                │                │
              └────────────────┼────────────────┘
                               │
                        ┌──────▼──────┐
                        │     bd      │
                        │ (Beads CLI) │
                        └─────────────┘

Tech Stack

Layer Technologies
Frontend Next.js 15 (App Router), React 19, TypeScript (strict)
Styling Tailwind CSS, Radix UI, Framer Motion
Graph @xyflow/react, Dagre
Database Dolt (version-controlled SQL)
Realtime Chokidar watchers, Server-Sent Events
Agent Runtime @mariozechner/pi-coding-agent (bb-pi)

Data Flow

  1. Write path: bd commands write to .beads/issues.jsonl and Dolt DB
  2. Read path: UI queries Dolt SQL (falls back to JSONL when Dolt is unavailable)
  3. Realtime: bd touches .beads/last-touched → Chokidar fires → SSE event → UI update

Key Concepts

Component Purpose
bd Beads CLI — task and dependency management
bb / beadboard BeadBoard CLI — dashboard, orchestrator host, agent commands
bb-pi Embedded Pi execution runtime (under construction)
beadboard-driver Agent skill — operating contract for coordination

🌍 Platform Support

Runs on macOS, Linux, and Windows.

  • macOS / Linux: bash ./install/install.sh installs shims to ~/.beadboard/bin
  • Windows: Path handling canonicalizes drive letter casing and backslash normalization. Mixed WSL2 + Windows setups require mirrored networking.

📁 Project Structure

beadboard/
├── src/
│   ├── app/                    # Next.js App Router pages + API routes
│   ├── components/             # UI: shared, graph, social, swarm, agents, sessions
│   ├── hooks/                  # React hooks (subscriptions, URL state, etc.)
│   ├── lib/                    # Core domain logic (parser, types, mail, registry, etc.)
│   └── tui/                    # Orchestrator TUI + agent tools
├── skills/
│   └── beadboard-driver/       # Agent skill package (runbook + scripts + tests)
├── install/                    # Platform install scripts
├── docs/                       # PRDs, roadmaps, ADRs, screenshots
└── tests/                      # Test suite (explicitly enumerated in package.json)

🛠️ Scripts

npm run dev          # Development server (localhost:3000)
npm run build        # Production build
npm run start        # Production server
npm run typecheck    # TypeScript validation (tsc --noEmit)
npm run lint         # ESLint
npm run test         # Full test suite

New test files must be added to the test script in package.json — the suite is explicitly enumerated, not auto-discovered.


🤝 Contributing

We welcome contributions from humans and AI agents. See CONTRIBUTING.md for the full guide.

Quick version:

  1. Find work: check GitHub Issues or run bd list --label contrib:open
  2. Small PRs preferred (under ~100 lines). For larger changes, open an issue first.
  3. Run the gates: npm run typecheck && npm run lint && npm run test
  4. PR against main

Join the Discussion to coordinate on contributions, get help, or discuss ideas.


📄 License

MIT


🙏 Acknowledgments

Built on Beads by Steve Yegge, inspired by Gastown. The bb-pi execution runtime uses Pi by @mariozechner.