Skip to content
Open
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
1 change: 1 addition & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
* text=auto eol=lf
19 changes: 18 additions & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,29 @@ jobs:
- run: npm test
- run: npm run pack

windows-minimax:
runs-on: windows-latest
timeout-minutes: 20
strategy:
fail-fast: false
matrix:
node: [22, 26]
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
node-version: ${{ matrix.node }}
cache: npm
- run: npm ci
- run: npm run test:minimax
- run: npm run pack

# A release is a tag vX.Y.Z a maintainer pushes on main; nothing on main names a version. The tag's version is
# stamped into every packed manifest, and the release branch, which the hosts install from (Claude Code, WorkBuddy,
# Grok and Qoder through their marketplaces, Codex at --ref, Antigravity, OpenCode and DeepSeek Harness from a
# clone), moves one commit on, with the tag re-pointed there. A push made with this workflow's token starts no run.
publish:
needs: test
needs: [test, windows-minimax]
if: startsWith(github.ref, 'refs/tags/v')
runs-on: ubuntu-latest
timeout-minutes: 10
Expand Down
17 changes: 17 additions & 0 deletions .minimax-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"schemaVersion": 1,
"name": "evolver-plugin",
"displayName": "Evolver",
"version": "1.0.0",
"description": "Recall reusable strategies, report verified results, and distill completed work into local drafts.",
"author": "EvoMap",
"repository": "https://github.com/EvoMap/evolver-agent-plugin",
"license": "MIT",
"icon": "assets/logo.png",
"category": "Code",
"exampleQueries": [],
"apps": [],
"mcpServers": [],
"skills": [],
"hooks": ["hosts/minimax/dist/hooks/hooks.json"]
}
12 changes: 12 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ The plugin is the access layer: shared logic lives in `lib/`, and each host is a
| DeepSeek Harness (dsh) | Supported | `hosts/dsh`, an in-process cordis plugin; installs `dist/dsh` |
| Grok CLI 1.0.70+ | Supported | `hosts/grok`, command hooks; the strategy reaches the model at the turn's first tool result; installs `dist/grok` |
| Qoder CLI (`qodercli`) 1.1.79+ | Supported | `hosts/qoder`, command hooks; installs `dist/qoder` |
| MiniMax Code CLI 0.7.4 / Desktop 3.1.6 | Supported locally | `hosts/minimax`, native hooks; installs `dist/minimax` |
| Muse Code | Not yet | No reviewed adapter yet |
| OpenAI Dots, Claude Duet, Grok Bot, Meta Muse | Not yet | Cloud agents without hooks; need Evolver's remote MCP and routines |

Expand Down Expand Up @@ -135,6 +136,17 @@ injections, undelivered reports), so nothing is lost on the way over.
prompt box (`evolver-status`, with or without its `/`) and answered as a blocked prompt; `/evolver-evolve` is a
Grok command. Each release tag stamps its version into the packed folder; `grok plugin update evolver-plugin` fetches it.
- **Cursor:** add this repository as a plugin marketplace and install `evolver-plugin`; it installs the repo itself.
- **MiniMax Code:** run `node scripts/install-minimax.mjs install` from a checkout,
then run `mcode plugin enable evolver-plugin@local --json` and start a
new task. The data root defaults to `~/.minimax`; keep the same `MINIMAX_DATA_DIR` for a separate profile.
A release checkout installs its versioned `dist/minimax` bundle; `--version X.Y.Z` builds the current sources explicitly.
The checkout's manifest is `.minimax-plugin/plugin.json`; source stays in `hosts/minimax/`.
This is a local installation: MiniMax's current public Marketplace submission format excludes hooks.
Use `evolver-status`, `evolver-drafts` and `evolver-evolve` in chat; `evolver-config recall off` and
`evolver-config auto-distill off` save preferences. Longer commands run as background jobs; use
`evolver-jobs`, `evolver-jobs job <id>` or `evolver-jobs cancel <id>` to inspect or cancel them.
[The MiniMax adapter guide](hosts/minimax/dist/README.md) covers updates, session-model distillation, private
configuration copies and recovery when a host exits without `SessionEnd`.
- **Antigravity:** `agy plugin uninstall evolver-antigravity-plugin`, then from the `release` branch,
`git clone --depth 1 --branch release https://github.com/EvoMap/evolver-agent-plugin.git` and
`agy plugin install evolver-agent-plugin/dist/antigravity`.
Expand Down
4 changes: 2 additions & 2 deletions bin/worker.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
// SPDX-License-Identifier: MIT
// Copyright (c) 2026 EvoMap

