🪨 why use many token when few token do trick — Claude Code skill that cuts 65% of tokens by talking like caveman
CLI for auditable agent evolution and GEP prompts
Evolver is a command-line engine for agent self-evolution. It scans local memory, picks a matching Gene or Capsule from its GEP asset store, and prints a prompt or event trail the host runtime can use.
Builders who want Claude Code, Codex, or Cursor sessions to evolve from local logs and reusable assets.
You can turn agent tweaks into a traceable loop with reusable evolution assets instead of ad hoc prompt changes.
What it does
GEP prompt generation
Scans `memory/` and emits a protocol-bound prompt built from Genes and Capsules.
Auditable evolution events
Writes `EvolutionEvent` records so each cycle can be reviewed later.
Agent runtime hooks
Sets up hooks for Cursor, Claude Code, Codex, Kiro, and opencode through `evolver setup-hooks`.
Offline and network modes
Runs locally by default, or connects to EvoMap Hub for skill sharing, heartbeat, and worker pool work.
Skill fetch and sync
Downloads skills with `evolver fetch --skill <skill_id>` and restores assets with `evolver sync --scope=all --export=backup.gepx`.
Loop and review modes
Supports single runs, `--review` for human confirmation, and `--loop` for background operation.
How to get it
- 1Run
npm install -g @evomap/evolver
- 2Verify the CLI is on your PATH
evolver --help
- 3If you hit EACCES on Linux/macOS, configure a user-level prefix instead of using sudo
npm config set prefix ~/.npm-global echo 'export PATH="$HOME/.npm-global/bin:$PATH"' >> ~/.bashrc source ~/.bashrc
- 4From inside any git-initialized project directory
# Single evolution run -- scans logs, selects a Gene, outputs a GEP prompt evolver # Review mode -- pause before applying, wait for human confirmation evolver --review # Continuous loop -- runs as a background daemon evolver --loop
- 5Create a .env file in the current working directory where you run evolver (not in your…
# Register at https://evomap.ai to get your Node ID A2A_HUB_URL=https://evomap.ai A2A_NODE_ID=your_node_id_here
- 6Run
evolver
README
Evolver — Agent Self-Evolving Engine
evomap.ai | Documentation | Chinese / 中文文档 | Japanese / 日本語ドキュメント | Korean / 한국어 문서 | GitHub | Releases
Notice — Moving Toward Source-Available
Evolver has been fully open source since our first release on 2026-02-01 (initially MIT, and GPL-3.0-or-later since 2026-04-09). In March 2026, another project in the same lane released a system with strikingly similar memory / skill / evolution-asset design — without any attribution to Evolver. Full analysis: Hermes Agent Self-Evolution vs. Evolver: A Detailed Similarity Analysis.
To protect the integrity of the work and keep investing in this direction, future Evolver releases will transition from fully open source to source-available. Our commitment to users is unchanged: we will keep shipping the best agent self-evolution capability in the industry — faster iteration, deeper GEP integration, stronger memory and skill systems. All already-published MIT and GPL-3.0 versions remain freely usable under their original terms. You can still
npm install @evomap/evolveror clone this repo; nothing in your current workflow breaks.Questions or concerns: open an issue or reach us at evomap.ai.
Research — The theory behind Evolver
From Procedural Skills to Strategy Genes: Towards Experience-Driven Test-Time Evolution · arXiv:2604.15097 · PDF
Across 4,590 controlled trials on 45 scientific code-solving scenarios, the paper shows that documentation-oriented Skill packages provide unstable, sparse control signal, while a compact Gene representation delivers the strongest overall performance, stays robust under structural perturbation, and is a far better carrier for iterative experience accumulation. On CritPt, gene-evolved systems lift their paired base models from 9.1% to 18.57% and from 17.7% to 27.14%.
Evolver is the open-source engine that puts this result into practice: it encodes agent experience as Genes and Capsules under the GEP protocol, not as ad hoc prompts or skill docs. If you've ever wondered why Evolver insists on Genes instead of longer skill docs, this is the paper to read.
Want the applied version? OpenClaw x EvoMap: CritPt Evaluation Report walks through how the same Gene-based evolution loop drives an OpenClaw agent from 9.1% to 18.57% on CritPt Physics Solver across five versions (Beta -> v2.2), with full token-cost trajectories, gene activation mapping, and the "tokens rise then fall" signature of reasoning getting compressed into reusable genes.
"Evolution is not optional. Adapt or die."
Three lines
- What it is: A GEP-powered self-evolution engine for AI agents.
- Pain it solves: Turns ad hoc prompt tweaks into auditable, reusable evolution assets.
- Use in 30 seconds:
npm install -g @evomap/evolver, then runevolverin any git repo.
EvoMap -- The Evolution Network
Evolver is the core engine behind EvoMap, a network where AI agents evolve through validated collaboration. Visit evomap.ai to explore the full platform -- live agent maps, evolution leaderboards, and the ecosystem that turns isolated prompt tweaks into shared, auditable intelligence.
Keywords: protocol-constrained evolution, audit trail, genes and capsules, prompt governance.
Choose Your Path
Evolver has one install but two usage shapes. Pick the one that matches how you plan to use it, then follow only that section.
| Path | Who it's for | Command after install | Guide |
|---|---|---|---|
| CLI Quick Start | You just want to use Evolver to evolve an agent / project. 99% of readers. | evolver | below |
| Run from Source | You want to hack on the engine, send PRs, or run unreleased builds. | node index.js | below |
For agent / skill integrations (Codex, Claude Code skill system, custom MCP clients) see the separate SKILL.md -- it documents the Proxy mailbox API that wraps the CLI. You still install Evolver via the CLI Quick Start below first.
Prerequisites
- Node.js >= 18
- Git -- Required. Evolver uses git for rollback, blast radius calculation, and solidify. Running in a non-git directory will fail with a clear error message.
CLI Quick Start
This is the recommended path for almost everyone.
1. Install
npm install -g @evomap/evolver
Verify the CLI is on your PATH:
evolver --help
If you hit EACCES on Linux/macOS, configure a user-level prefix instead of using sudo:
npm config set prefix ~/.npm-global
echo 'export PATH="$HOME/.npm-global/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
2. Run it
From inside any git-initialized project directory:
# Single evolution run -- scans logs, selects a Gene, outputs a GEP prompt
evolver
# Review mode -- pause before applying, wait for human confirmation
evolver --review
# Continuous loop -- runs as a background daemon
evolver --loop
A "successful first run" looks like:
- Evolver prints a banner with the detected strategy preset (e.g.
balanced). - It scans
./memory/(creates it if missing) for logs and signals. - It selects a matching Gene / Capsule from its built-in asset pool.
- It prints a GEP prompt to stdout -- that's the artifact. Copy it into your agent, or let a host runtime (OpenClaw, Cursor hook, Claude Code hook) consume it automatically.
- It writes an
EvolutionEventinto./memory/for audit.
If step 4 didn't appear, you're not running inside a git repo -- cd into one and retry. Everything else runs fully offline.
3. Connect to the EvoMap network (optional)
Evolver works fully offline. Hub connection only unlocks network features (skill sharing, worker pool, evolution leaderboards).
Create a .env file in the current working directory where you run evolver (not in your home directory, not in the global npm install location):
# Register at https://evomap.ai to get your Node ID
A2A_HUB_URL=https://evomap.ai
A2A_NODE_ID=your_node_id_here
Evolver reads .env from process.cwd() on each run. If you run evolver from multiple projects, each project can have its own .env.
4. Wire up your agent runtime (optional)
Evolver integrates with major agent runtimes through setup-hooks. Run it once per platform you want to wire up.
| Platform | Command | What it writes |
|---|---|---|
| Cursor | evolver setup-hooks --platform=cursor | ~/.cursor/hooks.json + scripts in ~/.cursor/hooks/. Restart Cursor or open a new session. Fires on sessionStart, afterFileEdit, stop. |
| Claude Code | evolver setup-hooks --platform=claude-code | Registers with Claude Code's hook system via ~/.claude/. Restart the Claude Code CLI. |
| Codex | evolver setup-hooks --platform=codex | ~/.codex/hooks.json + scripts in ~/.codex/hooks/, enables codex_hooks feature in config.toml. Restart the Codex CLI. See Codex caveats below. |
| Kiro | evolver setup-hooks --platform=kiro | Three *.kiro.hook files + scripts in ~/.kiro/hooks/. Auto-discovered, no restart needed. |
| opencode | evolver setup-hooks --platform=opencode | Plugin at ~/.opencode/plugins/evolver.js + scripts in ~/.opencode/hooks/. Restart opencode. |
| OpenClaw | No setup needed | OpenClaw natively interprets the sessions_spawn(...) stdout directives Evolver emits. Just run evolver from inside an OpenClaw session. |
Codex caveats
The Codex CLI exposes SessionStart / Stop / PostToolUse hooks (which is
how setup-hooks --platform=codex wires Evolver in), but it does not
emit a session transcript file the way Cursor / Claude Code / opencode do.
That means evolver --review cannot read raw session logs on Codex.
setup-hooks --platform=codex is lifecycle integration only; it does not route
Codex model requests through Evolver Proxy. To route Codex model traffic, run
Evolver Proxy and configure Codex with a user-level OpenAI Responses-compatible
custom provider whose base_url points at the proxy's /v1 endpoint and whose
command-backed auth runs evolver proxy-token or the absolute node index.js proxy-token --settings ... helper emitted by scripts/internal-proxy-env.sh --codex-config from a source checkout.
Evolver compensates by reading, in order:
MEMORY.md/USER.mdin the workspace root (if you maintain them);- the
<!-- evolver-evolution-memory -->section thatsetup-hooks --platform=codexinjects into your project'sAGENTS.md; - the tail of the local
memory_graph.jsonl(the per-cycle outcome log that Evolver writes itself).
If none of those have content yet, you'll see memory_missing /
user_missing / session_logs_missing show up as advisory signals
during the first few cycles. They will go quiet on their own as
memory_graph.jsonl accumulates outcomes — no manual setup required.
Run from Source (Contributors Only)
Skip this section entirely if you installed via npm install -g @evomap/evolver above. This path exists so contributors can hack on the engine.
git clone https://github.com/EvoMap/evolver.git
cd evolver
npm install
# Then use node index.js wherever the CLI docs say evolver
node index.js # equivalent to: evolver
node index.js --review # equivalent to: evolver --review
node index.js --loop # equivalent to: evolver --loop
Every evolver <flag> invocation in the rest of this README maps 1:1 to node index.js <flag> when running from source.
What Evolver Does (and Does Not Do)
Evolver is a prompt generator, not a code patcher. Each evolution cycle:
- Scans your
memory/directory for runtime logs, error patterns, and signals. - Selects the best-matching Gene or Capsule from the local GEP asset store.
- Emits a strict, protocol-bound GEP prompt that guides the next evolution step.
- Records an auditable EvolutionEvent for traceability.
It does NOT:
- Automatically edit your source code.
- Execute arbitrary shell commands (see Security Model).
- Require an internet connection for core functionality.
How It Integrates with Host Runtimes
When running inside a host runtime (e.g., OpenClaw), the sessions_spawn(...) text printed to stdout can be picked up by the host to trigger follow-up actions. In standalone mode, these are just text output -- nothing is executed automatically.
| Mode | Behavior |
|---|---|
Standalone (evolver) | Generates prompt, prints to stdout, exits |
Loop (evolver --loop) | Repeats the above in a daemon loop with adaptive sleep |
| Inside OpenClaw | Host runtime interprets stdout directives like sessions_spawn(...) |
--loopis not a real-time agent assistant. Loop mode is for background self-maintenance (validator runs, worker tasks, ATP merchant auto-deliver, solidify). Its stdout is consumed by evolver itself, not by a running host agent, sosessions_spawn(...)directives produced in loop mode will not be picked up by OpenClaw / Cursor / Claude Code even if those runtimes are installed. If you want evolver to observe and advise a live agent session, callevolverfrom inside that agent session (OpenClaw will pick up the stdout directives on that single run). For OpenClaw specifically, also make sureAGENT_NAME(orAGENT_SESSIONS_DIR) points at the agent directory actually producing sessions under~/.openclaw/agents/<name>/sessions/-- otherwise evolver falls back to reading its own logs and looks like it is "cycling emptily".
Who This Is For / Not For
For
- Teams maintaining agent prompts and logs at scale
- Users who need auditable evolution traces (Genes, Capsules, Events)
- Environments requiring deterministic, protocol-bound changes
Not For
- One-off scripts without logs or history
- Projects that require free-form creative changes
- Systems that cannot tolerate protocol overhead
Features
- Auto-Log Analysis: scans memory and history files for errors and patterns.
- Self-Repair Guidance: emits repair-focused directives from signals.
- GEP Protocol: standardized evolution with reusable assets.
- Mutation + Personality Evolution: each evolution run is gated by an explicit Mutation object and an evolvable PersonalityState.
- Configurable Strategy Presets:
EVOLVE_STRATEGY=balanced|innovate|harden|repair-onlycontrols intent balance. - Signal De-duplication: prevents repair loops by detecting stagnation patterns.
- Operations Module (
src/ops/): portable lifecycle, skill monitoring, cleanup, self-repair, wake triggers -- zero platform dependency. - Protected Source Files: prevents autonomous agents from overwriting core evolver code.
- Skill Store: download and share reusable skills via
evolver fetch --skill <id>.
Typical Use Cases
- Harden a flaky agent loop by enforcing validation before edits
- Encode recurring fixes as reusable Genes and Capsules
- Produce auditable evolution events for review or compliance
Anti-Examples
- Rewriting entire subsystems without signals or constraints
- Using the protocol as a generic task runner
- Producing changes without recording EvolutionEvent
Usage
All commands below assume you installed with npm install -g @evomap/evolver. If you are running from source, substitute node index.js for evolver -- they are equivalent.
Standard Run (Automated)
evolver
Review Mode (Human-in-the-Loop)
evolver --review
Continuous Loop
evolver --loop
With Strategy Preset
EVOLVE_STRATEGY=innovate evolver --loop # maximize new features
EVOLVE_STRATEGY=harden evolver --loop # focus on stability
EVOLVE_STRATEGY=repair-only evolver --loop # emergency fix mode
| Strategy | Innovate | Optimize | Repair | When to Use |
|---|---|---|---|---|
balanced (default) | 50% | 30% | 20% | Daily operation, steady growth |
innovate | 80% | 15% | 5% | System stable, ship new features fast |
harden | 20% | 40% | 40% | After major changes, focus on stability |
repair-only | 0% | 20% | 80% | Emergency state, all-out repair |
Operations (Lifecycle Management)
node src/ops/lifecycle.js start # start evolver loop in background
node src/ops/lifecycle.js stop # graceful stop (SIGTERM -> SIGKILL)
node src/ops/lifecycle.js status # show running state
node src/ops/lifecycle.js check # health check + auto-restart if stagnant
Skill Store
# Download a skill from the EvoMap network
evolver fetch --skill <skill_id>
# Specify output directory
evolver fetch --skill <skill_id> --out=./my-skills/
Requires A2A_HUB_URL to be configured. Browse available skills at evomap.ai.
After a successful local install commit, Evolver POSTs Hub
/a2a/skill/store/:id/install-success (B-5 / KDP-3) so trailing-30d trending
can count unique successful installs; report failures never undo the on-disk
install.
Cron / External Runner Keepalive
If you run a periodic keepalive/tick from a cron/agent runner, prefer a single simple command with minimal quoting.
Recommended:
bash -lc 'evolver --loop'
Avoid composing multiple shell segments inside the cron payload (for example ...; echo EXIT:$?) because nested quotes can break after passing through multiple serialization/escaping layers.
For process managers like pm2, the same principle applies -- wrap the command simply:
pm2 start "bash -lc 'evolver --loop'" --name evolver --cron-restart="0 */6 * * *"
Connecting to EvoMap Hub
Evolver can optionally connect to the EvoMap Hub for network features. This is not required for core evolution functionality.
Setup
- Register at evomap.ai and get your Node ID.
- Add the following to your
.envfile:
A2A_HUB_URL=https://evomap.ai
A2A_NODE_ID=your_node_id_here
What Hub Connection Enables
| Feature | Description |
|---|---|
| Heartbeat | Periodic check-in with the Hub; reports node status and receives available work |
| Skill Store | Download and publish reusable skills (evolver fetch) |
| Worker Pool | Accept and execute evolution tasks from the network (see Worker Pool) |
| Evolution Circle | Collaborative evolution groups with shared context |
| Asset Publishing | Share your Genes and Capsules with the network |
How It Works
When evolver --loop is running with Hub configured:
- On startup, evolver sends a
hellomessage to register with the Hub. - A heartbeat is sent every 6 minutes (configurable via
HEARTBEAT_INTERVAL_MS). - The Hub responds with available work, overdue task alerts, and skill store hints.
- If
WORKER_ENABLED=1, the node advertises its capabilities and picks up tasks.
Without Hub configuration, evolver runs fully offline -- all core evolution features work locally.
Worker Pool (EvoMap Network)
When WORKER_ENABLED=1, this node participates as a worker in the EvoMap network. It advertises its capabilities via heartbeat and picks up tasks from the network's available-work queue. Tasks are claimed atomically during solidify after a successful evolution cycle.
| Variable | Default | Description |
|---|---|---|
WORKER_ENABLED | (unset) | Set to 1 to enable worker pool mode |
WORKER_DOMAINS | (empty) | Comma-separated list of task domains this worker accepts (e.g. repair,harden) |
WORKER_MAX_LOAD | 5 | Advertised maximum concurrent task capacity for hub-side scheduling (not a locally enforced concurrency limit) |
WORKER_ENABLED=1 WORKER_DOMAINS=repair,harden WORKER_MAX_LOAD=3 evolver --loop
WORKER_ENABLED vs. the Website Toggle
The evomap.ai dashboard has a "Worker" toggle on the node detail page. Here is how the two relate:
| Control | Scope | What It Does |
|---|---|---|
WORKER_ENABLED=1 (env var) | Local | Tells your local evolver daemon to include worker metadata in heartbeats and accept tasks |
| Website toggle | Hub-side | Tells the Hub whether to dispatch tasks to this node |
Both must be enabled for your node to receive and execute tasks. If either side is off, the node will not pick up work from the network. The recommended flow:
- Set
WORKER_ENABLED=1in your.envand startevolver --loop. - Go to evomap.ai, find your node, and turn on the Worker toggle.
GEP Protocol (Auditable Evolution)
This repo includes a protocol-constrained prompt mode based on GEP (Genome Evolution Protocol).
- Structured runtime assets live in
<workspace>/.evolver/gep/by default:<workspace>/.evolver/gep/genes.json<workspace>/.evolver/gep/capsules.json<workspace>/.evolver/gep/events.jsonl
- Set
GEP_ASSETS_DIRto place the runtime asset store elsewhere. - Selector logic uses extracted signals to prefer existing Genes/Capsules and emits a JSON selector decision in the prompt.
- Constraints: Only the DNA emoji is allowed in documentation; all other emoji are disallowed.
Your local asset store is never overwritten by upgrades
<workspace>/.evolver/gep/genes.json, <workspace>/.evolver/gep/capsules.json, and <workspace>/.evolver/gep/events.jsonl are owned by your runtime and ignored by git. assets/gep/ is reserved for bundled starter assets. On first run, evolver copies any legacy runtime files from assets/gep/ into .evolver/gep/ without deleting the originals, then seeds genes.json from the bundled starter genes only when no local genes.json exists.
If you ran an older evolver version that wiped your local assets, pull back everything you Promoted or published to the Hub with a single command:
A2A_HUB_URL=https://evomap.ai evolver sync --scope=all --export=backup.gepx
This hits /a2a/assets/purchased (Promoted-to-you plus self-purchased) and /a2a/assets/published-by-me (your own drafts and published assets), re-materializes the full payloads into genes.json / capsules.json, and packs a portable .gepx bundle. Previously-purchased payloads re-fetch at zero cost.
Purely local assets that were never uploaded to the Hub have no remote copy -- recover them from .evolver/gep/, from an older assets/gep/ checkout, or from disk snapshots.
Configuration & Decoupling
Evolver is designed to be environment-agnostic.
Core Environment Variables
| Variable | Description | Default |
|---|---|---|
EVOLVE_STRATEGY | Evolution strategy preset (balanced / innovate / harden / repair-only) | balanced |
A2A_HUB_URL | EvoMap Hub URL | (unset, offline mode) |
A2A_NODE_ID | Your node identity on the network | (auto-generated from device fingerprint) |
EVOMAP_HUB_IP_FAMILY | Hub egress IP-family policy: ipv4first tries IPv4 first and falls back to dual-stack, auto uses dual-stack as the primary path, ipv4-only disables fallback | ipv4first |
HEARTBEAT_INTERVAL_MS | Hub heartbeat interval | 360000 (6 min) |
MEMORY_DIR | Memory files path | ./memory |
EVOLVE_REPORT_TOOL | Tool name for reporting results | message |
Local Overrides (Injection)
You can inject local preferences (e.g., using feishu-card instead of message for reports) without modifying the core code.
Method 1: Environment Variables
Set EVOLVE_REPORT_TOOL in your .env file:
EVOLVE_REPORT_TOOL=feishu-card
Method 2: Dynamic Detection
The script automatically detects if compatible local skills (like skills/feishu-card) exist in your workspace and upgrades its behavior accordingly.
Valid
Files in the repo
- .github
- assets
- conformance
- examples
- scripts
- src
- test
- .gitignore
- .npmignore
- cli-options.js
- CONTRIBUTING.md
- index.js
- LICENSE
- package-lock.json
- package.json
- README.ja-JP.md
- README.ko-KR.md
- README.md
- README.zh-CN.md
- SKILL.md
Discussion (0)
Ask about usage, or say what you built with itSign in to join the discussion.
No comments yet. Be the first to say what this is good for.
More tools
The best-benchmarked open-source AI memory system. And it's free.
Orca is the ADE for working with a fleet of parallel agents. Run any coding agent with your own subscription. Available on desktop, mobile and remote runtime.

A cross-platform desktop All-in-One assistant for Claude Code, Codex, OpenCode, OpenClaw, Grok Build & Hermes Agent. Only official website: ccswitch.io
Never stop coding. Free MIT AI gateway: one endpoint, 352 providers (150+ free), 1200+ models Kimi, Claude, GPT, Gemini, GLM, DeepSeek, MiniMax. Works with Claude Code, Codex, Cursor, OpenCode, Cline & Copilot. Quota-aware auto-fallback, RTK+Caveman compression saves 15-95% tokens, MCP/A2A, Desktop/PWA. Built by 550+ contributors
Compress tool outputs, logs, files, and RAG chunks before they reach the LLM. 20% fewer tokens for coding agents, 60-95% fewer tokens for JSON, same answers. Library, proxy, MCP server.