Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Install an EvoNexus plugin from a git URL or uploaded archive. Use when the user asks to install a plugin, add a plugin, or mentions a plugin source URL (github:user/repo, https://..., or a ZIP/tar.gz upload). Triggers on phrases like "instala plugin", "install plugin X", "adicionar plugin", "quero instalar Y".
.claude/skills/evolution-foundation-plugin-install/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-07 | ✗→✓ | ▲ Improved | 36% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 88% | 0% |
| case-12 | ✗→✓ | ▲ Improved | -8% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 100% | 0% |
| case-18 | ✗→✓ | ▲ Improved | -37% | 0% |
Install an EvoNexus plugin through the /api/plugins/* endpoints. Plugins execute arbitrary code (agents, skills, shell hooks, SQL migrations) — always surface the preview and require explicit confirmation before running the install.
Ask for the plugin source if not provided. Accepted forms:
github:user/repo — default branchgithub:user/repo@v1.2.3 — specific tag or branchhttps://…/archive.tar.gz or https://…/archive.zip — HTTPS tarball / zip URL.zip / .tar.gz) — via the /plugins upload flowLocal filesystem paths (/abs/path, ./rel, ~/...) and non-HTTPS schemes (file://, ssh://, etc.) are rejected by the backend — do not try to work around that. If the user has a local checkout, tell them to push to a branch, create a release tag, or zip the plugin directory and upload it.
Use the EvoClient SDK (auto-resolves URL + Bearer auth):
pythonfrom dashboard.backend.sdk_client import evo preview = evo.post("/api/plugins/preview", {"source_url": "<URL>"})
Show the user, in this order:
env_vars_required. Must exist in .env.install.sql completo (expanded): full SQL. Runs in transaction against dashboard DB.hooks/pre-install.sh and hooks/post-install.sh.claude_hook_handlers/*.{py,sh}.Do not abbreviate. The user needs to read everything that will execute.
Accept only clear affirmatives ("sim", "confirmar", "pode instalar", "ok"). If the user hesitates or asks for changes, stop and answer — do not install.
pythonresult = evo.post("/api/plugins/install", { "source_url": "<URL>", "confirmed": True, })
On success ({"status":"active","id":"<slug>"}), summarise what the user now has: agents under .claude/agents/plugin-<slug>-*, heartbeats visible in /heartbeats, routines (scheduler reload on SIGHUP), widgets on Overview next page load.
If scheduler was offline and plugin has routines, backend returns routine_activation_pending=true — explain the user needs to start the scheduler.
HTTP 400 invalid_source_url — URL failed source whitelist. Reprompt.HTTP 400 schema_invalid — manifest rejected by Pydantic. Show validation error.HTTP 409 slug_conflict — plugin id already installed. Offer uninstall first or a different one.HTTP 409 install_in_progress — another install running. Retry or check /plugins UI.HTTP 500 migration_failed — SQL transaction rolled back. DB unchanged. Surface SQLite error.ADWs/logs/plugins/.confirmed=True without explicit user green light.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 8,056 | 3,379 | -58% | 1 | 1 | 0% | 1,286 | 1,265 | -2% | 0 | 0 | — |
case-02 | fail→fail | 7,971 | 3,284 | -59% | 1 | 1 | 0% | 1,377 | 1,277 | -7% | 0 | 0 | — |
case-03 | fail→fail | 6,803 | 3,843 | -44% | 1 | 1 | 0% | 1,224 | 1,270 | +4% | 0 | 0 | — |
case-04 | fail→fail | 10,825 | 7,836 | -28% | 1 | 1 | 0% | 1,895 | 2,196 | +16% | 0 | 0 | — |
case-05 | pass→pass | 10,965 | 7,606 | -31% | 1 | 1 | 0% | 2,054 | 2,146 | +4% | 0 | 0 | — |
case-06 | pass→pass | 11,817 | 6,807 | -42% | 1 | 1 | 0% | 2,099 | 2,081 | -1% | 0 | 0 | — |
case-07 | fail→pass | 6,977 | 3,912 | -44% | 1 | 1 | 0% | 1,137 | 1,551 | +36% | 0 | 0 | — |
case-08 | fail→pass | 4,876 | 2,648 | -46% | 1 | 1 | 0% | 699 | 1,311 | +88% | 0 | 0 | — |
case-09 | fail→fail | 4,740 | 6,436 | +36% | 1 | 1 | 0% | 827 | 1,266 | +53% | 0 | 0 | — |
case-10 | pass→pass | 10,082 | 3,868 | -62% | 1 | 1 | 0% | 1,756 | 1,542 | -12% | 0 | 0 | — |
case-11 | fail→fail | 11,783 | 3,426 | -71% | 1 | 1 | 0% | 1,928 | 1,452 | -25% | 0 | 0 | — |
case-12 | fail→pass | 9,900 | 3,757 | -62% | 1 | 1 | 0% | 1,644 | 1,505 | -8% | 0 | 0 | — |
case-13 | fail→pass | 4,684 | 3,255 | -31% | 1 | 1 | 0% | 712 | 1,427 | +100% | 0 | 0 | — |
case-14 | pass→pass | 8,439 | 11,509 | +36% | 1 | 1 | 0% | 1,304 | 2,767 | +112% | 0 | 0 | — |
case-15 | fail→fail | 3,396 | 9,138 | +169% | 1 | 1 | 0% | 558 | 1,589 | +185% | 0 | 0 | — |
case-16 | pass→pass | 11,200 | 3,117 | -72% | 1 | 1 | 0% | 2,135 | 1,392 | -35% | 0 | 0 | — |
case-17 | pass→pass | 9,913 | 4,864 | -51% | 1 | 1 | 0% | 1,607 | 1,527 | -5% | 0 | 0 | — |
case-18 | fail→pass | 12,411 | 2,545 | -79% | 1 | 1 | 0% | 1,976 | 1,238 | -37% | 0 | 0 | — |
case-19 | fail→pass | 5,683 | 2,817 | -50% | 1 | 1 | 0% | 900 | 1,316 | +46% | 0 | 0 | — |
case-20 | fail→pass | 12,997 | 2,773 | -79% | 1 | 1 | 0% | 2,093 | 1,347 | -36% | 0 | 0 | — |
case-21 | pass→pass | 5,554 | 2,479 | -55% | 1 | 1 | 0% | 828 | 1,149 | +39% | 0 | 0 | — |
case-22 | fail→pass | 8,865 | 1,592 | -82% | 1 | 1 | 0% | 1,609 | 1,141 | -29% | 0 | 0 | — |
case-23 | pass→pass | 9,067 | 2,248 | -75% | 1 | 1 | 0% | 1,353 | 1,253 | -7% | 0 | 0 | — |
case-24 | fail→fail | 8,853 | 3,055 | -65% | 1 | 1 | 0% | 1,442 | 1,398 | -3% | 0 | 0 | — |
case-25 | fail→pass | 6,766 | 1,310 | -81% | 1 | 1 | 0% | 1,071 | 1,047 | -2% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 25 cases were attempted, and 23 counted toward the lift figure. The other 2 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +36 percentage points is the difference between those two pass rates over the 23 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.