ajhahn.de
← eeco
Markdown 175 lines
<div align="center">
  <picture>
    <source media="(prefers-color-scheme: dark)" srcset="assets/eeco_logo_dark.png">
    <img src="assets/eeco_logo_light.png" alt="eeco" width="420">
  </picture>

<h3>Single-binary workflow ecosystem and knowledge layer for any AI assistant.</h3>

<p>
    <a href="https://github.com/ajhahnde/eeco/actions/workflows/ci.yml"><img src="https://img.shields.io/github/actions/workflow/status/ajhahnde/eeco/ci.yml?branch=main&style=flat-square&label=ci" alt="CI"></a>
    <a href="https://codecov.io/gh/ajhahnde/eeco"><img src="https://img.shields.io/codecov/c/github/ajhahnde/eeco?style=flat-square&label=coverage" alt="Coverage"></a>
    <a href="https://github.com/ajhahnde/eeco/releases/latest"><img src="https://img.shields.io/badge/version-v0.2.1-3b82f6?style=flat-square" alt="Version"></a>
    <img src="https://img.shields.io/badge/go-1.24-lightgrey?style=flat-square" alt="Go 1.24">
    <img src="https://img.shields.io/badge/binary-single--static-lightgrey?style=flat-square" alt="single-static binary">
    <img src="https://img.shields.io/badge/license-Apache--2.0-lightgrey?style=flat-square" alt="License">
  </p>

<p>
    <b>README</b> ·
    <a href="VISION.md"><b>Vision</b></a> ·
    <a href="docs/COCKPIT.md"><b>Cockpit</b></a> ·
    <a href="docs/USAGE.md"><b>Usage</b></a> ·
    <a href="docs/ARCHITECTURE.md"><b>Architecture</b></a> ·
    <a href="docs/PUBLIC_API.md"><b>Public API</b></a> ·
    <a href="EXTENDING.md"><b>Extending</b></a> ·
    <a href="CONTRIBUTING.md"><b>Contributing</b></a> ·
    <a href="docs/UPGRADING.md"><b>Upgrading</b></a> ·
    <a href="VERSIONING.md"><b>Versioning</b></a> ·
    <a href="CHANGELOG.md"><b>Changelog</b></a> ·
    <a href="SECURITY.md"><b>Security</b></a>
  </p>

</div>

---

eeco adds two things to any coding project, from the terminal: a
self-maintaining workflow ecosystem, and a deterministic, no-AI-spend
knowledge layer any AI assistant can read. It ships as a single static
binary. The workflow side is a control-center TUI, repeatable workflows
that keep the tracked tree hygienic and surface issues, and a memory
store with garbage collection. The knowledge side is a project brief and
targeted Q&A, both built by a local deterministic pass with no model
call. New workflows are added opt-in over time — proposed for review
rather than applied unilaterally.

<p align="center">
  <picture>
    <source media="(prefers-color-scheme: dark)" srcset="assets/demo-dark.gif">
    <img src="assets/demo-light.gif" alt="eeco demo" width="780">
  </picture>
</p>

## Design

- **Single static binary, zero runtime dependencies.** Install via a
  package manager or drop the binary on `PATH`; nothing to provision on
  the host.
- **Local-first and private.** eeco reads anywhere in a target repo but
  writes only inside that repo's gitignored workspace. The sole
  exception is `eeco init`, which may make one initial commit and push
  of the workspace `.gitignore` line; no other verb ever commits or
  pushes.
- **Pluggable AI, opt-in by default.** A provider interface with a
  generic CLI provider wired in; every AI pass is gated by explicit
  consent (`--ai` or `automation=auto`) and a per-invocation budget cap.
- **Runs only when invoked.** A single queue is the only channel that
  asks for a decision.
