<div align="center">

# Acuvo Code

**A coding agent for your terminal that writes code, runs it, reads the failure, and fixes it.**

Zero dependencies. One account, no provider keys.

[![npm](https://img.shields.io/npm/v/acuvo-code?color=0b7285&label=npm)](https://www.npmjs.com/package/acuvo-code)
[![node](https://img.shields.io/badge/node-%E2%89%A520-0b7285)](https://nodejs.org)
[![dependencies](https://img.shields.io/badge/dependencies-0-0b7285)](package.json)
[![licence](https://img.shields.io/badge/licence-FSL--1.1--ALv2-0b7285)](#licence)

</div>

```bash
npm i -g acuvo-code
acuvo --login
acuvo "the invoice test is failing — work out why and fix it"
```

---

## What it does

Most terminal agents write code and hand it back. This one **runs what it wrote**, reads the
actual stderr, and fixes it before it tells you it is done.

- **Writes, runs, repairs.** A real execution loop — exit codes and stack traces come back into
  the next round, not a guess about what might have failed.
- **Looks at what it built.** For anything that renders, it opens the result in a real browser
  and reports what a person would see.
- **Zero dependencies.** One file of Node. No framework, no install-time build step, no
  transitive supply chain to audit.
- **One account.** `acuvo --login` and every request goes to your Acuvo account — no Anthropic
  key, no OpenAI key, no second invoice. Bring your own key instead if you prefer; it is still
  supported and the CLI tells you which one is paying on every run.
- **Works both ways over MCP.** It connects to any MCP server (`acuvo mcp add`), *and* it is one
  — so Claude Code, Cursor, VS Code and Windsurf can drive Acuvo. See [Drive Acuvo from your
  editor](#drive-acuvo-from-your-editor).

## Usage

```bash
acuvo "add a --json flag to the export command"     # a change, made and verified
acuvo --no-run "sketch a migration plan"            # plan only, nothing executed
acuvo verify --all                                  # re-check every past claim
acuvo --refute "the cache is working"               # ask it to argue the opposite
```

Run `acuvo --help` for the full surface.

## Drive Acuvo from your editor

Acuvo ships **two** MCP servers, and they are not a choice of one — install both. The cloud one
cannot see your files; the local one cannot reach your account's engines.

```bash
acuvo mcp install --hosted --yes          # your Acuvo workspace: build software, read projects, generate
acuvo mcp install --yes                   # this folder: read files, see_page, make_document
```

It edits the config of whichever hosts it finds — Claude Code, Cursor, VS Code, Windsurf — shows
every change first, and writes nothing without `--yes`. Restart the host afterwards.

**The cloud server** (`acuvo-cloud`) is `POST /api/mcp/rpc`, JSON-RPC over Streamable HTTP,
authenticated with your account key. It serves every tool your plan allows — including the ones
that **build real software** — metered and audited on your account. Your workspace's
**Developers** page prints the live tool count and the exact invocation; without the CLI it is:

```bash
claude mcp add --transport http acuvo-cloud https://acuvo.xxiautomate.com/api/mcp/rpc \
  --header "Authorization: Bearer xxi_live_…"   # key: your workspace → API keys
```

> ⚠️ **Claude Desktop is the exception, and `mcp install` will tell you so.** It does not take a
> remote server from `claude_desktop_config.json` — add it in the app: **Settings → Connectors →
> Add custom connector**. The local stdio server installs there normally.

**The local server** is the `acuvo-mcp` binary over stdio, and **every group is gated, so with no
flags it serves zero tools on purpose**. Its `--root <dir>` is the one nobody guesses:

| you pass | you get |
|---|---|
| nothing | 0 tools — and the server says so, in the host's log |
| `--root <dir>` | reading that directory: `read_file`, `search_text`, `find_symbol`, `review_code`, … |
| `+ --allow-write` | `write_file`, `edit_file`, `apply_patch`, `move_file`, … |
| `+ --allow-spend <usd>` | `generate_image`, `speak`, `list_engines` — under a hard ceiling, journalled |
| `RENDER_AUDIT_URL` / `MODAL_PRESS_URL` | `see_page` and `make_document` |

⚠️ The creative group needs **all three** of `--root`, `--allow-write` and `--allow-spend`: the
engines write their output into the workspace. `acuvo mcp install` exists so you never have to
know that. Run `acuvo-mcp --help` for the full gating rules and the verbs that are refused
unconditionally.

## Requirements

Node 20 or newer. Nothing else.

## Documentation

| | |
|---|---|
| [**docs/STATUS.md**](docs/STATUS.md) | What is reachable today, what is not, and the measurement behind each claim |
| [CHANGELOG.md](CHANGELOG.md) | Every release |
| [ROADMAP.md](ROADMAP.md) | Where this is going |
| [ENTERPRISE.md](ENTERPRISE.md) | Deployment, isolation and audit |

> **We publish our own limits.** `docs/STATUS.md` lists the capabilities that are gated,
> unreachable or unproven, with the probe that measured each one. If something there is stale,
> that is a bug and we want the issue.

## Licence

[Functional Source License 1.1, Apache 2.0 Future License](LICENSE) (`FSL-1.1-ALv2`).

Use it, read it, modify it, run it in your company. The only thing it forbids is shipping a
competing product from it — and **on the second anniversary of each release, that version becomes
Apache 2.0**, permanently. Same licence Sentry and Codecov use.

GitHub shows this repository as having no licence because FSL is not on its recognised list. It
is a real licence; the terms are in [LICENSE](LICENSE).

---

<div align="center">
<sub>Built by <a href="https://acuvo.xxiautomate.com">Acuvo</a> · <a href="https://www.npmjs.com/package/acuvo-code">npm</a> · <a href="https://github.com/xxiautomate-star/acuvo-code/issues">issues</a></sub>
</div>
