Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add aayushmau5/eva --skill write-extension-localgit clone --depth 1 https://github.com/aayushmau5/evaWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/aayushmau5/eva/write-extension-local)<a href="https://agentmods.dev/skills/aayushmau5/eva/write-extension-local"><img src="https://agentmods.dev/badge/skills/aayushmau5/eva/write-extension-local.svg" alt="Measured on agentmods" height="20"></a>- NVIDIA SkillSpector pass
What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00055 | $0.03884 |
| Opus 5 | $0.00028 | $0.01942 |
| Sonnet 5 | $0.00011 | $0.00777 |
| Haiku 4.5 | $0.00006 | $0.00388 |
Grade A, and why
write-extension-local scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 7d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 399 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Writing a local Eva extension
Two ways to ship one, both running on the same machine as the session:
| script | one .exs file |
Eva compiles it into its own VM at session start |
| project | a Mix project | its own BEAM node on this machine, which Eva finds and dials |
Everything about the contract — setup/1, the %Spec{} fields, every callback, the API
— is identical in both. A project only differs in packaging: it has its own mix.exs and
dependencies, starts Eva.Core.Extension.Node from its application, and you start it
yourself. Reach for a project when the extension needs libraries of its own, or when one
file has stopped being enough. See Project extensions.
An extension that runs on another machine is also a project — see the
write-extension-remote skill for what changes there.
Where it goes (scripts)
~/.eva/extensions/<name>.exs for every project, or
<project>/.eva/extensions/<name>.exs for one. A directory works too, as
<name>/extension.exs, when the extension needs sibling files. The filename is the
extension's name — that name appears in diagnostics, namespaces its stored data, and is
how its own tools look up its process. A project file shadows a global one of the same name.
Project extensions need approving. ~/.eva/extensions loads automatically — the user
put it there. <project>/.eva/extensions does not: it is code from whoever wrote the
repository, running before the first prompt, so Eva skips the whole directory and says so
until the user approves it (Session.trust_extensions/1). Approval covers the directory's
contents as they were, so editing or adding an extension asks again. A path passed
explicitly with -e is always loaded — naming it is the consent.
The module name follows the filename. notes.exs must define
Eva.Extension.Notes, and every other module in the file goes under it
(Eva.Extension.Notes.Client). Module names are global on the BEAM, so this is what keeps
two extensions from redefining each other's helpers; anything outside the namespace fails
to compile, and a module under the wrong extension's namespace is refused at load.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 7d ago First seen · 399 lines · 55 tokens per session scan A c17967fc1a08
write-extension-local is a skill published in the GitHub repository aayushmau5/eva (5 stars, last pushed yesterday), licensed MIT. It adds 55 tokens to every session and 3,884 once invoked, about $0.0003 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.
Other skills, from other repositories
matlab
Build, review, migrate, and safely plan MATLAB or GNU Octave numerical workflows, including arrays, tabular/time data, tests, projects, graphics, MAT files, and explicit Python interoperability.
ast-grep
Guide for writing ast-grep rules to perform structural code search and analysis. Use when users need to search codebases using Abstract Syntax Tree (AST) patterns, find specific code structures, or perform complex code queries that go beyond simple text search. This skill should be used when users ask to search for…
platform-detection
Identify a .NET project's test platform, framework, command mode, and SDK-style vs classic project system. Use only for "which test platform/framework?", "VSTest or MTP?", or "what runner does this project use?", including bridge settings, UseVSTest opt-outs, and incompatible or conflicting VSTest/MTP configuration.…
unity-version-split
Split a C# file into Unity 6.5+ and pre-Unity 6.5 variants. Use when a file needs different implementations for different Unity versions due to API changes (e.g., EntityId vs int, GetEntityId vs GetInstanceID).
omh-rust
This is a Hermes-native rust workflow skill.
axiom-concurrency
Use when writing ANY async code, actors, threads, or seeing ANY concurrency error. Covers Swift 6 concurrency, @MainActor, Sendable, data races, async/await patterns.