- **Reversible.** The two integrations that touch outside the workspace
  (a local pre-commit hook, one entry in an AI CLI's user settings) are
  opt-in and recorded in a ledger so they can be removed cleanly.

## What eeco gives you

- **Control-center TUI** (`eeco`). A home screen lists the slash
  commands one line each; output streams above the input.
- **Ten builtin workflows.** `comment-hygiene`, `leak-guard`,
  `version-sync`, `gate`, `memory-drift`, and `doc-drift` keep the
  tracked tree hygienic and catch drift; `bug-sweep` keeps a triage
  ledger; `handover-refresh` drafts dated handovers; `manifest-refresh`
  keeps per-directory `.ai.json` manifests current; `evolve` proposes
  new workflows from observed repetition. Run via `eeco run <name>`. A
  pre-1.0 `cockpit-sync` workflow additionally keeps the generated AI
  cockpit in step (see [`docs/COCKPIT.md`](docs/COCKPIT.md)).
- **Knowledge layer for AI assistants.** `eeco go` prints a
  deterministic project brief, built with no model call (with `--json`,
  `--brief`, `--write`, and `--copy` delivery axes); `eeco ask "<question>"`
  answers a targeted question with ranked `path:line` pointers;
  `eeco add fact` / `eeco add task` let an assistant record what it
  learns back into memory and the queue. The delivery channels are
  brand-free — point Claude Code at `CLAUDE.md`, Gemini CLI at
  `GEMINI.md`, Codex at `AGENTS.md`, Cursor at `.cursorrules`, or
  paste `eeco go --copy` into any chat-only assistant.
- **Memory store with garbage collection** (`eeco gc`). One fact per
  file with flat frontmatter and a regenerated index.
- **The queue.** Every decision-bearing finding lands in one
  Markdown checklist under a presence lock — never email, never a
  notification, never a silent edit.
- **Opt-in self-update** (`eeco update --apply`). Verifies the
  release archive against the `SHA256SUMS` cosign signature, the
  archive sha256, and the GitHub build-provenance attestation before
  atomically replacing the running binary. Bare `eeco update` is
  read-only.
- **Cross-project settings** (`eeco config`). `eeco config list|get|set`
  edits the per-project config; `eeco config set --global <key> <value>`
  writes a user-global layer every project inherits, with per-repo
  overrides — the git `--global` model. See
  [`docs/USAGE.md`](docs/USAGE.md) §4a.
- **Diagnostics** (`eeco doctor`), **clean removal** (`eeco uninstall`),
  and **friction capture** (`eeco report-bug`).

## Install

Pick the route you prefer. See
[`docs/USAGE.md`](docs/USAGE.md#1-install) for the full platform matrix,
checksum verification, and the cosign signature + build-provenance
checks.

**Homebrew (macOS, Linux).**

```
brew install ajhahnde/eeco/eeco
```

**Scoop (Windows).**

```
scoop bucket add eeco https://github.com/ajhahnde/scoop-eeco
scoop install eeco
```

**Pre-built binary.** Download the archive for your platform from the
[releases page](https://github.com/ajhahnde/eeco/releases) and extract
the `eeco` binary onto your `PATH`. `SHA256SUMS` is cosign-signed and
the archives carry build provenance.

**From source.** Requires Go 1.24+.

```
git clone https://github.com/ajhahnde/eeco
cd eeco
make build        # produces ./eeco with version metadata
```

**In-place upgrade.** Once eeco is installed, future releases
upgrade in place:

```
eeco update --apply
```

Verifies the cosign signature on `SHA256SUMS`, the archive sha256, and
the GitHub build-provenance attestation before swapping the binary.
Refuses on Homebrew- or Scoop-managed install roots in favour of the
package manager's upgrade verb.

`make verify` runs `go build ./... && go vet ./... && go test ./...`;
`make release` cross-builds the published matrix into `dist/`.

## License

Apache License, Version 2.0. See [`LICENSE`](LICENSE).

_Public history starts at v0.1.0; eeco was developed in a private repo and published here._

## See also

- [FlashOS](https://github.com/ajhahnde/FlashOS) — AArch64 bare-metal kernel for the Raspberry Pi 4 Model B.
- [the-way-out](https://github.com/ajhahnde/the-way-out) — top-down pixel-art escape-room shooter.
- [Flash](https://github.com/ajhahnde/Flash) — a systems language and Zig transpiler.

---

[Next: Vision →](VISION.md)