import { runWorker } from '../lib/channels/worker/runner.js';
import { runWorkerProcess } from '../lib/channels/worker/runner.js';

const [agent, ...tasks] = process.argv.slice(2);
process.exit((await runWorker(agent, tasks)) ? 0 : 1);
await runWorkerProcess(agent, tasks);
23 changes: 20 additions & 3 deletions docs/architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,20 @@ them is in `hosts/README.md`):

## Configuration

Every host honours these environment variables:
Hosts whose native environment preserves them honour these environment variables. MiniMax strips inherited
Evolver flags from hooks; its persistent preferences are described below.

| Variable | Default | Purpose |
|---|---|---|
| `HOME` / `USERPROFILE` | (unset) | User directory for Proxy settings and plugin state. A non-empty `HOME` wins. |
| `EVOMAP_PROXY_PORT` | `19820` | Fallback Proxy port when `~/.evolver/settings.json` names no URL. |
| `EVOLVER_RECALL` | (on) | `off` turns recall off. |
| `EVOLVER_AUTO_DISTILL` | (on) | `off` leaves distillation to an explicit command. |

MiniMax stores boolean `recall` and `autoDistill` preferences in `<PLUGIN_DATA>/minimax-settings.json`.
`evolver-config recall off` and `evolver-config auto-distill off` update them without opening a model turn.
Status reports the effective values and any invalid preferences; invalid/unreadable files pause both automatic
activities instead of silently enabling them. Explicit environment values win where the host preserves them.

Claude Code's options, editable from the `/config` menu, set the same things for its relay process:

Expand All @@ -42,7 +49,7 @@ Claude Code's options, editable from the `/config` menu, set the same things for

## Troubleshooting

State lives in `~/.evolver/state/` (WorkBuddy: its plugin data folder), every file named `<host>-<kind>`. The Hub sign-in is one for every host, as Evolver's identity home is: `~/.evolver/login/`.
State lives in `~/.evolver/state/` (WorkBuddy and MiniMax: their plugin data folders), every file named `<host>-<kind>`. The Hub sign-in is one for every host, as Evolver's identity home is: `~/.evolver/login/`.

- **Recall injects nothing.** Hub text recall usually takes 3–11 s and sometimes fails with a Hub 504, which the
Proxy relays as HTTP 400. The Hub judges each recalled asset's fit to the session's task and returns only those
Expand Down Expand Up @@ -126,7 +133,11 @@ The plugin never configures the verifier or manufactures receipts; the Proxy val
A correction while the model answers stops the post; a candidate is retried at
the next session start and given up after three failed tries, and one no model here can take waits a day for an
agent's Gene before it is dropped. A headless run carries `EVOLVER_HEADLESS=1`, which turns this plugin's hooks off
inside it. An agent with no model outside the conversation writes the Gene itself when asked.
inside it. MiniMax strips that variable, so a private marker in the runtime's empty scratch folder suppresses
re-entry too. Its candidate captures provider/model/variant from a read-only projection of native v2 session
metadata and checks the hook's model name; an unknown schema or mismatch never selects another provider.
The prepared CLI configuration is private to the run and removed after completion, error or cancellation.
An agent with no model outside the conversation writes the Gene itself when asked.

**MCP.** An agent without hooks (Kiro, openclaw, any MCP client) runs `bin/mcp.mjs <host>`, an stdio server with seven
tools: `evolver_recall` (a turn starts), `evolver_report` (it ends, with the checks the agent ran), `evolver_distill`
Expand Down Expand Up @@ -299,6 +310,7 @@ scripts/ pack.mjs, publish-tag.sh
```bash
npm ci
npm test
npm run test:minimax
npx -p typescript tsc -p .
npm run validate
```
Expand All @@ -309,6 +321,11 @@ update. `npm run validate` packs `dist/claude-code` and runs `claude plugin vali
version: bump `version` in a host's manifest with every change meant to reach its users, or the host reports the old
version as the latest.

Release CI runs the full suite on Linux and the MiniMax/packed-hook/shared-runtime suite on Windows, each
on Node 22 and 26. Both jobs must pass before publication. MiniMax tests use disposable native profiles and
local service fixtures; they do not require a developer's MiniMax account, Hub token or globally installed CLI.
The MiniMax suite runs up to four test files at once; its multi-process contention tests retain their own parallel workers.

## Open questions

- Whether `@evomap/evolver-core`'s terms allow redistributing a plugin that imports it.
Loading
Loading