Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions .cursor-plugin/marketplace.json
Original file line number Diff line number Diff line change
@@ -1,13 +1,19 @@
{
"name": "evolver",
"owner": {
"name": "EvoMap"
"name": "EvoMap",
"email": "team@evomap.ai"
},
"metadata": {
"description": "Official Evolver plugin for Cursor — persistent, auditable evolution memory for the agent, powered by the Genome Evolution Protocol (GEP).",
"version": "2.1.0"
},
"plugins": [
{
"name": "evolver",
"source": "./",
"source": ".",
"description": "Persistent, auditable evolution memory for the agent — recalls what worked, detects improvement signals, records outcomes. Powered by the Genome Evolution Protocol (GEP).",
"version": "2.1.0",
"author": {
"name": "EvoMap"
},
Expand Down
44 changes: 41 additions & 3 deletions .cursor-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
{
"name": "evolver",
"displayName": "Evolver — Self-Evolving Agent Memory",
"description": "Gives the agent a persistent, auditable evolution memory plus a bridge to the EvoMap network. Recalls what worked at session start, detects improvement signals while you edit, records outcomes when a task ends, and exposes the network's genes/capsules as MCP tools — powered by the Genome Evolution Protocol (GEP). The hooks degrade gracefully without a local install; add the `@evomap/evolver` npm package to unlock the full review-and-solidify pipeline and EvoMap Hub sync.",
"version": "2.0.0",
"description": "Gives the agent a persistent, auditable evolution memory plus a bridge to the EvoMap network. Recalls what worked at session start, detects improvement signals while you edit, records outcomes when a task ends, and exposes the network's genes/capsules as MCP tools — powered by the Genome Evolution Protocol (GEP). The hooks degrade gracefully without a local install or a working git binary; add the `@evomap/evolver` npm package to unlock the full review-and-solidify pipeline and EvoMap Hub sync.",
"version": "2.1.0",
"author": {
"name": "EvoMap",
"email": "team@evomap.ai"
Expand Down Expand Up @@ -31,5 +31,43 @@
"commands": "./commands/",
"rules": "./rules/",
"hooks": "./hooks/hooks.json",
"mcpServers": "./mcp.json"
"mcpServers": "./mcp.json",
"variables": {
"type": "object",
"properties": {
"EVOMAP_NODE_ID": {
"type": "string",
"title": "EvoMap Node ID — leave blank for automatic setup",
"description": "Leave this blank (recommended). On first run the local Proxy registers a fresh node for you and prints a link to claim it on evomap.ai — you never paste an id or a secret here. Only fill this in to point the install at a node you already run yourself.",
"default": ""
},
"EVOMAP_HUB_URL": {
"type": "string",
"title": "EvoMap Hub URL",
"description": "Base URL of the EvoMap Hub the Proxy talks to.",
"default": "https://evomap.ai"
},
"EVOMAP_PROXY_PORT": {
"type": "string",
"title": "Proxy port",
"description": "Local Proxy mailbox port that the MCP bridge connects to.",
"default": "19820"
},
"EVOLVE_STRATEGY": {
"type": "string",
"title": "Evolution strategy",
"description": "balanced | innovate | harden | repair-only | early-stabilize | steady-state | auto",
"default": "balanced",
"enum": [
"balanced",
"innovate",
"harden",
"repair-only",
"early-stabilize",
"steady-state",
"auto"
]
}
}
}
}
19 changes: 19 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
name: test

on:
pull_request:
push:
branches: [main]

permissions:
contents: read

jobs:
test:
name: node tests
runs-on: ubuntu-latest
steps:
- name: Check out
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
- name: Run tests
run: node --test test/*.test.js
38 changes: 38 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# Changelog

All notable changes to the Evolver Cursor plugin are documented here.
This project adheres to [Semantic Versioning](https://semver.org/).

## [2.1.0] — 2026-08-18

### Fixed
- Hooks no longer spawn Apple's `/usr/bin/git` stub on macOS without Xcode
Command Line Tools. That stub prints `No developer tools were found` and was
the failure behind Cursor's **Error loading plugin** banner
(`git ... init` / `xcode-select`). Repo detection is filesystem-only; git is
resolved without executing the stub; `git init` / `git clone` are refused.
- Session-start no longer tells the agent to run `git init` (a string Cursor or
the agent could treat as an actionable command). Missing-repo and unusable-git
notices are separate, throttled, and name the CLT / Homebrew fix.
- `evolver_fetch_asset` now puts the reuse nudge on the returned **data** so
the model actually sees it.
- MCP bridge ignores unexpanded `${EVOMAP_PROXY_PORT}` placeholders from
Cursor Configure (empty/placeholder falls back to 19820).

### Added
- Cursor **Plugins → Configure** variables: Node ID (leave blank), Hub URL,
proxy port, evolution strategy — wired into the MCP bridge env.
- MCP: free-text `query` on `evolver_search_assets` (query and/or signals).
- MCP: `evolver_report_reuse` so reused genes/capsules credit their authors.
- `sessionEnd` hook alias (same recorder as `stop`, deduped).
- Command frontmatter `name` fields; `/search` prefers a natural-language query.

### Notes
- Local memory still needs a working git to *record* diffs. The plugin itself
loads and the MCP bridge still runs when git is missing.

## [2.0.0] — 2026-08-16

### Changed
- Manifest version 2.0.0; bundled skill renamed from `capability-evolver` to
`evolver`; CLI fallbacks pin to `@evomap/evolver@2`.
47 changes: 39 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,11 @@ turned out — so the next session starts smarter.
Powered by the [Genome Evolution Protocol (GEP)](https://evomap.ai) and the
[`@evomap/evolver`](https://github.com/EvoMap/evolver) engine.

> **Status:** v2.0.0 — aligned with `@evomap/evolver` 2.x. Hooks + `evolver`
> **Status:** v2.1.0 — aligned with `@evomap/evolver` 2.x. Hooks + `evolver`
> skill + commands + MCP bridge. Works standalone (local memory) and, when the
> Proxy is running, exposes the EvoMap mailbox (genes/capsules) as MCP tools.
> Hooks never spawn Apple's Xcode `git` stub, so a missing Command Line Tools
> install cannot take the plugin down.

## What it does

Expand All @@ -24,14 +26,15 @@ Three hooks run automatically — you don't invoke them:
|---|---|---|
| `session-start.js` | `sessionStart` | Injects a summary of recent **successful** outcomes (score ≥ 0.5, < 7 days, max 3) as context. Also, when a node has been registered locally but not yet connected to the network, gives a one-time (throttled) nudge to claim it. |
| `signal-detect.js` | `afterFileEdit` | Detects improvement signals (`log_error`, `perf_bottleneck`, `capability_gap`, …) in edits. |
| `session-end.js` | `stop` | Classifies the current working-tree/staged git diff once per session and appends the outcome to the evolution memory graph. |
| `session-end.js` | `stop` / `sessionEnd` | Classifies the current working-tree/staged git diff once per session and appends the outcome to the evolution memory graph. Duplicate firings are suppressed. |

It also ships:

- An **`evolver` skill** describing the recall → work → record loop.
- An **MCP bridge** (`evolver-proxy`) exposing the local Proxy mailbox as tools:
`evolver_search_assets`, `evolver_status`, `evolver_fetch_asset`,
`evolver_publish_asset`, `evolver_distill_conversation`, `evolver_poll`.
`evolver_search_assets` (free-text `query` and/or `signals`), `evolver_status`,
`evolver_fetch_asset`, `evolver_report_reuse`, `evolver_publish_asset`,
`evolver_distill_conversation`, `evolver_poll`.
- Slash commands: **`/evolve`** (checkpoint), **`/search`** (find network assets),
**`/status`** (health), and engine wrappers **`/run`**, **`/solidify`**,
**`/review`**, **`/sync`**, **`/distill`** (use the `@evomap/evolver` CLI when
Expand All @@ -45,7 +48,31 @@ It also ships:
Search for **Evolver** in the Cursor plugin marketplace and install.

Reload Cursor. That's it — **local memory works with zero config**: no account,
no key, nothing to fill in.
no key, nothing to fill in. Optional Hub settings (node id, hub URL, proxy port,
strategy) live under **Plugins → Configure**; leave Node ID blank.

### Plugin failed to load (`git init` / `xcode-select`)

Cursor's plugin installer itself runs `git` when it copies the plugin into
`~/.cursor/plugins/cache`. On macOS without Xcode Command Line Tools, Apple's
`/usr/bin/git` is a stub that prints `No developer tools were found` and the
plugin page shows **Error loading plugin**.

Fix the installer side (pick one):

```bash
xcode-select --install
# or
brew install git
```

Then restart Cursor and reinstall / refresh the plugin.

This plugin's own hooks never run `git init` or `git clone`, and they refuse to
spawn `/usr/bin/git` when it is that stub, so once a real git is on PATH the
hooks stay silent instead of re-triggering the dialog. Local memory still
degrades: if git is unusable, recall/record waits until git works; MCP and
commands keep loading.

### Connecting to the EvoMap network (optional)

Expand Down Expand Up @@ -83,7 +110,9 @@ Reload Cursor. The hooks activate on the next session.
## Requirements

- **Node.js** (the hooks are Node scripts; Cursor invokes them via `node`).
- Nothing else for local memory.
- A working `git` for recording session diffs (Homebrew or Xcode Command Line
Tools on macOS). The plugin still loads without it; memory recording stays
inactive until git works.

## Modes

Expand Down Expand Up @@ -143,8 +172,10 @@ node registration.
| Variable | Default | Purpose |
|---|---|---|
| `MEMORY_GRAPH_PATH` | (auto) | Override the memory graph file location. |
| `EVOMAP_PROXY_PORT` | `19820` | Proxy port the MCP bridge falls back to (live url read from `~/.evolver/settings.json`). |
| `EVOMAP_HUB_URL` / `EVOMAP_API_KEY` / `EVOMAP_NODE_ID` | (unset) | Enable Hub recording. |
| `EVOMAP_PROXY_PORT` | `19820` | Proxy port the MCP bridge falls back to (live url read from `~/.evolver/settings.json`). Also settable under **Plugins → Configure**. |
| `EVOMAP_HUB_URL` / `EVOMAP_API_KEY` / `EVOMAP_NODE_ID` | (unset) | Enable Hub recording. Node ID and Hub URL are also plugin Configure fields; leave Node ID blank for automatic setup. |
| `EVOLVE_STRATEGY` | `balanced` | Default strategy for `/run`. Plugin Configure field. |
| `EVOLVER_GIT_BINARY` | (auto) | Absolute path to git. Set empty to force "git unavailable" (hooks will not spawn git). |
| `EVOLVER_HOOK_VERBOSE` | `0` | Set `1` to surface the session-end receipt inline (suppressed on Cursor by default). |

## License
Expand Down
1 change: 1 addition & 0 deletions commands/distill.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
---
name: distill
description: Distill a reusable skill/gene from recent run history (optionally from an LLM response file).
---

Expand Down
1 change: 1 addition & 0 deletions commands/evolve.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
---
name: evolve
description: Run an evolution cycle — recall relevant past outcomes, reflect on the current task, and record what was learned.
---

Expand Down
1 change: 1 addition & 0 deletions commands/review.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
---
name: review
description: Review Evolver's pending evolved changes, then approve (solidify) or reject (roll back).
---

Expand Down
1 change: 1 addition & 0 deletions commands/run.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
---
name: run
description: Run one Evolver self-evolution cycle on the current repo (collect signals → select/mutate genes → propose changes).
---

Expand Down
17 changes: 10 additions & 7 deletions commands/search.md
Original file line number Diff line number Diff line change
@@ -1,22 +1,25 @@
---
description: Search the EvoMap network for reusable evolution assets (genes/capsules) matching signals, via the evolver-proxy MCP tools.
name: search
description: Search the EvoMap network for reusable evolution assets (genes/capsules) matching a query or signals, via the evolver-proxy MCP tools.
---

# /search — search EvoMap

Before doing substantive work from scratch, search the network for proven
approaches.

Treat the arguments as space-separated signal keywords (e.g.
`log_error perf_bottleneck`). If none are given, infer 2–4 from the current task.
Valid signals: `log_error`, `perf_bottleneck`, `test_failure`, `capability_gap`,
`user_feature_request`, `deployment_issue`, `recurring_error`.
Treat the arguments as a free-text query describing the current task (preferred),
or as space-separated signal keywords (e.g. `log_error perf_bottleneck`). If none
are given, infer 2–4 signals from the current task. Valid signals: `log_error`,
`perf_bottleneck`, `test_failure`, `capability_gap`, `user_feature_request`,
`deployment_issue`, `recurring_error`.

1. Call the `evolver_search_assets` MCP tool (from the `evolver-proxy` server)
with those signals.
with a `query` and/or those `signals`.
2. Summarize each hit: id, type (Gene/Capsule), a one-line description, relevance.
3. If a hit applies, fetch its full content with `evolver_fetch_asset` and adapt
it to the current task.
it to the current task. After you actually reuse it, call `evolver_report_reuse`
with those asset IDs so the original author gets credit.

If the tool reports the Proxy is unreachable, tell the user to run `evolver` once
in a git repo to start it — the local memory hooks keep working regardless.
1 change: 1 addition & 0 deletions commands/solidify.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
---
name: solidify
description: Solidify the current working changes into a durable Evolver gene/capsule (with rollback safety).
---

Expand Down
1 change: 1 addition & 0 deletions commands/status.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
---
name: status
description: Show Evolver health — Proxy/MCP status, evolution memory, workspace id, and whether the full engine is installed.
---

Expand Down
1 change: 1 addition & 0 deletions commands/sync.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
---
name: sync
description: Sync evolution assets (genes/capsules) between the local store and the EvoMap Hub.
---

Expand Down
Loading