Early stage + token warning. This is early-stage software - expect rough edges and rapid change. It also burns tokens: the fleet engine spawns real agent sessions per dispatched ticket (a worker run, and a reviewer pass per merged ticket when autonomous acceptance is on), and long waves multiply that fast. The fleet is therefore disabled by default - arm it deliberately (Fleet view -> Enable in Eclipse, or
"disabled": falseon thefleetserver inopencode.jsonfor TUI sessions), keep the concurrency and cost budgets set, and use the ticketmodelfield as the cost lever (small, well-specified tickets deserve cheap models). Dispatch by hand where you can; let the fleet run only what pays for itself.
- Kind:
doc/ repo README (top-level entry point) - Read by: humans evaluating/adopting the template; written by: maintainers
- Related: pairs with
AGENTS.md(workflow conventions) and the skill/agent set under.opencode/
Hephaestus — Greek god of the forge, and the one who built automatons: Talos, the golden mechanical attendants.
What you see: the ten-stage V-model - the blue definition leg (1-5) steps down, the amber build/review vertex (5-6) joins them, the green verification leg (6-10) climbs back up. One ticket walks the whole V while agent crews (the mascots) appear and disappear where the work is; a six-bot fleet waits at the bottom to dispatch the next wave. The dashed connectors march in the direction of travel, and the gray lines are the send-back paths (the pair lines name the failing check, e.g. "system test failed - send back"; the legend keys the gray dashes - rejection at the vertex included). The same flow drives the Eclipse Board's V-pipeline and the fleet's waves.
Hephaestus is an opencode-native template for agentic project management and
software development. It is organized by domain (not by a lifecycle or folder
tree): skills and agents are flat under .opencode/ and named <domain>-<descriptor>.
Project management is a concrete, Scrum-like ticket/sprint workflow over the
task store (.opencode/tasks/, one Markdown file per ticket) served as task_*
MCP tools by the Eclipse harness's eclipse-build endpoint and the stdio
tasks-tools launcher (opencode prefixes them with the server name — tasks_task_*
in TUI sessions, eclipse-build_task_* in Eclipse; the tool/wire names stay task_*);
the fleet is dispatchable from chat itself via the fleet stdio server
(wire names fleet_dispatch/fleet_jobs/…, surfaced as fleet_fleet_* — chat is the
primary interface, Board buttons are conveniences); C++ and graphics are first-class tools (an agent and an
MCP server), not a separate lifecycle.
Three ideas hold it together:
- Domains in names, not folders. opencode discovers every
SKILL.mdunder.opencode/skills/*/. Naming convention<domain>-<descriptor>(software-,test-software-,project-manager-,cpp-,graphics-,code-,research-); coordination agents are unprefixed. - A concrete PM, not a metaphor. The
project-manageragent runs Scrum over tickets in the task store. Tickets carry arole(discipline), and workers self-claim by role (task_claim). Multiple independent projects coexist as subdirectories of the store. The store is version-controlled Markdown — the seam the Maven mojos (opencode-tasks:sync/plan) and the Eclipse Board view build on. - Model-neutral by default. Agents reference a tier; the concrete model
resolves from YOUR
opencode.jsondefault and agent frontmatter — no model ids are committed (contributors use different providers; set your own, resolve via/models).
The PM/ticket system is optional. Any skill or agent can be used directly by a human (or another agent) with no ticket or sprint — just invoke the skill or pick an agent with
/agents. The PM system is there when you want tracked, multi-agent, sprint execution; skip it for ad-hoc work. Skills likeproject-manager-doc-aboutalso work standalone, independent of PM.
Everything here is opencode-native first: the entire agentic stack — board,
fleet, skills, agents — runs from a plain opencode TUI in this repository.
Eclipse is the optional human surface: overview, inspection, takeover. One
repository, two ways to use it:
| Capability | Plain opencode TUI (no Eclipse) | Eclipse harness (on top) |
|---|---|---|
Skills, agents, model tiers (/agents, /models, Plan mode) |
✅ | ✅ — same engine, surfaced in views |
Task board — task_* tools incl. task_doctor lint, V-pipeline, sprints |
✅ tasks stdio server (eclipse/tasks-tools.ps1) |
✅ Board view (kanban + pipeline, type badges, peer-write refresh) and the same tools via eclipse-build |
Fleet — dispatch, jobs, live progress, permissions, store sync, auto-dispatch (fleet_*) |
✅ fleet stdio server (eclipse/fleet-tools.ps1; disabled by default — enable in opencode.json) |
✅ Fleet view (own and peer-engine jobs, diffs, permissions) |
Maven mojos opencode-tasks:sync / :plan over the store |
✅ | ✅ |
| Graphics MCP (screenshot, RenderDoc, render comparison) | ✅ | ✅ |
cpp-tools agent driving CMake/clang tooling |
✅ (bash-driven) | ✅ |
Structured C++ tool pack as MCP tools (cmake_*, ctest_run, debug_batch, …) |
❌ lives in Eclipse's eclipse-build endpoint |
✅ (per-start token auth) |
| Chat UI (markdown/KaTeX/mermaid, Stop, pending queue, late-reply recovery) | — the TUI is your chat | ✅ chat view |
| Server/Providers/Repo/Session views, live busy-session icons, CDT markers | ❌ | ✅ |
| Building this harness itself | eclipse/build.ps1 (JDK 21, Maven/Tycho reactor) |
same |
The split is deliberate architecture, not happenstance: the client, tools,
tasks, git and fleet bundles are platform-free (UI/runtime) — with one
deliberate exception: the Eclipse JobManager runtime (org.eclipse.core.jobs +
equinox.common) is allowed because both run in a plain JVM, and the engine uses the
same work scheduler (WorkerPools) in every host — the IDE
consumes them, never owns them (see eclipse/ARCHITECTURE.md).
The harness works with and without the fleet.
- Without the fleet (default): you trigger every step yourself - via chat or the Eclipse UI (Board, Launch task). No fleet needed anywhere, Eclipse included.
- With the fleet: the same steps run automated - unattended waves
claim, run, merge and accept on their own, inside the cost/concurrency
budgets. That is the token burner from the warning above, so the fleet
is disabled by default: enable it deliberately (Fleet view -> Enable,
or
"disabled": falseon thefleetserver inopencode.json) and keep the budgets set.
| Path | What it is |
|---|---|
opencode.json (repo root) |
project config - your model (set locally; none is committed), AGENTS.md, and the tasks + fleet (stdio launchers; fleet ships disabled) + graphics MCP servers. |
AGENTS.md (repo root) |
opencode-first workflow conventions and routing. |
.opencode/skills/*/SKILL.md |
the skill library, flat by domain. |
.opencode/agent/*.md |
lean custom agents (coordination + domain). |
.opencode/docs/ |
domains.md, contracts.md. |
.opencode/tasks/ |
the task store — one Markdown file per ticket per project (<project>/T-NNN.md + _meta.json sidecar), version-controlled. |
mcp/graphics/ |
the graphics MCP server (captures, comparisons). |
cpp/ |
standalone AI-first C++23 build skeleton (its own AGENTS.md). |
eclipse/ |
the Eclipse plugin — the agentic IDE harness (chat, Server view incl. MCP servers + Skills, Providers view with logos, the PM Board + Fleet views, the token-authed eclipse-build MCP endpoint serving the C++ and task_* tool packs, git-worktree fleet incl. the task-driven TaskFleet, the opencode-tasks Maven plugin (:sync/:plan over the task store), the tasks-tools.ps1/fleet-tools.ps1 stdio launchers; Maven/Tycho reactor). |
| Domain | Skills |
|---|---|
software- (definition) |
software-requirements, software-system, software-architecture, software-design, software-implementation |
test-software- (verification) |
test-software-implementation, -design, -architecture, -system, -requirements |
project-manager- (project management) |
project-manager-operating-model, project-manager-orchestrate-execution, project-manager-route-request, project-manager-audit-traceability, project-manager-estimate-costs, project-manager-gather-intelligence, project-manager-create-ticket, project-manager-doc-about |
cpp- (C++ utility) |
cpp-tools (methodology; the cpp-tools agent runs the commands) |
graphics- (graphics utility) |
graphics-render-comparison (the heavy lifting is the mcp.graphics tools) |
code- (code analysis) |
code-dependency (package/namespace dependency map → Mermaid block diagram), code-licenses (third-party license audit → compatibility table + remediation), code-repo-map (probe-don't-read orientation map: layout, build/test entry points, module one-liners) |
research- (live research utility) |
research-artificial-analysis-models (Artificial Analysis model leaderboard → filtered, cost-sorted Markdown table) |
Verification maps by composition level: test-software-implementation ↔ software-implementation
(unit), test-software-design ↔ software-design (component), test-software-architecture
↔ software-architecture (library), test-software-system ↔ software-system (integration),
test-software-requirements ↔ software-requirements (acceptance).
The dividing line between component and library is reuse scope, not size and not static-vs-shared linkage (that is a build decision):
| Term | Meaning | Reuse scope | Composes into |
|---|---|---|---|
| Unit | Smallest element with a clear interface; implementation fills its content. | within one component | Component |
| Component | Units behind a clear interface; internal to this software. | within this software | Library |
| Library | Components behind a clear interface; reusable outside this software. | reusable across systems | Software System |
| Software System | Integrated product of libraries + external interfaces. | the deliverable | — |
| Package/Folder | Organization only; a language module is also just organization. | — | — |
The task store (.opencode/tasks/<project>/, one Markdown file per ticket) holds
tickets and sprints, scoped per project so several independent projects run at
once. Agents read/write it through the task_* MCP tools; humans can read the files
directly (and hand edits are tolerated between tool writes). Ticket states:
product-backlog --plan--> sprint-backlog --claim--> in-progress --verify--> in-review --accept--> done
(incomplete on sprint close ───────────────────────────────────────────────────────────────┘)
paused = parked for maintenance (U-038): visible, never blocked; resume is a status update
blocked = orthogonal flag (blocked:bool + blocker:str) at any active state
Key rules:
- Self-claim by role. A worker loops
task_claim(role=…); the call is atomic (file lock + temp-rename writes) so two agents never get the same ticket. A returned ticket (task_release) can be picked up by a different agent. A claim with nothing to do returnsnull— worker loops stop on it. - Record artifacts. When a worker produces a file, git commit/branch, or doc, it
records it with
task_add_artifact(kind=file|git|path|url|doc, ref=…)before moving toin-review— the ticket is the hand-off contract. - Rework loop. A review FAIL routes by stage:
task_send_backto the previous stage's backlog, blocked with the reviewer's reasons (the human-escalation signal); first-stage and unstaged tickets have nowhere to send back to and are blocked in place. An UNCLEAR verdict round-trips the doubt to the originator (one retry per stage visit). - Bubble-up → escalation. A blocked worker sets
blocked+ ablocker; the PM resolves internally or escalates only human-worthy decisions.
V pipeline (optional, per ticket). A ticket may carry a stage — the 10 canonical stages
requirements … test-requirements (definition down the left leg, verification up the right).
Stages run concurrently (no phase gates): each finished stage feeds the next stage's backlog
via task_advance (which re-derives role/skill from the new stage); a stage that cannot proceed
calls task_send_back with a reason. The Board view has a Pipeline mode for stage-ordered columns.
See project-manager-operating-model (Scrum events, DoD, escalation), project-manager-create-ticket (how to fill
a ticket), project-manager-route-request (ambiguous next step), project-manager-audit-traceability (matrix).
| Agent | Role | Model |
|---|---|---|
orchestrator |
kicks off the sprint; workers self-claim | tier (high) |
manifest-author |
high-tier plan + execution manifest | tier (high) |
executor |
open-tier task execution; records artifacts | tier (low) |
reviewer |
high-tier final review (edit-denied) | tier (high) |
rubberduck |
cross-vendor critic (edit-denied) | tier (different vendor) |
research |
authoritative-source investigation; validated synthesis | tier (high) |
project-manager |
Scrum Master + PO proxy; always present | tier (high) |
cpp-tools |
C++ build/format/static-analysis via bash | tier (low) |
graphics-expert |
frontier graphics work; drives mcp.graphics |
pinned very-high |
- C++: the
cpp-toolsagent runs CMake configure/build, clang-format, cppcheck, clang-tidy and reads their reports (methodology in thecpp-toolsskill); there is no separate C++ MCP server (the structured C++ tool pack ships in theeclipse-buildendpoint — see the table above). - Graphics:
mcp.graphicsexposesgraphics_screenshot,graphics_renderdoc_capture,graphics_renderdoc_frame,graphics_compare_renders.graphics-expert(very-high tier) drives them;graphics-render-comparisonis the thin methodology skill.
Agents/docs reference tiers, never hard-coded model IDs, and no model
ids are committed (decision D-004: contributors use different providers) —
each setup configures its opencode.json default and agent frontmatter, and
resolves tiers through /models. In the Eclipse chat, selector changes
are deliberate by design: un-armed drift (mouse-wheel/pointer traffic over the
selector row) reverts — only an opened-dropdown pick or Enter commits.
| Tier | Selection rule |
|---|---|
very-low |
cheapest/fastest for trivial, mechanical edits |
low |
best open-weight model — default executor |
mid |
balanced general model for standard impl/tests |
high |
top-capability reasoning + large context — planning + review |
very-high |
frontier/highest-risk — run twice & reconcile |
- Frame the project: the human writes the brief/goal; the
project-manageragent creates tickets (task_create) inproduct-backlog. - Sprint planning:
task_plan_sprintcommits tickets to a sprint (sprint-backlog). - Execute: workers
task_claim(role=…), use the matchingsoftware-*/test-software-*skill, record artifacts, and move tickets toin-review. - Review & accept: the
reviewer/ test skills verify; acceptance is the engine's review pass — after a merged launch the fleet dispatches a read-only review session and applies its verdict (U-021): PASS →done(and advance into the next stage's backlog), FAIL → staged send-back, UNCLEAR → staysin-reviewfor the human. The human's regular duty is resolving NEEDS-HUMAN escalations and accepting at Sprint Review. - Iterate: defects rework;
task_close_sprintreturns unfinished tickets to the backlog.
Use Plan mode (Tab) for multi-file changes; /agents to pick an agent; /models to
resolve a tier; the orchestrator dispatches parallel subagents. Skills auto-load from
.opencode/skills/; reference files with @.
- Install opencode v2 —
npm install -g @opencode/cli(the oldopencode-aipackage is the v1 line). - PowerShell 7 (
pwsh) on PATH —opencode.jsonlaunches the bundled MCP servers throughpwsh, and the launchers use PowerShell 7 syntax. - Connect providers via
/connect(e.g. Z.AI, GitHub Copilot, OpenAI — whichever you use). - Install the graphics MCP deps:
pip install -r mcp/graphics/requirements.txt. - Build the tool jars once (JDK 21):
cd eclipse; .\build.ps1 clean verify— the full reactor; isolated-plbuilds fail Tycho resolution of the sibling SNAPSHOT bundles unless you add-am. One build also fills the local Tycho p2 cache the stdio launchers resolve gson (and the JobManager jars) from. - Run
opencodefrom this repo. Skills, agents, andAGENTS.mdauto-load; thetasksstdio launcher and thegraphicsMCP server start fromopencode.json. Thefleetstdio server is registered but disabled by default ("disabled": trueinopencode.json) — enable it by setting that to"false", or reconnect at runtime withPOST /api/experimental/mcp/fleet/connect?location[directory]=<repo>. - Your first headless fleet dispatch: see
docs/fleet-quickstart.md(seed ticket →fleet_dispatch→ poll → merge → actuals — the whole engine works without Eclipse). Host discipline for the automatic pump (auto-dispatch / recurring waves): it runs in whichever host starts it — the Eclipse Board, or the fleet stdio JVM when a chat session callsfleet_auto_start/fleet_waves_start— and pumps for as long as that host runs. There is no detached fleet daemon and no third host.
MCP scope: the bundled servers implement a deliberately minimal JSON-RPC surface (
initialize,tools/list,tools/call, pluspingon all three Java servers —tasks,fleetandeclipse-buildshare one dispatcher). Thetasksandfleetlaunchers (Java, stdio) and the Eclipse-hostedeclipse-buildendpoint (Streamable HTTP, serving thetask_*and C++ tool packs) expose their tool sets over the same surface — one surface, two transports;graphicsis stdio. None implementresources,prompts, cancellation, or progress. That is sufficient for opencode tool calls.
No plugin sources ship.
.opencode/carries only skills, agents, docs and the task store — there is nopackage.jsonand nonode_modulesunder it; a fresh clone needs nonpm installthere. The harness integrates with opencode via MCP servers, skills and agents, not Node plugins.
Hephaestus is a template repo. Copy the pieces you need (below), then
follow docs/own-project.md - the step-by-step
guide for wiring the harness to YOUR project (store layout, config,
tickets, waves, verification gate, and what to replace in the template):
# from your project root
mkdir -p .opencode/skills .opencode/agent mcp
cp -R /path/to/Hephaestus/.opencode/skills/* .opencode/skills/
cp -R /path/to/Hephaestus/.opencode/agent/* .opencode/agent/
cp -R /path/to/Hephaestus/mcp/graphics mcp/
cp /path/to/Hephaestus/opencode.json .
cp /path/to/Hephaestus/AGENTS.md .
# task board: point opencode.json's "tasks" entry at the Hephaestus
# CHECKOUT's launcher (absolute path) — do NOT copy tasks-tools.ps1 into your
# repo: it resolves the built jars relative to itself (falling back to this
# repo's git common-dir for worktrees); a copy in a foreign repo finds no jars.
# -Root defaults to .opencode/tasks under the directory opencode runs in.Trim to what you need (e.g. drop graphics-* / mcp.graphics if unused). Set the
default model in opencode.json (and any per-agent overrides) to match your
providers.
- ❌ Don't commit a model id anywhere (
opencode.jsondefault or agent frontmatter) — reference a tier; every setup decides its providers. - ❌ Don't rename
SKILL.mdor rely on the folder name — identity is the front-mattername:(must match its folder). - ❌ Don't put two
AGENTS.mdin the same folder — opencode loads one per git-root/cwd. ⚠️ Skills in.opencode/skills/load for everyone who runsopencodehere — commit only what the project needs.
cpp/ is a standalone AI-first C++23 build template (its own CMakeLists.txt,
CMakePresets.json, AGENTS.md, .clang-tidy, .clang-format, src/, include/,
tests/). It emits machine-readable reports (compile DB, Doxygen XML, clang-tidy /
cppcheck exports) and runs verify (fast) and verify-full (strict). The cpp-tools
agent drives it. See cpp/README.md and cpp/AGENTS.md.
Presets ship for the Ninja-first toolchains — default/release/analysis
(Ninja + Clang on PATH, full AI analysis stack), clang64/mingw64 (MSYS2
environments), linux (Ninja + gcc, incl. WSL) — and windows (Visual Studio +
MSVC, which builds and tests but skips the Clang-based analysis by design). On a
Windows host without Clang/Ninja, use cmake --preset windows.
MIT © 2026 Norbert Nopper.
The bundled graphics MCP server depends on Pillow (HPND) and numpy
(BSD-3-Clause) — all permissive and compatible with MIT. Their
full license texts and copyright notices are in
THIRD-PARTY.md. The cpp/ template's test-only GoogleTest
(BSD-3-Clause, fetched on demand) is not redistributed and is documented there
as well. The Eclipse chat view additionally vendors markdown-it, mermaid,
KaTeX, and highlight.js into its bundle jar; their notices are also in
THIRD-PARTY.md.
