Thanks for your interest in contributing to sekia! This document covers everything you need to get started.
- Go 1.25+ (see
go.modfor the exact version) - Git
- A GitHub account
No Makefile, custom scripts, or external tools required — standard Go toolchain only.
- Fork the repository on GitHub
- Clone your fork:
git clone https://github.com/<your-username>/sekia.git cd sekia
- Build all binaries:
go build ./cmd/sekiad ./cmd/sekiactl ./cmd/sekia-github ./cmd/sekia-slack ./cmd/sekia-linear ./cmd/sekia-google ./cmd/sekia-mcp
- Run the tests:
go test ./...
- Create a branch from
mainfor your changes - Make your changes
- Run
go vet ./...andgo test -race ./...before committing - Push to your fork and open a pull request against
main
CI runs on every push to main and every pull request. It will:
go vet ./...go test -race -count=1 ./...- Build all seven binaries
Your PR must pass all CI checks before it can be merged.
sekia is a multi-agent event bus. Seven binaries communicate over embedded NATS:
| Binary | Purpose | Source |
|---|---|---|
sekiad |
Daemon — NATS, registry, workflow engine, API | cmd/sekiad, internal/server |
sekiactl |
CLI — status, agents, workflows | cmd/sekiactl |
sekia-github |
GitHub agent — webhooks, polling, API commands | cmd/sekia-github, internal/github |
sekia-slack |
Slack agent — Socket Mode, API commands | cmd/sekia-slack, internal/slack |
sekia-linear |
Linear agent — GraphQL polling, API commands | cmd/sekia-linear, internal/linear |
sekia-google |
Google agent — Gmail + Calendar, OAuth2 | cmd/sekia-google, internal/google |
sekia-mcp |
MCP server — stdio transport for AI assistants | cmd/sekia-mcp, internal/mcp |
cmd/ # Binary entry points (one per binary)
internal/ # Private implementation packages
server/ # Daemon orchestration
natsserver/ # Embedded NATS + JetStream
registry/ # Agent tracking
workflow/ # Lua workflow engine
api/ # HTTP-over-Unix-socket API
web/ # Embedded web dashboard
ai/ # LLM client (Anthropic Messages API)
github/ # GitHub agent
slack/ # Slack agent
linear/ # Linear agent
google/ # Google agent (Gmail + Calendar)
mcp/ # MCP server
pkg/ # Public packages
protocol/ # Shared wire types (Event, Registration, Heartbeat)
agent/ # Agent SDK (auto-register, auto-heartbeat)
configs/ # Example config files and sample workflows
docs/ # Website and documentation (plain HTML + CSS)
- Standard
gofmtformatting - No external HTTP framework — use Go 1.22+
http.ServeMuxmethod routing (e.g.,"GET /api/v1/status") - Config via Viper: TOML files searched in
/etc/sekia,~/.config/sekia,.; env vars withSEKIA_prefix - Minimal dependencies — prefer
net/httpover SDKs when practical (seeinternal/ai/,internal/linear/)
Every agent defines a client interface for its external service (e.g., GitHubClient, SlackClient, LinearClient, GmailClient, CalendarClient, DaemonAPI). This allows tests to inject mocks without hitting real APIs. Follow this pattern when adding new agents or external integrations.
- Each agent has end-to-end integration tests that start the full daemon with embedded NATS, connect the agent in-process, and verify the complete event-to-command flow through Lua workflows.
- Use
NewTestAgent()helpers andhttptest.Serverfor mocking external APIs. - NATS runs in-process with
DontListen: true(no TCP port). Test agents connect usingnats.InProcessServer(). Daemon.Stop()uses a channel for testability — tests callNATSClientURL()andNATSConnectOpts()to connect agents.- On macOS, Unix socket paths must be under 104 characters — test helpers use
/tmpshort paths.
Run a single test by name:
go test -run TestEndToEnd ./internal/serverRun all tests with race detection:
go test -race ./...| Subject | Purpose |
|---|---|
sekia.registry |
Agent registration announcements |
sekia.heartbeat.<name> |
Per-agent heartbeats (30s interval) |
sekia.events.<source> |
Event publishing |
sekia.commands.<name> |
Command delivery to agents |
Workflows are .lua files in ~/.config/sekia/workflows/. The Lua VM is sandboxed — only base (minus dofile/loadfile/load), table, string, and math libraries are available. No os, io, or debug. Example workflows live in configs/workflows/.
- Create
internal/<name>/with a client interface and agent implementation - Create
cmd/sekia-<name>/main.goas the binary entry point - Add the binary to the build commands in:
CLAUDE.md(build section)README.md(install section).goreleaser.yml(builds + archives)Dockerfile(builder + runtime stage).github/workflows/ci.yml(build step)
- Add a config example in
configs/sekia-<name>.toml - Add a sample workflow in
configs/workflows/ - Write integration tests following the existing agent pattern (
NewTestAgent()+ mock server) - Update documentation:
CLAUDE.md(architecture, events, commands)README.md(agent section)docs/docs/index.html(documentation site)
When making significant changes, update all relevant docs:
CLAUDE.md— Architecture, patterns, config, events, commands. This is the source of truth for AI-assisted development.README.md— User-facing overview, install, usage, examples.docs/index.html+docs/style.css— Landing page at sekia.ai.docs/docs/index.html+docs/docs/style.css— Full documentation at sekia.ai/docs/.
The website and docs are plain HTML + CSS with no build step, hosted on GitHub Pages.
Use conventional-style prefixes for clarity:
feat:— new featurefix:— bug fixdocs:— documentation onlytest:— adding or updating testsci:— CI/CD changeschore:— maintenance (deps, release, etc.)
Releases are automated via goreleaser and GitHub Actions. The release workflow builds binaries for linux/darwin on amd64/arm64, publishes to the Homebrew tap (sekia-ai/homebrew-tap), and generates checksums. Docker images are built from the multi-stage Dockerfile.
By contributing, you agree that your contributions will be licensed under the Apache License 2.0.