goji is a Go implementation of Symphony-style orchestration: it polls an issue tracker, claims eligible work, prepares per-issue workspaces, and launches coding-agent CLI sessions to execute ticket work autonomously.
This implementation follows OpenAI Symphony SPEC v1 semantics where possible, with these deliberate substitutions:
tracker.kind: githubusing theghCLI.- Amp CLI as the default coding agent runner.
- A pluggable runner contract so users can swap in Codex, Claude Code, Gemini CLI, or other CLIs.
- Bubble Tea TUI observability built into
goji run.
- Stateful orchestrator loop with dispatch/retry/reconciliation semantics.
- Deterministic per-issue workspaces with safety checks and lifecycle hooks.
- Workflow policy in-repo via
WORKFLOW.mdwith dynamic reload. - Structured logs plus real-time terminal observability.
- Harness-engineering-first operating model.
internal/workflow: loads and hot-reloadsWORKFLOW.md.internal/config: typed config with defaults, env indirection, and validation.internal/tracker/github: GitHub issue adapter powered bygh.internal/workspace: workspace creation, hook execution, root-containment safety.internal/agent: pluggable CLI runner (Amp default) with JSONL event parsing.internal/orchestrator: poll loop, claims, retries, reconciliation, snapshots.internal/tui: Bubble Tea dashboard for runtime observability.
- Go
1.25+. ghCLI authenticated against the target repository.- A coding-agent CLI (Amp by default).
- A repository configured with harness engineering practices.
- Copy WORKFLOW.md into your target repository and customize it.
- Set
GOJI_GITHUB_REPO=owner/repo(ortracker.repodirectly in workflow). - Run
go run ./cmd/goji run /path/to/WORKFLOW.md.
Default command:
go run ./cmd/goji run ./WORKFLOW.mdHeadless mode:
go run ./cmd/goji run --no-tui ./WORKFLOW.mdOverride tracker repo and agent command at runtime:
go run ./cmd/goji run --repo owner/repo --agent-command "codex app-server" ./WORKFLOW.mdgoji derives issue orchestration state from labels by default.
- Label prefix
state:controls normalized state, e.g.state:in progress. - If no state label exists,
OPEN -> Todo,CLOSED -> Done. - Priority label prefix
priority:maps to integer priority, e.g.priority:1. - Blocker labels with prefix
blocked-by:populate normalized blocker refs.
goji supports two compatible config surfaces:
codex.command(spec-compatible shell command field).runner.*extension (preferred for non-Codex CLIs).
Example runner config:
runner:
command: amp --execute --stream-json --mode deep
prompt_mode: stdin
output_format: amp_stream_json
env:
AMP_API_KEY: $AMP_API_KEYIf runner.command is omitted, goji falls back to codex.command, then to amp --execute --stream-json.
The Bubble Tea dashboard shows:
- Poll status and next refresh timing.
- Running sessions with last event/message, token counters, turn counts.
- Retry queue with due times and backoff reasons.
- Aggregate token/runtime totals and recent runtime events.
Structured logs are written to stderr and ./log/goji.log by default.
Read docs/harness-engineering.md. The short version:
- Make workspaces reproducible and self-bootstrapping via hooks.
- Ensure deterministic validation commands exist and are CI-compatible.
- Keep issue and PR automation pathways explicit inside your prompt policy.
- Minimize ambient credentials and constrain command surfaces.
make ciCI runs formatting, vet, tests, and build.
This is an initial public cut focused on orchestration correctness and extensibility. Additional protocol adapters and richer tracker semantics can be layered without changing the core scheduler contract.