Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/vercel/eve/llms.txt

Use this file to discover all available pages before exploring further.

A skill is a model-loadable procedure that the agent pulls into context on demand rather than carrying on every turn. eve advertises each skill’s description alongside the built-in load_skill tool. When a request matches a skill’s description — or the user names the skill outright — the model calls load_skill and eve appends that skill’s markdown to the active turn’s context. The full body never enters context until it is needed, which keeps the baseline prompt lean.

How loading works

eve scans agent/skills/ and exposes each skill’s description to the model. The description is a routing hint, not a label. Write it as the task that should trigger activation:
Use when the user needs a release checklist or changelog workflow.
When the model calls load_skill, eve appends the skill’s markdown to the active turn’s context. Loading a skill adds instructions only — it never creates a new execution surface. Tools remain visible whether or not a skill is loaded. If you need typed runtime behavior, use a tool instead.

Flat markdown skill

The smallest skill is a single markdown file. The name comes from the filename (without the extension):
agent/skills/forecast.md
Use the weather tool before answering forecast or temperature questions.
A flat markdown skill can omit the description frontmatter. When it does, eve advertises the first non-empty, non-code-fence line of the body with any leading #, >, *, or - marker stripped. If no such line exists, eve falls back to Instructions for the <name> skill. — a weak routing hint, so add explicit description frontmatter when you want reliable intent-based routing.

Packaged skill (directory with SKILL.md)

A packaged skill is a directory with a SKILL.md plus sibling files such as references/, assets/, and scripts/. The SKILL.md must carry description frontmatter — there is no filename slug to fall back on:
agent/skills/research/SKILL.md
---
description: Research unfamiliar topics before answering with confidence.
---

When the task is novel or ambiguous, gather evidence first, then answer with the
key facts and the remaining uncertainty.

TypeScript skill with defineSkill

When markdown alone cannot express what you need — typed values, generated content, or inline sibling files — author the skill in TypeScript with defineSkill from eve/skills:
agent/skills/research.ts
import { defineSkill } from "eve/skills";

export default defineSkill({
  description: "Research unfamiliar topics before answering with confidence.",
  markdown:
    "When the task is novel or ambiguous, gather evidence first, then answer with the key facts and the remaining uncertainty.",
  files: {
    "references/checklist.md": "# Checklist\n\n- Find primary sources.\n",
  },
});
eve generates SKILL.md from markdown, and each files entry becomes a package-relative sibling. Start with plain markdown and move to defineSkill only when you hit its limits.

Skills are scoped per agent

Skills are scoped to the agent that declares them. A subagent’s skills/ are invisible to the root agent, and the reverse holds too. There is no shared-skill mechanism — put shared executable helpers in lib/ instead.

Reading skill files at runtime

Loading a skill appends its SKILL.md to context. To reach a packaged skill’s sibling files (references, assets, scripts) from inside a tool or hook, use ctx.getSkill(id):
agent/tools/use_checklist.ts
import { defineTool } from "eve/tools";
import { z } from "zod";

export default defineTool({
  description: "Apply the research checklist to a topic.",
  inputSchema: z.object({ topic: z.string() }),
  async execute({ topic }, ctx) {
    const research = ctx.getSkill("research");
    const checklist = await research.file("references/checklist.md").text();
    // use checklist content...
    return { topic, checklist };
  },
});
The handle exposes the skill’s name and file(relativePath). File content is read lazily from the active sandbox.

Dynamic skills

To serve a different skill per principal, tenant, or channel — for example, each team’s own playbook — wrap defineSkill in a defineDynamic resolver keyed on ctx.session.auth:
agent/skills/playbook.ts
import { defineDynamic } from "eve/skills";
import { defineSkill } from "eve/skills";

export default defineDynamic(async (ctx) => {
  const team = ctx.session.auth.current?.principalId ?? "default";
  return defineSkill({
    description: "Load the team's deployment playbook.",
    markdown: `Follow the ${team} deployment procedure when shipping changes.`,
  });
});

Skills vs instructions

LoadedUse for
instructions.mdAlways on, every turnPermanent identity and standing rules
agent/skills/*On demand, when the model calls load_skillOptional procedures that should not bloat every turn
Keep instructions short and stable. Long or situational procedures belong in skills, where they only enter context when the request calls for them.

Build docs developers (and LLMs) love