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 agentmods add skills/blevene/aenv/aenvnpx skills add Blevene/aenv --skill aenvgit clone --depth 1 https://github.com/Blevene/aenvWhat 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 | $0.00176 | $0.04032 |
| Opus 5 | $0.00088 | $0.02016 |
| Sonnet 5 | $0.00035 | $0.00806 |
| Haiku 4.5 | $0.00018 | $0.00403 |
Grade C, and why
aenv scanned grade C with 1 finding 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 yesterday.
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.
Recursive force deletehighDestructive command
rm -rf with a variable or a broad path is one typo away from removing the wrong tree.
- `rm -rf ~/.aenv/envs/<ns>/` — manual, not aenv. Ask before running. How it starts
The opening of the file, as written. The whole thing — 120 lines — stays where its author put it; the contents beside it link to each section on GitHub.
aenv
aenv is a CLI that manages named bundles of AI-coding-harness configuration (CLAUDE.md, .cursorrules, .mcp.json, skills, agents, etc.) — pin a project to a namespace, activate it, and the bundle materializes into the project as symlinks. Deactivate restores the project to its pre-activation state byte-for-byte.
Mental model in three sentences
Namespaces live at ~/.aenv/envs/<name>/ and own a manifest (aenv.toml) plus the actual files. A project gets pinned to a namespace via a one-line .aenv file at its root; aenv activate reads the pin, walks the extends chain, and materializes the resolved bundle. State lives in .aenv-state/state.json and the displaced originals (if any) sit in .aenv-state/backup/<timestamp>/ until aenv deactivate puts them back.
Two scopes: project vs global
aenv works at two scopes, and the verb prefix tells them apart:
- Project scope (
aenv <verb>) — materializes a namespace's project files into a pinned project directory (the section above). State under<project>/.aenv-state/. - Global scope (
aenv global <verb>) — materializes a namespace's user-scope files (declared asuser_files) into$HOME(~/.claude/,~/.codex/, …). One global activation lives per user; activating another swaps it in a single transaction. State at~/.aenv/global-state.json, displaced originals stashed under~/.aenv/global-stash/<ts>/. This is how you swap your whole Claude Code / Codex setup. See the Global profiles section below.
User request → command map
| User wants… | Run this |
|---|---|
| Set up a new namespace from scratch | aenv create <name> --adapter claude-code (also creates an empty CLAUDE.md; user edits it) |
| Build on top of an existing namespace | aenv create <name> --extends <parent> (composition; child overrides win section-by-section) |
| Capture a hand-shaped project as a reusable namespace | aenv snapshot <name> from inside the project |
| Pin + activate in a project | aenv use <name> then aenv activate. (Avoid aenv activate <name> without use first — it activates without writing a .aenv pin, leaving the project in a half-state where aenv status works but no future invocation knows what namespace was intended.) |
| Switch active namespace in a project | aenv deactivate && aenv use <other> && aenv activate |
| Restore project to pre-aenv state | aenv deactivate (then aenv unpin if they want the .aenv pin file gone too) |
| Add a skill they wrote themselves | aenv skill new <skill-name> --ns <namespace> |
| Install a skill from a public GitHub repo | aenv skill import git+<url> --ns <ns> --pin <ref> [--path <subdir>] — see "Pin selection" below |
| Install MANY skills from a monorepo at once | aenv skill import-all git+<url> --ns <ns> --base <dir> --pin <ref> [--only a,b] — clones once, imports every <base>/<subdir>/SKILL.md; malformed skills are warned + skipped, re-runs are idempotent |
| Copy non-skill content (agents, commands, reference docs) from a repo | aenv vendor git+<url> --ns <ns> --pin <ref> --path <subtree> --as <dest> — copies into the namespace tree, declares it under the adapter's files, records [[vendored]] provenance. --force to overwrite, re-run to refresh + report drift |
| Remove a skill | aenv skill remove <skill-name> --ns <ns> |
| Reclaim cache space (orphaned skill clones) | aenv cache prune |
| See what's active in the current project | aenv status |
| See where a managed file came from | aenv which <project-relative-path> |
| Show the resolution chain + parameters + policies | aenv status (text) or aenv status --json (structured) |
| Compare two namespaces | aenv diff <ns_a> <ns_b> |
| Detect drift between project and active namespace | aenv diff (no args; runs against active) |
| Bump a pinned skill ref | edit ~/.aenv/envs/<ns>/aenv.toml, change ref = line, then re-activate in any project using the namespace |
| Auto-activate on cd between projects | aenv init-shell <bash|zsh|fish> printed once into the user's rc file |
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.
- yesterday First seen · 120 lines · 0 tokens per session scan C dc79b6372382
aenv is a skill published in the GitHub repository Blevene/aenv (2 stars, last pushed 2mo ago), licensed MIT. It adds 176 tokens to every session and 4,032 once invoked, about $0.0009 per session on Opus 5. A static security scan graded it C with 1 finding (recursive force delete). No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.
Other skills, from other repositories
lov-app-generator
Use when the user asks for "App生成器", "生成 Web App", "生成 Tauri App", "生成原生 macOS App", "Finder Quick Action", "只创建 web", or to standardize an existing app with branding, CI/CD, native integration, and Lovinsp where applicable.
lov-maintain-partners
Maintain the Skill Publisher website's partners section AND align partner logo rows on event posters / hero strips: reuse lov-find-logo for brand logo discovery, normalize collected logos to a 240px-tall content canvas (retina-ready), rasterize SVGs via rsvg-convert before normalizing (so SVG viewBox padding gets…
dsh-plugin-publisher
Publish a validated DSH plugin package (@deepseek-ai/dsh- or @lovstudio/dsh-) to npm, git, or tarball channels and verify it loads in the DeepSeek Harness. Use when the user asks to publish, release, or ship a plugin. 触发:发布插件 / 上架插件 / release dsh 插件。.
lov-china-website-filing
面向中国大陆网站的一站式备案与上线 Skill Kit:当用户说“办 ICP 备案”“做公安联网备案”“备案后绑定域名”或 "handle China website filing" 时,按权威页面完成材料、审核、域名切换、合规展示与巡检留痕。.
deep-research
Use when the user needs multi-source research with citation tracking, evidence persistence, structured report generation, or an implementation landscape that includes GitHub and other open-source forges. Triggers on "deep research", "comprehensive analysis", "research report", "compare X vs Y", "analyze trends"…
lov-env-management
统一管理平台、账号与多组 API Key,维护有效期和启用状态,安全同步到 zsh 或用户会话环境,并提供脱敏 Dashboard;用户说“管理环境变量”“rotate API keys”时使用。.