Eve agent
A filesystem contract (.workflow/meta.json) + 37 agent skills that take a product from idea to production: web (Next.js 16) & mobile (Expo/RN), plus an eve agent engine and Linear/scrum. Runs on Claude Code, Codex, Copilot, Gemini, Cursor.
npx -y skills add lukedj78/dev-flow --skill eve-agentAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 4 stars4 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Scaffold and manage an eve agent (Vercel's filesystem-first agent framework) inside a monorepo, as the engine behind a Next.js app. Use this skill whenever the user wants to create, set up, or initialize an eve agent; add a tool, skill, channel, connection, schedule, subagent, or hook to an eve agent; wire a Next.js (or any) frontend to consume an eve agent; or evolve the `apps/agent` part of a project. Trigger this for ANY mention of "eve", "the agent engine", "agent tools", "agent backend", or building the agentic core of an app — even if the user does not say the word "skill". This is the eve counterpart to dev-flow's Next.js skills (design-md-to-app / module-add); use it for the agent the same way you'd use those for the web app. Not for: building the Next.js app itself or its pages/forms (use design-md-to-app / screenshot-to-page / module-add), scaffolding the monorepo (use monorepo-bootstrap), or React Native (eve is a server-side engine, not an RN concern).
SKILL.md
19.5 KB, as published. Nobody here has run it
eve-agent
Scaffold and manage an eve agent — Vercel's filesystem-first agent framework, built on the open-source Workflow SDK — as the engine of a product. This skill is part of the dev-flow family and shares the same .workflow/ filesystem contract. Where dev-flow's design-md-to-app builds the Next.js app, this skill builds and grows the apps/agent (eve) that the app uses as its engine.
The one rule that matters most
Never guess the eve API. The source of truth is the bundled docs. Once eve is installed, its full documentation lives at node_modules/eve/docs/, and the live docs are at https://eve.dev/docs. Read the relevant doc there and run npx eve --help (or eve info) BEFORE scaffolding or before adding any capability. (Vercel's own official eve skill — npx skills add vercel/eve --skill eve — consists of exactly this rule and nothing else: read node_modules/eve/docs/README.md first.) eve is young and its surface can change between versions; this skill encodes the workflow and conventions, not a frozen copy of the API. If anything in this skill disagrees with the installed docs, the installed docs win.
references/eve-conventions.md carries the cross-cutting rules that apply to every mode — the per-capability import map, identity-by-path, the durability/idempotency contract, the security model, fail-closed auth, and deploy/monorepo wiring. Read it before scaffolding or adding a capability.
The second rule: eve runs every turn as a durable workflow, and an interrupted step re-runs on resume. So any tool with a non-idempotent side effect (payment, delete, email, external write) MUST be made idempotent or approval-gated (approval: always()/once() from eve/tools/approval). eve's defaults are permissive — do not rely on model behavior to prevent sensitive or irreversible actions.
Where the agent lives (two layouts — pick one)
The agent is the engine; the web app consumes it through eve's official Next.js integration — the withEve() wrapper mounts eve's routes same-origin and the useEveAgent() hook drives a session from the browser (see references/eve-web-integration.md). The web app never imports the agent's internals as a library, and never hand-rolls the HTTP/NDJSON plumbing that eve already provides. That boundary is the same in both layouts below.
A — Embedded single-app (simplest; one deploy). The eve agent and the Next.js app live in one project, agent/ and app/ as sibling folders at the root. withEve(nextConfig) with the default eveRoot mounts the agent into the same Next process — one vercel deploy, no cross-package types, no workspace wiring. This is the layout of Vercel's own roprgm/worldcup-eve reference and of dev-flow's Studio. Prefer it when the agent exists only to power this one app.
<project-root>/
├─ .workflow/ # dev-flow metadata (if a dev-flow project)
├─ agent/ # eve agent — tools/, instructions.md, channels/, schedules/, hooks/, sandbox.ts, lib/
├─ app/ # Next.js App Router — the product UI
├─ components/ # incl. the widget renderers the agent's output drives
├─ lib/ # domain logic shared by BOTH agent tools and web routes
└─ next.config.ts # withEve(nextConfig)
Here packages/types doesn't exist — the app imports eve's types directly (eve/react, eve/client), and one lib/ is shared by tool execute and web code alike. Skip every monorepo/packages/types step below.
B — Monorepo (Turborepo + pnpm). Separate apps/web + apps/agent, with a shared packages/types. Prefer it when the agent is independently deployable, serves more than one surface, or the repo is already a monorepo.
<project-root>/
├─ .workflow/ # dev-flow planning/design metadata (meta.json is the source of truth)
├─ apps/
│ ├─ web/ # Next.js app — the product (built by design-md-to-app)
│ └─ agent/ # eve agent — the engine (built by THIS skill)
└─ packages/
└─ types/ # re-exports eve's session/event types so web + agent share one contract
The EVE_NEXT_PRODUCTION_ORIGIN env var (see references/eve-web-integration.md) lets even layout A's agent deploy separately later without touching client code — so starting embedded is not a one-way door. The rest of this skill is written for layout B (the fuller case); when you're in layout A, read apps/agent/ as the root agent/, drop the pnpm --filter agent prefix, and skip the packages/types wiring.
Which layout? Count the consumers (ask before scaffolding)
The deciding factor is how many clients consume the agent, not aesthetics. withEve() embeds the agent in the Next runtime and gives same-origin access only to that web app's browser. A React Native / mobile client is always cross-origin — there is no same-origin in a native app; every call hits a remote host. So the moment a second consumer exists, embedding the agent in the web app makes that client inherit the web's deploy, uptime, and scaling (the web becomes the mobile's server), plus hand-managed CORS/auth. An agent with ≥2 consumers is a service, and belongs in its own independently-deployable apps/agent (layout B), with packages/types single-sourcing the eve contract that both apps/web and apps/mobile import.
Decide like this — and when the signal is ambiguous, ask the user, do not assume:
| Signal (in this order) | Layout |
|---|---|
.workflow/meta.json#stack.framework == "monorepo", or an apps/mobile / apps/* web already exists | B — monorepo already serves web + mobile; add the agent as apps/agent. No need to ask. |
Framework is a single next app AND the user confirms the agent serves only this app | A — embedded single-app |
Single next app but mobile/RN, a 2nd web, or external services are planned | B — start monorepo now; migrating later (EVE_NEXT_PRODUCTION_ORIGIN) is possible but avoidable |
No .workflow/, or intent unclear | Ask: "Will this eve agent serve only this Next.js app, or also a mobile/React Native app (or other clients)? One consumer → embedded single-app; more than one → monorepo with the agent as its own deployable app." |
A mobile client consumes the agent over plain HTTP — useEveAgent({ host, auth }) pointed at the agent's origin, or the eve/client typed client — never through withEve() (that wrapper is Next-only). Same durable HTTP contract, different transport; see references/eve-web-integration.md. [VERIFY] RN client specifics against the installed eve version.
The eve project layout (verify against the docs)
A scaffolded eve app (apps/agent) looks like this — confirm against node_modules/eve/docs/:
apps/agent/
├─ agent/
│ ├─ agent.ts # model & runtime config (root-only)
│ ├─ instructions.md # system prompt (required for the root agent)
│ ├─ instrumentation.ts # OpenTelemetry config (root-only, optional)
│ ├─ tools/ # one file per tool, auto-registered by filename
│ ├─ skills/ # on-demand procedures (.md)
│ ├─ channels/ # entrypoints; the default HTTP channel is channels/eve.ts
│ ├─ connections/ # auth for external services
│ ├─ schedules/ # cron-style triggers
│ ├─ subagents/ # specialist child agents
│ ├─ hooks/ # lifecycle subscribers
│ ├─ sandbox/ # sandbox config
│ └─ lib/ # shared helper code
├─ evals/ # eval cases — SIBLING of agent/, NOT inside it
└─ .eve/ # build artifacts (generated by `eve build`)
Read state first, then pick a mode
- If
.workflow/meta.jsonexists, read it. Checkstack.agent. (If there is no.workflow/, this is not a dev-flow project — still proceed, just skip the meta.json updates and tell the user.) - Run
python scripts/check_eve_state.py <project-root>to detect whether the agent is already scaffolded and what capabilities exist. - Choose the mode:
stack.agentunset / noapps/agent→ Scaffold mode (set the agent up once).- agent already present → Capability mode (add a tool / skill / channel / connection / schedule / subagent / hook / eval, idempotently).
- In Scaffold mode, resolve the layout first using the Which layout? table above — check
stack.framework/ existingapps/*, and ask the user about other consumers (mobile/RN, a 2nd web, external services) when it's ambiguous before creating any files. The layout (embedded A vs monorepo B) changes where the agent goes and whetherpackages/typesis wired, so it must be settled before scaffolding, not after.
Do exactly one logical operation per invocation, then stop. Like module-add, this skill is idempotent: re-running an add that already exists detects it and skips.
Scaffold mode
Goal: a running eve agent at apps/agent, wired into the monorepo, exposing its HTTP API, with a baseline eval, and a shared types package the web app re-exports.
Follow references/eve-scaffold.md for the full procedure. In short:
- Read
node_modules/eve/docs/(install eve first if needed) and runeve info/npx eve --helpto confirm the current init flow and folder layout. - Initialize the agent inside
apps/agent(npx eve@latest init apps/agent, oreve init .from within it). Keep the default HTTP channel (agent/channels/eve.ts) — that is what the web app consumes. The Next.js app provides the UI viauseEveAgent(), so you do not need eve's own starter chat UI. - Pin the model in
agent/agent.ts(the eve scaffold default isanthropic/claude-sonnet-5via the Vercel AI Gateway; the model can also bedefineDynamicwith afallback) and write a realagent/instructions.md. Document the model choice in a comment. For an OpenAI/Gemini model you can also opt into an AI Gateway service tier (priority/flex/default) to tune latency vs. cost — seereferences/eve-scaffold.md§3. - Set the channel auth in
agent/channels/eve.ts:localDev()for development, a real authenticator (vercelOidc()/jwtHmac()/httpBasic()) for production. eve fails closed in prod — browser traffic is rejected unless an authenticator accepts it. - Add at least one baseline eval in
evals/(sibling ofagent/) soeve evalhas a gate to enforce in CI. - Wire
apps/agentinto the pnpm workspace andturbo.jsonpipelines (dev,build,lint,typecheck, plus anevaltask that runseve eval). - Create / update
packages/typesso it re-exports eve's session request + stream-event types — do not hand-roll a parallel contract (seereferences/eve-web-integration.md). Ifpackages/typesdoesn't exist yet, don't assume it — create it first viamonorepo-add-shared-package, then populate it. - Verify:
eve inforesolves the app,pnpm --filter agent lint typecheck buildandeve evalexit 0, and a real HTTP round-trip returns a non-empty response. Document the exact commands you used. - Update
.workflow/meta.json: setstack.agent = "eve"and append ahistoryentry ({ "skill": "eve-agent", "action": "scaffold", "ran_at": "<ISO8601>" }).
Capability mode
Goal: add ONE capability to an existing agent, following eve's filesystem conventions. Follow references/eve-capabilities.md. The capability types:
- Tool → a single file in
agent/tools/<name>.tsusingdefineToolfromeve/tools. The filename becomes the tool name; eve auto-registers it. No manual registration, no orchestration graph. This is the eve analogue of "add a feature" — exactly what an autonomous loop is good at. - Skill → an on-demand procedure in
agent/skills/<name>.md. - Channel → a new entrypoint via
eve channels add web|slackunderagent/channels/. - Schedule → a cron-style trigger under
agent/schedules/<name>(root-only;defineSchedulefromeve/schedules). - Connection → MCP or OpenAPI access under
agent/connections/<service>(defineMcpClientConnection/defineOpenAPIConnectionfromeve/connections). - Subagent → a local child agent dir
agent/subagents/<name>/agent.ts(mirrorsagent/; no channels/schedules), or a remote one viadefineRemoteAgentfromeve. There is nodefineSubagent. - Hook → a lifecycle subscriber under
agent/hooks/<name>(defineHookfromeve/hooks). - Extension → install a capability package (tools/connections/skills/instructions/hooks bundled, versioned like a dependency) by adding
agent/extensions/<name>.ts(import x from "@pkg"; export default x({ …config })), or author one withnpx eve extension init. The filename namespaces its tools (x__toolname); tune withdisableTool()/toolResultFrom. New in eve (2026-07); the package route complementseve-registry-porting(which vendors source instead). Seereferences/eve-capabilities.md. - Eval → a new case in
evals/so the quality gate covers the new capability.
For each: read the matching section of node_modules/eve/docs/ first, add the single file following the existing house style in apps/agent, add/extend an eval that exercises it, run the verification gate, then update meta.json history ({ "skill": "eve-agent", "action": "add-<type>", "inputs": { "name": "<name>" } }).
Ecosystem-first — don't reinvent. Before authoring a channel, connection, or extension by hand, check the eve integrations directory (https://eve.dev/integrations): 11+ prebuilt channels, 50+ MCP/OpenAPI connections (Stripe, Supabase, Notion, Linear, Sentry, PostHog, Vercel, PlanetScale, Airtable, Zapier…), and official extensions (GitHub Tools, Browserbase, Browser Use, KERNEL, Jetty). Adopt an official/prebuilt one over hand-rolling — see references/eve-capabilities.md (Connection / Channel / Extension).
Multi-tenant SaaS agent? Before adding any tool, schedule, connection, or memory that touches tenant data, read references/eve-patterns.md. Tenant auth, per-tenant approvals, tenant-scoped long-term memory, and dynamic scheduling are composed recipes with one non-negotiable rule — derive tenant/user from ctx.session.auth, never from model input — not ad-hoc code. This is the same tenant-safety backbone eve-registry-porting enforces when porting.
Definition of Done (every mode)
A run is complete only when these pass with exit code 0:
pnpm --filter agent lint typecheck build
pnpm --filter agent eval # runs `eve eval`
…plus, for scaffold/web-integration work, a real HTTP round-trip to the agent returns a non-empty response (e.g. eve dev --no-ui, then POST /eve/v1/session and read GET /eve/v1/session/:sessionId/stream). If you cannot verify with a command, the task is under-specified — stop and say so rather than guessing.
How this composes with the loop and with dev-flow
- dev-flow owns the web app, this skill owns the agent. They meet at
packages/types(re-exported eve types) and at thewithEve()proxy inapps/web. - In an autonomous Claude Code loop (Linear → Claude Code → PR), a Linear issue like "give the agent a tool to do X" maps cleanly to "create
agent/tools/x.ts" — let the loop invoke this skill in Capability mode. Linear stays the orchestrator; do not let dev-flow'smeta.jsonphase machine drive the loop. - Deployment is Vercel-native:
eve linkpulls AI Gateway credentials,eve deployships the agent to Vercel. The agent's model calls bill through the Vercel AI Gateway, separate from any Claude Code subscription used to build it.
Reference files
references/eve-conventions.md— cross-cutting rules: import map, identity-by-path, durability/idempotency, security model, fail-closed auth, sandbox-backend choice (just-bash vs VM), deploy/monorepo wiring, built-in tools.references/eve-scaffold.md— full scaffold procedure + monorepo wiring + per-session token limits.references/eve-capabilities.md— adding tools / skills / channels / connections / schedules / subagents / hooks (incl. the external observability-sink hook pattern).references/eve-web-integration.md— the officialwithEve()+useEveAgent()integration, the shared types package, the widget protocol (rich UI from agent output), theprepareSend→clientContext→defineDynamicbridge, and resumable chats from a persisted event log.references/eve-patterns.md— the composed multi-tenant & dynamic recipes: tenant auth (AuthFnstampstenantIdon the principal), per-tenant approvals (policy gate ≠ authorization), tenant-scoped long-term memory (auth +defineDynamiconturn.started+ tools + external store), and dynamic scheduling (dispatcher + CRUD tools + atomic-lease store, at-least-once). The through-line: identity fromctx.session.auth, never the model. Read it for any multi-tenant SaaS agent.references/eve-evals.md— the full evals API: cases + driver (t.send/start/reply/events), the complete assertion set + matchers (eve/evals/expect), the LLM judge (t.judge.autoevals, model resolution,.gate/.soft/.atLeast), targets (t.target.fetch/dispatchSchedule/attachSession, remote auth), reporters (Console/JUnit/Braintrust), and everyeve evalflag + exit code + the CI gate.references/eve-concepts.md— the cross-cutting concepts:agent.tsconfig (model/reasoning/compaction/limits/experimental.workflow.world), instructions (static vs dynamic), context control, the default harness (built-in tools + override/disable), the sandbox (backends/seeding/network-policy/credential-brokering), the execution model & durability (session→turn→step, at-least-once), sessions/runs/streaming (the NDJSON event types + endpoints), human-in-the-loop,defineState, dynamic capabilities (defineDynamicfor model/tools/skills/instructions), dynamic workflows (experimental_workflow), and the deployer's responsible-use obligations.references/eve-docs-coverage.md— a map of every eve docs page → where this skill covers it (keep it in sync when eve adds pages; the intentionally out-of-scope pages are the non-Next frontends and the raw TS-API/tutorials).
Bundled scripts
scripts/check_eve_state.py <project-root>— reports whether the agent is scaffolded, lists existing tools/skills/channels/connections/schedules/subagents/hooks/evals, readsmeta.json#stack.agent, and proposes the next step. Run it first.