{"$schema":"https://ui.shadcn.com/schema/registry.json","name":"evex","homepage":"https://evex.sh","items":[{"name":"brand-visual-asset-generator","type":"registry:item","title":"Brand Visual Asset Generator","description":"Generate brand-aligned SVG asset packs for SaaS products using Context.dev brand extraction and a Quiver Arrow SVG tool.","author":"TommyBez","categories":["marketing"],"dependencies":["ai@^7.0.11","eve@^0.18.2","zod@4.4.3"],"meta":{"slug":"brand-visual-asset-generator","category":"marketing","createdAt":"2026-07-01T21:16:30.433Z","updatedAt":"2026-07-04T00:00:00.000Z","docs":{"overview":["Brand Visual Asset Generator is an on-demand eve agent that turns a company domain, product description, or explicit brand profile into a coherent pack of editable SVG assets: icons, empty states, hero illustrations, badges, feature graphics, onboarding visuals, changelog art, and dashboard or modal graphics. You talk to it in your eve chat client, name the assets you want, and it returns real SVG markup ready to drop into a product or landing page.","Under the hood it combines two services. A Context.dev MCP connection resolves the brand facts first: name, description, colors, logos, homepage copy, and styleguide cues for a domain. Then a generate_svg_with_arrow tool calls the quiverai/arrow-1.1 image model through Vercel AI Gateway once per asset brief, validates that the response is safe SVG with a viewBox, rescales it to the requested dimensions, and normalizes icons to currentColor strokes so they theme automatically.","What makes it useful is pack coherence and honesty. A bundled brand-visual-assets skill enforces a six-step workflow with a scorecard: every asset must share palette, stroke language, and illustration metaphors, and anything scoring 8 or below gets regenerated with a tighter brief. If Context.dev or AI Gateway credentials fail, the agent stops and reports the error instead of fabricating brand facts or hand-writing replacement SVGs."],"howItWorks":["You send a request in chat, such as a feature launch pack for linear.app; if no website, product description, or brand profile is given, the agent asks for one before doing any generation work.","The agent calls the context-dev MCP connection (search_docs and execute against the hosted Context.dev server) to retrieve brand data, homepage markdown, and styleguide details, authenticating with your CONTEXT_DEV_API_KEY via the x-context-dev-api-key header.","The brand-visual-assets skill scopes the pack, falling back to a default asset list if you did not name specific types, then locks a brand profile with primary and secondary hex colors, tone adjectives, and up to four reference images such as Context.dev logo or screenshot URLs.","For each asset it writes a self-contained brief and calls generate_svg_with_arrow once, which prompts quiverai/arrow-1.1 through Vercel AI Gateway, rejects output lacking a viewBox or containing scripts and raster content, fits the artwork to your requested dimensions, and adds title and desc elements for accessibility.","The agent scores every generated asset against the skill's quality-bar, consistency, and visual-taste references, then regenerates any asset scoring 8 or below on the scorecard with a tighter brief.","The final reply contains a brand brief with source URLs, an asset pack manifest with filenames and purposes, one fenced svg block per asset, usage notes for theming and placement, and an assumptions section when choices were inferred. Two bundled evals verify the ask-first and no-fabrication behaviors."],"useCases":[{"title":"Feature launch pack from a domain","body":"Point the agent at your marketing site and request a hero illustration, feature icons, a new-feature badge, and an onboarding visual. Context.dev extracts your palette and logos so every asset lands on brand without manual specs."},{"title":"Empty states for a pre-launch product","body":"No public website yet? Provide a product description, a primary hex color, and tone adjectives, and the agent generates empty-state and modal illustrations directly from that explicit brand profile, listing its assumptions alongside the SVGs."},{"title":"Themeable icon sets for a design system","body":"Request feature, navigation, or status icons and get SVGs normalized to currentColor strokes with fill none, a 1.8 stroke width, and rounded caps, so the icons inherit text color and work in light and dark themes."},{"title":"Changelog and release visuals on demand","body":"Generate consistent changelog art or dashboard graphics for each release. Because the skill enforces shared palette and stroke language across the pack, week-over-week visuals stay coherent instead of drifting in style."}],"requirements":[{"name":"CONTEXT_DEV_API_KEY","body":"Context.dev API key used by the MCP connection for brand, webpage, and styleguide extraction; sent only from the eve runtime as the x-context-dev-api-key header. Create one in your Context.dev account. CONTEXT_API_KEY is accepted as a fallback name."},{"name":"AI_GATEWAY_API_KEY","body":"Vercel AI Gateway key (vck_ prefix) that lets generate_svg_with_arrow call the quiverai/arrow-1.1 image model. Create it in your Vercel AI Gateway project and make sure that model is enabled there."},{"name":"VERCEL_OIDC_TOKEN","body":"Alternative AI Gateway credential. On Vercel deployments it is provided automatically; locally you can pull one with the Vercel CLI. Set either this or AI_GATEWAY_API_KEY, not necessarily both."},{"name":"eve, ai, zod","body":"Runtime dependencies installed with the registry item: the eve framework (^0.18.2), the ai SDK (^7.0.11) for generateImage, and zod 4.4.3 for tool input validation. Node.js 24 or newer is required."}],"faqs":[{"question":"How do I install and run this agent?","answer":"Run npx shadcn@latest add @evex/brand-visual-asset-generator in your eve app, copy .env.example into your environment with the Context.dev and AI Gateway credentials filled in, then start the app with pnpm dev and ask for a visual pack in chat."},{"question":"Which models does it use?","answer":"The root orchestrator runs on deepseek/deepseek-v4-pro, and SVG generation uses quiverai/arrow-1.1 called through Vercel AI Gateway's image-generation endpoint. Your deployment needs access to both providers; the agent never asks a language model to draw the SVGs itself."},{"question":"Can I customize the assets it produces?","answer":"Yes. Name the exact asset types, dimensions, colors, and tone in your request, or let the skill fall back to its default pack. You can also pass up to four reference images per asset for style, palette, composition, or typography direction, stating what to preserve and what to change."},{"question":"Does it work without a company website?","answer":"Yes. Instead of a domain, give a product description or an explicit brand profile such as a primary hex color, audience, and tone adjectives. The agent skips Context.dev extraction only when you supply the brand facts, and it records inferred choices in an assumptions section."},{"question":"What are the known limits and failure modes?","answer":"Arrow 1.1 accepts at most four reference images and about 6000 output tokens per asset. Context.dev can return 408 or 429 on cold starts and rate limits, so retry or reduce concurrency. On missing credentials or model errors the agent stops and reports the failure rather than fabricating output."}]}},"files":[{"path":"agent/agent.ts","type":"registry:file","target":"~/agent/agent.ts"},{"path":"agent/connections/context-dev.ts","type":"registry:file","target":"~/agent/connections/context-dev.ts"},{"path":"agent/instructions.md","type":"registry:file","target":"~/agent/instructions.md"},{"path":"agent/skills/brand-visual-assets/references/brief-template.md","type":"registry:file","target":"~/agent/skills/brand-visual-assets/references/brief-template.md"},{"path":"agent/skills/brand-visual-assets/references/consistency.md","type":"registry:file","target":"~/agent/skills/brand-visual-assets/references/consistency.md"},{"path":"agent/skills/brand-visual-assets/references/default-pack.md","type":"registry:file","target":"~/agent/skills/brand-visual-assets/references/default-pack.md"},{"path":"agent/skills/brand-visual-assets/references/quality-bar.md","type":"registry:file","target":"~/agent/skills/brand-visual-assets/references/quality-bar.md"},{"path":"agent/skills/brand-visual-assets/references/scorecard.md","type":"registry:file","target":"~/agent/skills/brand-visual-assets/references/scorecard.md"},{"path":"agent/skills/brand-visual-assets/references/visual-taste.md","type":"registry:file","target":"~/agent/skills/brand-visual-assets/references/visual-taste.md"},{"path":"agent/skills/brand-visual-assets/SKILL.md","type":"registry:file","target":"~/agent/skills/brand-visual-assets/SKILL.md"},{"path":"agent/tools/generate_svg_with_arrow.ts","type":"registry:file","target":"~/agent/tools/generate_svg_with_arrow.ts"},{"path":"evals/evals.config.ts","type":"registry:file","target":"~/evals/evals.config.ts"},{"path":"evals/generation-failure-no-fabrication.eval.ts","type":"registry:file","target":"~/evals/generation-failure-no-fabrication.eval.ts"},{"path":"evals/missing-context-asks.eval.ts","type":"registry:file","target":"~/evals/missing-context-asks.eval.ts"},{"path":"README.md","type":"registry:file","target":"~/agent/README.md"},{"path":".env.example","type":"registry:file","target":"~/.env.example"}]},{"name":"branded-seo-page-builder","type":"registry:item","title":"Branded SEO Page Builder","description":"Generate an on-brand, SEO-optimized HTML page from a domain using Context.dev brand, content, and styleguide data.","author":"TommyBez","categories":["marketing"],"dependencies":["eve@^0.18.2"],"meta":{"slug":"branded-seo-page-builder","category":"marketing","createdAt":"2026-06-27T07:44:00.000Z","updatedAt":"2026-07-04T00:00:00.000Z","docs":{"overview":["Branded SEO Page Builder is an eve agent that turns a bare domain into one complete, SEO-optimized HTML page. You interact with it in chat: ask for a page from a domain such as linear.app, or point it at a specific source URL and a target topic, and it returns a full static document with metadata, Open Graph and Twitter card tags, semantic sections, and JSON-LD structured data.","What makes it useful is grounding. The agent connects to Context.dev's hosted MCP server at context-dev.stlmcp.com to resolve real brand data for the domain: company name, description, colors, logos, industry labels, homepage content as markdown, and optional styleguide signals like typography and spacing. Every user-facing claim in the generated page comes from that data or your explicit request, never invented statistics, testimonials, or pricing.","Two vendored skills shape the output. The seo-audit skill enforces on-page fundamentals such as one h1, canonical tags, descriptive alt text, and intent-matched schema types, while the ai-seo skill structures copy into extractable answer blocks and FAQ sections so answer engines like ChatGPT, Perplexity, and Google AI Overviews can cite the page, not only rank it."],"howItWorks":["You ask for a page in chat, for example 'Create an SEO-optimized landing page for linear.app'; if no domain is given, the agent stops and asks for one before doing any generation work.","It loads the bundled seo-audit skill to plan page structure, metadata, headings, canonical tags, image alt text, and schema, then loads the ai-seo skill before writing body copy so sections stay extractable and answer-oriented.","Through the context-dev MCP connection it discovers Context.dev tools via connection_search, consults search_docs for exact SDK method names, and calls execute to fetch brand data, page markdown, and styleguide details for the domain.","It infers the most useful page intent from the request and the retrieved data, choosing between homepage, landing, feature, comparison, local, or product page, and only asks a follow-up when the data cannot support a sensible choice.","It generates one complete HTML document with inline CSS reflecting the brand's colors and typography, a single h1, Open Graph and Twitter card tags, an FAQ section when it fits, and JSON-LD using Organization, WebPage, FAQPage, Product, or Service.","It returns the document in a single fenced html block followed by SEO notes covering search intent, primary keyword, secondary topics, schema types, and Context.dev source URLs, plus an assumptions list whenever copy relied on inference; two bundled evals verify the missing-domain guard and this page-structure contract."],"useCases":[{"title":"Landing page from a domain in minutes","body":"Give the agent a prospect's or your own domain and get a launch-ready static landing page whose copy, colors, and typography match the live brand, complete with metadata and structured data for immediate deployment."},{"title":"Programmatic SEO page drafts","body":"Generate grounded first drafts for feature, comparison, or product pages by pointing the agent at a specific source URL and target keyword, such as building a product page targeting AI support automation."},{"title":"AI answer engine visibility","body":"Produce pages structured for citation by ChatGPT, Perplexity, and Google AI Overviews, with extractable answer blocks, FAQ sections, and FAQPage schema, while staying people-first to avoid scaled content abuse penalties."},{"title":"On-brand pages for agency clients","body":"Agencies can prototype an SEO page for any client domain without collecting brand assets manually; Context.dev supplies logos, colors, industry labels, and homepage copy so the draft looks like the client made it."}],"requirements":[{"name":"CONTEXT_DEV_API_KEY","body":"Context.dev API key used to authenticate the hosted MCP server at context-dev.stlmcp.com via the x-context-dev-api-key header. Create one in your Context.dev account; keys look like ctxt_secret_. The agent refuses to run brand lookups without it."},{"name":"CONTEXT_API_KEY","body":"Optional fallback variable read when CONTEXT_DEV_API_KEY is unset, for projects that already use this name. CONTEXT_DEV_API_KEY is the documented standard; set only one of the two."},{"name":"eve@^0.18.2","body":"The eve framework runtime that hosts the agent, its MCP client connection, skills, and evals. Installed as the registry item's dependency; the agent package requires Node 24 or newer."}],"faqs":[{"question":"How do I install and run it?","answer":"Run npx shadcn@latest add @evex/branded-seo-page-builder in your eve app, copy .env.example and set CONTEXT_DEV_API_KEY, then start with pnpm dev and ask the agent in chat for a page from any domain."},{"question":"Which model does the agent use?","answer":"It is configured with zai/glm-5.2-fast in agent/agent.ts. You can swap the model by editing the defineAgent call; the instructions, skills, and Context.dev connection work independently of the model choice."},{"question":"What output do I actually get?","answer":"One complete HTML document in a single fenced html block with inline CSS and no JavaScript unless requested, followed by SEO notes listing search intent, primary keyword, secondary topics, schema types, and Context.dev source URLs, plus assumptions when copy was inferred."},{"question":"What happens if Context.dev has little data for a domain, or the API fails?","answer":"The agent will not fabricate brand facts. On a missing or invalid key, a 401, or a 429 rate limit it stops and reports the failure; with thin brand data it asks for more source copy or a specific page URL instead of inventing claims."},{"question":"Can I customize the visual style or page type?","answer":"Yes. By default the agent applies Context.dev styleguide data for colors, typography, spacing, and shadows. You can pass a specific source page URL, request a particular intent like a comparison or product page, or ask it to skip styleguide data entirely."}]}},"files":[{"path":"agent/agent.ts","type":"registry:file","target":"~/agent/agent.ts"},{"path":"agent/connections/context-dev.ts","type":"registry:file","target":"~/agent/connections/context-dev.ts"},{"path":"agent/instructions.md","type":"registry:file","target":"~/agent/instructions.md"},{"path":"agent/skills/ai-seo/references/content-patterns.md","type":"registry:file","target":"~/agent/skills/ai-seo/references/content-patterns.md"},{"path":"agent/skills/ai-seo/references/content-types.md","type":"registry:file","target":"~/agent/skills/ai-seo/references/content-types.md"},{"path":"agent/skills/ai-seo/references/okf.md","type":"registry:file","target":"~/agent/skills/ai-seo/references/okf.md"},{"path":"agent/skills/ai-seo/references/platform-ranking-factors.md","type":"registry:file","target":"~/agent/skills/ai-seo/references/platform-ranking-factors.md"},{"path":"agent/skills/ai-seo/SKILL.md","type":"registry:file","target":"~/agent/skills/ai-seo/SKILL.md"},{"path":"agent/skills/seo-audit/references/ai-writing-detection.md","type":"registry:file","target":"~/agent/skills/seo-audit/references/ai-writing-detection.md"},{"path":"agent/skills/seo-audit/references/international-seo.md","type":"registry:file","target":"~/agent/skills/seo-audit/references/international-seo.md"},{"path":"agent/skills/seo-audit/SKILL.md","type":"registry:file","target":"~/agent/skills/seo-audit/SKILL.md"},{"path":"evals/evals.config.ts","type":"registry:file","target":"~/evals/evals.config.ts"},{"path":"evals/missing-domain-asks.eval.ts","type":"registry:file","target":"~/evals/missing-domain-asks.eval.ts"},{"path":"evals/page-structure-contract.eval.ts","type":"registry:file","target":"~/evals/page-structure-contract.eval.ts"},{"path":"README.md","type":"registry:file","target":"~/agent/README.md"},{"path":".env.example","type":"registry:file","target":"~/.env.example"}]},{"name":"code-reviewer","type":"registry:item","title":"Code Reviewer","description":"Review GitHub pull requests from a native GitHub App channel. Mention `@code-reviewer` on a pull request to publish a GitHub review with inline comments, optional suggestion blocks, and Upstash-backed rate limiting for public repositories.","author":"TommyBez","categories":["coding"],"dependencies":["@upstash/ratelimit@^2.0.8","@upstash/redis@^1.38.0","eve@^0.18.2","zod@4.3.6"],"meta":{"slug":"code-reviewer","category":"coding","createdAt":"2026-06-20T00:00:00.000Z","updatedAt":"2026-07-04T00:00:00.000Z","docs":{"overview":["Code Reviewer is an eve agent that reviews GitHub pull requests when someone mentions @code-reviewer in a PR comment or a review thread. It runs behind a native GitHub App channel: GitHub delivers the comment webhook to your deployed eve app at /eve/v1/github, and the agent replies by publishing a real GitHub review with inline comments anchored to the diff.","The agent reviews changed behavior, not style. Its instructions direct it at concrete bugs, regressions, security risks, rollout risk, and materially missing tests, and explicitly forbid naming nits and speculative rewrites. It labels each finding blocking, warning, or nit, caps each review at 10 inline comments, and attaches GitHub suggestion blocks for small local fixes the author applies manually.","It is read-only toward your repository: the channel checks the code out into the eve sandbox for inspection, but the agent never pushes commits, opens branches, or edits the pull request. Built-in Upstash-backed rate limiting keeps public deployments safe, with stricter defaults for public repositories than private ones."],"howItWorks":["A user comments @code-reviewer (the mention must match GITHUB_APP_SLUG) on a pull request timeline or in a Files changed review thread, and GitHub sends the webhook to the eve app.","The channel verifies the mention targets a pull request conversation, then checks Upstash rate limits: per-PR cooldown, per-user-per-PR cooldown, and daily repository quotas; if blocked, it posts at most one cooldown reply per 15 minutes instead of running the model.","When allowed, the channel injects PR metadata and diff context (excluding lockfiles and build output like dist, .next, and coverage) and checks the repository out into the eve sandbox.","The agent, running on the zai/glm-5.2 model, inspects only the context needed to validate findings using read_file, grep, glob, and targeted bash, loading the bundled review-calibration skill when severity is ambiguous.","It calls the submit_pr_review tool exactly once with a summary and up to 10 severity-labeled inline comments, each validated by a Zod schema (path, line, side, optional suggestion block).","The channel claims the publication in Redis to prevent duplicates, then posts a batch GitHub review; if batch creation fails, it falls back to individual inline comments plus a timeline summary, and reviews with no findings become a short timeline comment."],"useCases":[{"title":"On-demand review for team pull requests","body":"Install the GitHub App on your team repositories and mention @code-reviewer when a PR is ready. You get a structured review with blocking, warning, and nit findings anchored to the exact diff lines, focused on bugs and regressions rather than style."},{"title":"Safe reviews on public open-source repos","body":"The Upstash-backed limiter defaults to 10 reviews per public repository per day, one review per PR every 15 minutes, and a per-user cooldown of 30 minutes, so drive-by mentions on a public repo cannot exhaust your model budget."},{"title":"Quick-fix suggestions authors can apply in one click","body":"For short, local, near-certain fixes the agent attaches a GitHub suggestion block to the inline comment. The PR author applies it from the GitHub UI; the agent itself never commits or modifies the branch."},{"title":"Second pass on risky surfaces before merge","body":"The instructions prioritize auth, permissions, user data, schemas, cache invalidation, concurrency, and billing code paths. Mention the agent on high-risk PRs to get a focused pass on those surfaces plus residual-risk notes in the review summary."}],"requirements":[{"name":"GITHUB_APP_ID","body":"The App ID of the GitHub App you create under GitHub Settings, Developer settings, GitHub Apps. The app needs Metadata read, Contents read, Pull requests read/write, and Issues read/write permissions."},{"name":"GITHUB_APP_PRIVATE_KEY","body":"The PEM private key generated from the GitHub App settings page. When stored as a single-line variable, replace literal newlines with \\n; eve normalizes that form at runtime."},{"name":"GITHUB_WEBHOOK_SECRET","body":"A long random value set both in the GitHub App webhook configuration and in your deployment. A mismatch produces HTTP 401 responses at /eve/v1/github."},{"name":"GITHUB_APP_SLUG","body":"The mention users type on GitHub, defaulting to code-reviewer. It must match your GitHub App name so @code-reviewer mentions trigger the agent."},{"name":"KV_REST_API_URL","body":"Upstash Redis REST endpoint used by @upstash/ratelimit for cooldowns, daily quotas, and duplicate-publication claims. Provision it via Upstash or the Vercel Redis Marketplace integration."},{"name":"KV_REST_API_TOKEN","body":"The matching Upstash REST token. Use a read-write token, not the read-only one, because the agent writes cooldown and review publication keys."},{"name":"AI_GATEWAY_API_KEY","body":"A model credential for the deployment, either a Vercel AI Gateway API key or AI Gateway OIDC, so the agent can call the zai/glm-5.2 model."}],"faqs":[{"question":"How do I install and trigger it?","answer":"Run npx shadcn@latest add @evex/code-reviewer inside an eve app, deploy it over HTTPS, create a GitHub App pointing its webhook at /eve/v1/github, subscribe to Issue comments and Pull request review comments, install it on your repositories, then comment @code-reviewer review this on any pull request."},{"question":"Can it modify my pull request?","answer":"No. The agent only publishes review comments and optional suggestion blocks. It may test small patches inside the eve sandbox to validate a suggestion, but it never pushes commits, opens branches, or edits the PR; authors apply suggestions manually."},{"question":"Which model does it use and can I change it?","answer":"The agent is pinned to zai/glm-5.2 in agent/agent.ts. Since the file is installed into your app, you can edit defineAgent to point at any model available through your AI Gateway credential."},{"question":"How do the rate limits work and can I tune them?","answer":"Defaults are one review per PR every 15 minutes, one per user per PR every 30 minutes, 25 daily reviews per private repository, and 10 per public repository. Every limit is tunable via CODE_REVIEWER_* environment variables, and CODE_REVIEWER_RATE_LIMIT_ENABLED=false disables limiting for local development."},{"question":"What happens if Upstash is unreachable?","answer":"The failure mode defaults to public_closed: reviews on public repositories are blocked while private repositories continue working. You can change CODE_REVIEWER_RATE_LIMIT_FAILURE_MODE to closed or open depending on how conservative you want the deployment to be."}]}},"files":[{"path":"agent/agent.ts","type":"registry:file","target":"~/agent/agent.ts"},{"path":"agent/channels/github.ts","type":"registry:file","target":"~/agent/channels/github.ts"},{"path":"agent/instructions.md","type":"registry:file","target":"~/agent/instructions.md"},{"path":"agent/lib/review-rate-limit.ts","type":"registry:file","target":"~/agent/lib/review-rate-limit.ts"},{"path":"agent/skills/review-calibration/references/review-checklist.md","type":"registry:file","target":"~/agent/skills/review-calibration/references/review-checklist.md"},{"path":"agent/skills/review-calibration/references/severity-scale.md","type":"registry:file","target":"~/agent/skills/review-calibration/references/severity-scale.md"},{"path":"agent/skills/review-calibration/SKILL.md","type":"registry:file","target":"~/agent/skills/review-calibration/SKILL.md"},{"path":"agent/tools/submit_pr_review.ts","type":"registry:file","target":"~/agent/tools/submit_pr_review.ts"},{"path":"evals/evals.config.ts","type":"registry:file","target":"~/evals/evals.config.ts"},{"path":"evals/pr-review-input-contract.eval.ts","type":"registry:file","target":"~/evals/pr-review-input-contract.eval.ts"},{"path":"evals/pr-review-no-findings.eval.ts","type":"registry:file","target":"~/evals/pr-review-no-findings.eval.ts"},{"path":"evals/pr-review-with-inline-finding.eval.ts","type":"registry:file","target":"~/evals/pr-review-with-inline-finding.eval.ts"},{"path":"README.md","type":"registry:file","target":"~/agent/README.md"},{"path":".env.example","type":"registry:file","target":"~/.env.example"}]},{"name":"eve-agent-builder","type":"registry:item","title":"Eve Agent Builder","description":"An Eve coding agent that creates Eve agents, runs their checks, deploys them to Vercel, and verifies the live routes.","author":"TommyBez","categories":["coding"],"dependencies":["eve@^0.18.2","zod@^4.4.3"],"meta":{"slug":"eve-agent-builder","category":"coding","createdAt":"2026-06-30T10:23:00.000Z","updatedAt":"2026-07-03T00:00:00.000Z","docs":{"overview":["Eve Agent Builder turns a plain request like 'create an agent that answers onboarding questions' into a tested, deployed Eve agent, so you review approvals and results instead of running the delivery checklist yourself. Install it into an existing Eve app and talk to it through whatever channel that app already exposes: web chat, the Eve session API, Slack, or GitHub.","Every claim it makes is backed by a recorded result. The agent tests generated code in a real Vercel Sandbox with Node 24, and a hook captures the exit code of each eve info, build, and eval run. When it asks you to approve a deploy, the request quotes that recorded evidence, so you decide with facts rather than the model's recollection.","Deployment stays under your control. The bash tool denies Vercel CLI commands outright and routes them through run_vercel_cli, which pauses for human approval on every Connect setup, project link, and deploy, and refuses to deploy a workspace that is not already linked to a Vercel project. After deploying, it verifies the live health, session, and stream routes."],"howItWorks":["You install the agent into an existing Eve app with npx shadcn@latest add @evex/eve-agent-builder; it adds no channel of its own, so you reach it through the app's existing web, Slack, GitHub, or session API surface.","On each request it loads the bundled eve and eve-agent-delivery skills, reads the local Eve docs in node_modules/eve/docs, and writes the smallest set of instructions, tools, channels, schedules, and evals that satisfies the request.","It tests the result locally in a Vercel Sandbox (Node 24, 2 vCPUs) through the run_eve_cli tool, running eve info --json, eve build, and eve eval, while the record-check-evidence hook stores each command's exit code in session state.","A runtime-status block regenerated every turn reports which credentials are present (never their values) plus the recorded check results, and the agent quotes that evidence when it requests deploy approval.","Once you approve, run_vercel_cli links the target project and runs the preview or production deploy with VERCEL_TOKEN injected at the sandbox firewall, never in command text or generated files.","Finally, verify_vercel_preview checks GET /eve/v1/health, creates a smoke-test session, and reads the session stream, brokering VERCEL_AUTOMATION_BYPASS_SECRET when the preview is protected by Vercel Deployment Protection."],"useCases":[{"title":"Scaffold a new agent with evals","body":"Ask for an agent that answers customer onboarding questions from your docs. The builder reads the repo, writes the instructions and evals, runs eve build and the eval suite locally, and stops with recorded results before any deploy."},{"title":"Wire up a Slack channel end to end","body":"The builder adds the Slack channel with run_eve_cli, then walks the Vercel Connect flow: create the Slack client, detach the default destination, attach it to /eve/v1/slack with triggers, deploy, and smoke-test delivery. You approve each Vercel step."},{"title":"Run it as a remote build service","body":"Deploy the builder itself and call it from another Eve app as a typed subagent with defineRemoteAgent. Task-mode runs return a structured delivery report: changed files, command outcomes, deployment URL and target, verification evidence, and blockers."},{"title":"Diagnose a broken deployment","body":"Point it at a failing Vercel deployment. It uses the Vercel MCP connection to pull build logs, runtime errors, and Agent Runs traces, fixes the cause in the repo, reruns the local checks, and redeploys after approval."}],"requirements":[{"name":"VERCEL_TOKEN","body":"Required. Creates Vercel Sandboxes for local testing, authenticates the Vercel MCP connection, and is brokered at the sandbox firewall for run_vercel_cli calls, so it never appears in commands or files. Create one under Account Settings, Tokens, on vercel.com."},{"name":"AI_GATEWAY_API_KEY","body":"Optional model credential for local eval and smoke-test runs outside Vercel. On Vercel you can skip it: the agent pulls a VERCEL_OIDC_TOKEN by linking the project after approval. Get a key from the Vercel AI Gateway dashboard."},{"name":"VERCEL_AUTOMATION_BYPASS_SECRET","body":"Optional. Lets verify_vercel_preview check previews protected by Vercel Deployment Protection by injecting the x-vercel-protection-bypass header at the sandbox firewall. Copy it from the project's Deployment Protection settings."},{"name":"VERCEL_MCP_URL","body":"Optional override for the hosted Vercel MCP endpoint. Defaults to https://mcp.vercel.com; change it only if you operate a compatible endpoint."},{"name":"eve@^0.18.2","body":"The eve framework the agent is built on, installed as an npm dependency alongside zod ^4.4.3 when you add the registry item. The sandbox prewarms the eve 0.18.2 and Vercel CLIs so first commands skip the cold download."}],"faqs":[{"question":"Can it deploy to production without me noticing?","answer":"No. Every Vercel Connect setup, project link, preview deploy, and production deploy pauses for human approval; only the read-only whoami check runs without it. Deploys also refuse to run unless the workspace is already linked to a Vercel project, so a deploy can never silently create or target a project you did not confirm."},{"question":"Does the agent or its sandbox ever see my Vercel token?","answer":"No. Eve injects VERCEL_TOKEN at the sandbox network policy, so it never enters command text, sandbox files, or generated source, and the bash tool denies any command that sets VERCEL_TOKEN. The preview bypass secret gets the same treatment and is cleared after verification."},{"question":"What stops it from claiming tests passed when they did not?","answer":"A hook records the real exit code of every eve info, build, and eval call, and the runtime-status block replays that evidence to the agent each turn. Seven bundled evals also regression-test the guardrails, including that it never deploys before local testing and that it stops when credentials are missing."},{"question":"Which model does it run on, and can I swap it?","answer":"It ships with zai/glm-5.2-fast at high reasoning effort, set in agent/agent.ts; change the model string there to use any model your gateway serves. The eval suite judges outputs with openai/gpt-5.4-mini, configured separately in evals/evals.config.ts."},{"question":"How do I install it, and what does it need to run?","answer":"Run npx shadcn@latest add @evex/eve-agent-builder inside an existing Eve app, then set VERCEL_TOKEN in the app runtime. The package adds no channel of its own; if your app has no interactive surface yet, add a web or Slack channel first."}]}},"files":[{"path":"agent/agent.ts","type":"registry:file","target":"~/agent/agent.ts"},{"path":"agent/connections/vercel.ts","type":"registry:file","target":"~/agent/connections/vercel.ts"},{"path":"agent/hooks/record-check-evidence.ts","type":"registry:file","target":"~/agent/hooks/record-check-evidence.ts"},{"path":"agent/instructions.md","type":"registry:file","target":"~/agent/instructions.md"},{"path":"agent/instructions/runtime-status.ts","type":"registry:file","target":"~/agent/instructions/runtime-status.ts"},{"path":"agent/lib/delivery-evidence.ts","type":"registry:file","target":"~/agent/lib/delivery-evidence.ts"},{"path":"agent/lib/vercel-brokered-cli.ts","type":"registry:file","target":"~/agent/lib/vercel-brokered-cli.ts"},{"path":"agent/sandbox.ts","type":"registry:file","target":"~/agent/sandbox.ts"},{"path":"agent/skills/eve/SKILL.md","type":"registry:file","target":"~/agent/skills/eve/SKILL.md"},{"path":"agent/skills/eve-agent-delivery/references/channel-setup.md","type":"registry:file","target":"~/agent/skills/eve-agent-delivery/references/channel-setup.md"},{"path":"agent/skills/eve-agent-delivery/references/testing-sequence.md","type":"registry:file","target":"~/agent/skills/eve-agent-delivery/references/testing-sequence.md"},{"path":"agent/skills/eve-agent-delivery/SKILL.md","type":"registry:file","target":"~/agent/skills/eve-agent-delivery/SKILL.md"},{"path":"agent/tools/bash.ts","type":"registry:file","target":"~/agent/tools/bash.ts"},{"path":"agent/tools/run_eve_cli.ts","type":"registry:file","target":"~/agent/tools/run_eve_cli.ts"},{"path":"agent/tools/run_vercel_cli.ts","type":"registry:file","target":"~/agent/tools/run_vercel_cli.ts"},{"path":"agent/tools/verify_vercel_preview.ts","type":"registry:file","target":"~/agent/tools/verify_vercel_preview.ts"},{"path":"evals/bash-denial-routing.eval.ts","type":"registry:file","target":"~/evals/bash-denial-routing.eval.ts"},{"path":"evals/bash-routing-patterns.eval.ts","type":"registry:file","target":"~/evals/bash-routing-patterns.eval.ts"},{"path":"evals/deploy-target-clarification.eval.ts","type":"registry:file","target":"~/evals/deploy-target-clarification.eval.ts"},{"path":"evals/final-report-quality.eval.ts","type":"registry:file","target":"~/evals/final-report-quality.eval.ts"},{"path":"evals/loads-eve-skill.eval.ts","type":"registry:file","target":"~/evals/loads-eve-skill.eval.ts"},{"path":"evals/evals.config.ts","type":"registry:file","target":"~/evals/evals.config.ts"},{"path":"evals/missing-credentials-stop.eval.ts","type":"registry:file","target":"~/evals/missing-credentials-stop.eval.ts"},{"path":"evals/no-deploy-before-local-testing.eval.ts","type":"registry:file","target":"~/evals/no-deploy-before-local-testing.eval.ts"},{"path":"README.md","type":"registry:file","target":"~/agent/README.md"},{"path":".env.example","type":"registry:file","target":"~/.env.example"}]},{"name":"linear-operations-agent","type":"registry:item","title":"Linear Operations Agent","description":"An Eve agent for Linear operations across Linear, Slack, and scheduled runs.","author":"TommyBez","categories":["productivity"],"dependencies":["@vercel/connect@^0.2.6","eve@^0.18.2"],"meta":{"slug":"linear-operations-agent","category":"productivity","createdAt":"2026-06-20T00:00:00.000Z","updatedAt":"2026-07-04T00:00:00.000Z","docs":{"overview":["Linear Operations Agent is an eve agent that keeps Linear as the operational source of truth while meeting your team where work actually starts. You mention or delegate to it inside Linear Agent Sessions, mention or DM it in Slack threads, or let six built-in schedules run digests for triage, cycle health, backlog hygiene, project summaries, P0/P1 monitoring, and weekly initiative updates.","All Linear reads and writes go through a single Linear MCP connection to https://mcp.linear.app/mcp with an explicit tool allow-list: eleven read tools such as list_issues, get_issue, and list_cycles, and six write tools such as save_issue, save_comment, and save_status_update. A dynamic approval policy gates every sensitive write, so issue creation, priority changes, reassignments, and bulk actions always require human sign-off first.","It ships ten skills covering triage, duplicate detection, clarification, decomposition, incident support, Slack intake, and project, initiative, cycle, and backlog reporting. Two included evals verify the safety contract: triage produces evidence-backed proposals without calling save_issue, and initiatives outside LINEAR_OPS_COVERED_INITIATIVES never receive automated status updates."],"howItWorks":["A Linear Agent app sends AgentSessionEvent webhooks to POST /eve/v1/linear when someone mentions or delegates to the agent; the channel verifies LINEAR_WEBHOOK_SECRET, accepts only created and prompted actions, and filters events against LINEAR_OPS_COVERED_TEAMS and LINEAR_OPS_COVERED_PROJECTS before waking the agent.","In Slack, a Vercel Connect Slack connector delivers app mentions and DMs to POST /eve/v1/slack; on each mention the channel loads thread context since the last agent reply and instructs the model that Slack is intake and delivery while Linear stays the source of truth.","Whenever the agent needs Linear data from any surface, it calls allow-listed tools on the Linear MCP connection authenticated through the Vercel Connect OAuth connector in LINEAR_CONNECT_UID; the first call can trigger a sign-in challenge, after which Eve stores and refreshes the credential.","Before any sensitive write, such as creating an issue, changing state, priority, assignee, project, cycle, or relationships, or any write touching priority 1 or 2 issues, the approval policy pauses the tool call and the agent asks for approval in the originating channel.","Cron schedules, all configurable via env vars and running in UTC, post read-only digests to the Slack channels you configure, for example the daily triage digest at 0 7 on weekdays to LINEAR_OPS_TRIAGE_SLACK_CHANNEL_ID; handlers skip silently when no target channel is set.","Weekly initiative updates are the one automated Linear write: every Monday the agent calls save_status_update with type initiative, but only for initiatives explicitly listed and enabled in LINEAR_OPS_COVERED_INITIATIVES and only while LINEAR_OPS_AUTO_INITIATIVE_UPDATES is not false."],"useCases":[{"title":"Triage inbound issues from inside Linear","body":"Mention the agent on a vague bug report and it reads the issue and comments through MCP, checks for duplicates, proposes type, priority, labels, and next steps with cited evidence, then asks for approval before applying anything with save_issue."},{"title":"Turn Slack threads into structured Linear work","body":"Mention the agent in a Slack discussion and it summarizes the thread since its last reply, separates discussion from decisions, drafts a Linear issue or links the thread to an existing one like ENG-123, and requests approval before creating anything."},{"title":"Automated operational digests in Slack","body":"Weekday triage and cycle-health digests plus Monday backlog and project summaries flag issues stuck in triage, missing owners or priorities, stale updates, and blocked work, each delivered read-only to its own configurable Slack channel with concrete next steps."},{"title":"Hands-off weekly initiative status updates","body":"For initiatives you explicitly list in LINEAR_OPS_COVERED_INITIATIVES, the agent writes a weekly status update directly to Linear every Monday with no approval round-trip. It refuses unlisted initiatives, and an included eval verifies that refusal."}],"requirements":[{"name":"LINEAR_AGENT_ACCESS_TOKEN","body":"Access token of your Linear Agent app, used by the Linear channel to post Agent Activities and manage Agent Sessions. Created in Linear when you configure the app with actor=app and the app:assignable and app:mentionable scopes. It does not authorize MCP tools."},{"name":"LINEAR_WEBHOOK_SECRET","body":"Webhook signing secret from the Linear app settings, used to verify the Linear-Signature header on AgentSessionEvent webhooks arriving at /eve/v1/linear."},{"name":"LINEAR_CONNECT_UID","body":"UID returned by vercel connect create linear. Authorizes the Linear MCP connection at https://mcp.linear.app/mcp via Vercel Connect OAuth; this is what actually grants Linear read and write access."},{"name":"SLACK_CONNECT_UID","body":"UID returned by vercel connect create slack, attached with triggers pointing at /eve/v1/slack so app mentions and DMs reach the agent. Replaces direct SLACK_BOT_TOKEN and SLACK_SIGNING_SECRET configuration."},{"name":"LINEAR_OPS_DEFAULT_SLACK_CHANNEL_ID","body":"Fallback Slack channel ID for scheduled digests. Per-schedule overrides exist for triage, cycle, backlog, and P1 monitoring, plus LINEAR_OPS_PROJECT_CHANNELS for per-project routing. Schedules that resolve no channel do not post."},{"name":"LINEAR_OPS_COVERED_INITIATIVES","body":"Comma-separated list of initiative-id-or-name|optional-slack-channel|optional-enabled-flag entries. Only initiatives listed here ever receive automated weekly status updates in Linear; leave it empty to disable automated initiative writes entirely."},{"name":"eve and @vercel/connect","body":"npm dependencies eve ^0.18.2 and @vercel/connect ^0.2.6, installed automatically with the registry item. Node.js 24 or newer and an HTTPS-reachable Eve deployment are required for the Linear and Slack webhooks."}],"faqs":[{"question":"How do I install and verify it?","answer":"Run npx shadcn@latest add @evex/linear-operations-agent in an existing Eve app, then pnpm install. After configuring the connectors, pnpm info should list the linear and slack channels, one MCP connection named linear, six schedules, and ten skills, with no custom Linear SDK tools."},{"question":"Which model does it use and can I change it?","answer":"The agent is defined in agent/agent.ts with model openai/gpt-5.4-mini. Change the model string there to any model your Eve deployment supports; instructions, skills, and the approval policy are model-agnostic."},{"question":"Can it modify Linear without my approval?","answer":"Almost never. Reads, non-destructive save_comment proposals, and weekly initiative updates for explicitly configured initiatives run without approval. Everything else, including issue creation, state, priority, assignee, project, cycle, and relationship changes, any priority 1 or 2 write, project and document writes, and deletes, is approval-gated."},{"question":"How do I scope it to specific teams or make it read-only?","answer":"Set LINEAR_OPS_COVERED_TEAMS and LINEAR_OPS_COVERED_PROJECTS to filter which Linear events wake the agent, and LINEAR_OPS_READ_ONLY_TEAMS to keep it propose-only for certain teams. Empty values mean all teams and projects are covered."},{"question":"What are the built-in limits and schedule defaults?","answer":"Bulk actions are capped by LINEAR_OPS_MAX_BULK_ISSUE_COUNT, defaulting to 10 issues. All six cron schedules are overridable via env vars and evaluated in UTC, for example daily triage at 0 7 on weekdays and weekly initiative updates at 0 9 on Mondays."}]}},"files":[{"path":"agent/agent.ts","type":"registry:file","target":"~/agent/agent.ts"},{"path":"agent/channels/linear.ts","type":"registry:file","target":"~/agent/channels/linear.ts"},{"path":"agent/channels/slack.ts","type":"registry:file","target":"~/agent/channels/slack.ts"},{"path":"agent/connections/linear.ts","type":"registry:file","target":"~/agent/connections/linear.ts"},{"path":"agent/instructions.md","type":"registry:file","target":"~/agent/instructions.md"},{"path":"agent/lib/linear-operations-config.ts","type":"registry:file","target":"~/agent/lib/linear-operations-config.ts"},{"path":"agent/schedules/cycle-health.ts","type":"registry:file","target":"~/agent/schedules/cycle-health.ts"},{"path":"agent/schedules/daily-triage-digest.ts","type":"registry:file","target":"~/agent/schedules/daily-triage-digest.ts"},{"path":"agent/schedules/p1-monitoring.ts","type":"registry:file","target":"~/agent/schedules/p1-monitoring.ts"},{"path":"agent/schedules/weekly-backlog-hygiene.ts","type":"registry:file","target":"~/agent/schedules/weekly-backlog-hygiene.ts"},{"path":"agent/schedules/weekly-initiative-updates.ts","type":"registry:file","target":"~/agent/schedules/weekly-initiative-updates.ts"},{"path":"agent/schedules/weekly-project-summary.ts","type":"registry:file","target":"~/agent/schedules/weekly-project-summary.ts"},{"path":"agent/skills/backlog-hygiene/SKILL.md","type":"registry:file","target":"~/agent/skills/backlog-hygiene/SKILL.md"},{"path":"agent/skills/clarification/SKILL.md","type":"registry:file","target":"~/agent/skills/clarification/SKILL.md"},{"path":"agent/skills/cycle-health/SKILL.md","type":"registry:file","target":"~/agent/skills/cycle-health/SKILL.md"},{"path":"agent/skills/decomposition/SKILL.md","type":"registry:file","target":"~/agent/skills/decomposition/SKILL.md"},{"path":"agent/skills/duplicate-detection/SKILL.md","type":"registry:file","target":"~/agent/skills/duplicate-detection/SKILL.md"},{"path":"agent/skills/incident-support/SKILL.md","type":"registry:file","target":"~/agent/skills/incident-support/SKILL.md"},{"path":"agent/skills/initiative-reporting/SKILL.md","type":"registry:file","target":"~/agent/skills/initiative-reporting/SKILL.md"},{"path":"agent/skills/project-reporting/SKILL.md","type":"registry:file","target":"~/agent/skills/project-reporting/SKILL.md"},{"path":"agent/skills/slack-intake/SKILL.md","type":"registry:file","target":"~/agent/skills/slack-intake/SKILL.md"},{"path":"agent/skills/triage/SKILL.md","type":"registry:file","target":"~/agent/skills/triage/SKILL.md"},{"path":"evals/evals.config.ts","type":"registry:file","target":"~/evals/evals.config.ts"},{"path":"evals/triage-proposes-without-writing.eval.ts","type":"registry:file","target":"~/evals/triage-proposes-without-writing.eval.ts"},{"path":"evals/unconfigured-initiative-no-update.eval.ts","type":"registry:file","target":"~/evals/unconfigured-initiative-no-update.eval.ts"},{"path":"README.md","type":"registry:file","target":"~/agent/README.md"},{"path":".env.example","type":"registry:file","target":"~/.env.example"}]},{"name":"openui-assistant","type":"registry:item","title":"OpenUI Assistant","description":"An Eve agent that streams OpenUI Lang generative UI using the official openuiChatLibrary, with demo weather, stock, and search tools from the openui-chat example.","author":"TommyBez","categories":["general"],"dependencies":["@openuidev/react-lang@^0.2.8","@openuidev/react-ui@^0.12.1","eve@^0.18.2","just-bash@^3.0.2","zod@^4.4.3"],"meta":{"slug":"openui-assistant","category":"general","createdAt":"2026-06-30T21:52:44.748Z","updatedAt":"2026-07-04T00:00:00.000Z","docs":{"overview":["OpenUI Assistant is an eve agent that answers every chat turn with OpenUI Lang, a structured generative UI language, so your chat streams rendered cards, tables, and follow-up buttons instead of markdown prose. It builds its system prompt at build time by calling openuiChatLibrary.prompt(openuiChatPromptOptions) from @openuidev/react-ui, the same library and prompt options the official openui-chat example app uses, so its output stays compatible with the upstream renderer.","You interact with it through a normal chat session: run eve dev for the terminal UI, or mount the bundled OpenUIEveChat reference component in a Next.js app that uses withEve(), where useEveAgent() streams the reply into the Renderer from @openuidev/react-lang. Every reply is a program whose first statement assigns root, built from chat primitives like Card, CardHeader, TextContent, Table, and FollowUpItem.","Three deterministic demo tools ship with the agent: get_weather, get_stock_price, and search_web. They mirror the sample tools from the openui-chat example and return mock JSON, which makes the agent a self-contained sandbox for evaluating generative UI without wiring real data providers or API keys."],"howItWorks":["At build time, agent/instructions/openui-prompt.ts calls openuiChatLibrary.prompt(openuiChatPromptOptions) and injects the resulting OpenUI system prompt into the agent, alongside instructions.md which enforces the output contract: OpenUI Lang only, no markdown fences, first statement assigns root.","When a message arrives in the terminal UI or your web chat, the agent, running on the openai/gpt-5-mini model, decides whether the request needs get_weather, get_stock_price, or search_web before composing any UI.","The relevant tool runs and returns deterministic mock JSON, for example a weather object with temperature, humidity, wind, and a two-day forecast, or a stock quote with price, change, volume, and day range, and the agent is instructed never to invent tool-backed numbers.","The agent composes a top-down OpenUI Lang program from those tool results, using chat-library components such as Card, Table, ListBlock, and FollowUpBlock, and explicitly avoiding Stack, which is not part of openuiChatLibrary.","On the frontend, the reference component in agent/skills/openui/references/openui-eve-chat.tsx connects useEveAgent() to the @openuidev/react-lang Renderer, which paints live components while the stream is still in flight.","Three evals guard the contract with a 120 second timeout each: openui-format-contract checks that a greeting yields a pure OpenUI welcome card, while stock-quote-exact-price and weather-card-uses-tool-data verify the rendered UI matches the exact tool output."],"useCases":[{"title":"Prototype a generative UI chat product","body":"Use the agent as a working end-to-end reference for streaming structured UI from an eve backend to a React frontend, with the openui skill documenting syntax, library constraints, and a debugging checklist for parse and render failures."},{"title":"Demo dashboards from natural language","body":"Ask for a weather card for Tokyo or an NVDA quote rendered as a dashboard tile, and the agent calls the matching demo tool and streams cards, tables, and follow-up buttons built from that JSON."},{"title":"Test your OpenUI renderer integration","body":"Because the tools are deterministic, the same prompt produces the same data every run, making it a stable fixture for verifying that your Renderer setup, withEve() wiring, and @openuidev packages handle streamed OpenUI Lang correctly."},{"title":"Learn the OpenUI Lang output contract","body":"The instructions, skill references, and eval suite together show how to enforce a strict format contract on a model: root-first programs, no markdown fences, no forbidden components, and tool-backed numbers only."}],"requirements":[{"name":"AI_GATEWAY_API_KEY","body":"Optional model gateway credential for the host eve app; get one from Vercel AI Gateway. Not needed when your deployment already provides credentials through VERCEL_OIDC_TOKEN or another provider. The agent itself requires no agent-specific environment variables."},{"name":"@openuidev/react-ui and @openuidev/react-lang","body":"npm packages (^0.12.1 and ^0.2.8) that provide openuiChatLibrary, the prompt options, and the React Renderer. Both must be installed in the host app for the frontend reference component to work."},{"name":"eve","body":"The eve agent framework (^0.18.2) that runs the agent, tools, skill, and evals; the web integration also relies on withEve() from eve/next and the useEveAgent() hook. Requires Node 24 or newer."}],"faqs":[{"question":"How do I install the agent?","answer":"Run npx shadcn@latest add @evex/openui-assistant in your eve app, then install the registry dependencies (@openuidev/react-ui, @openuidev/react-lang, eve, just-bash, zod) if they are not already present. Start it with pnpm dev or eve dev."},{"question":"Which model does it use, and can I change it?","answer":"agent/agent.ts pins openai/gpt-5-mini via defineAgent. You can swap the model string for any provider your eve gateway supports, then re-run the bundled evals to confirm the new model still honors the OpenUI Lang format contract."},{"question":"Is the web search real?","answer":"No. search_web returns deterministic mock results and is labeled demo data by design; the instructions forbid using it for current or factual research. The weather and stock tools are also deterministic samples mirrored from the openui-chat example."},{"question":"Why does the UI sometimes render as plain text or fail to parse?","answer":"The model broke the contract, usually by adding markdown fences or prose around the program. The openui skill ships a debugging checklist: confirm the reply starts with root =, all identifiers are defined, and no Stack component is used."},{"question":"How do I render the UI in my own Next.js app?","answer":"Wrap your app with withEve() from eve/next, copy the openui-eve-chat.tsx reference into your components folder, and render OpenUIEveChat on a page. The frontend-wiring.md reference covers full setup plus an AgentInterface alternative matching the upstream chat shell."}]}},"files":[{"path":"agent/agent.ts","type":"registry:file","target":"~/agent/agent.ts"},{"path":"agent/instructions/openui-prompt.ts","type":"registry:file","target":"~/agent/instructions/openui-prompt.ts"},{"path":"agent/instructions.md","type":"registry:file","target":"~/agent/instructions.md"},{"path":"agent/lib/openui-library.ts","type":"registry:file","target":"~/agent/lib/openui-library.ts"},{"path":"agent/skills/openui/references/frontend-wiring.md","type":"registry:file","target":"~/agent/skills/openui/references/frontend-wiring.md"},{"path":"agent/skills/openui/references/openui-eve-chat.tsx","type":"registry:file","target":"~/agent/skills/openui/references/openui-eve-chat.tsx"},{"path":"agent/skills/openui/references/syntax-examples.md","type":"registry:file","target":"~/agent/skills/openui/references/syntax-examples.md"},{"path":"agent/skills/openui/SKILL.md","type":"registry:file","target":"~/agent/skills/openui/SKILL.md"},{"path":"agent/tools/get_stock_price.ts","type":"registry:file","target":"~/agent/tools/get_stock_price.ts"},{"path":"agent/tools/get_weather.ts","type":"registry:file","target":"~/agent/tools/get_weather.ts"},{"path":"agent/tools/search_web.ts","type":"registry:file","target":"~/agent/tools/search_web.ts"},{"path":"evals/evals.config.ts","type":"registry:file","target":"~/evals/evals.config.ts"},{"path":"evals/openui-format-contract.eval.ts","type":"registry:file","target":"~/evals/openui-format-contract.eval.ts"},{"path":"evals/stock-quote-exact-price.eval.ts","type":"registry:file","target":"~/evals/stock-quote-exact-price.eval.ts"},{"path":"evals/weather-card-uses-tool-data.eval.ts","type":"registry:file","target":"~/evals/weather-card-uses-tool-data.eval.ts"},{"path":"README.md","type":"registry:file","target":"~/agent/README.md"},{"path":".env.example","type":"registry:file","target":"~/.env.example"}]},{"name":"postgres-data-analyst","type":"registry:item","title":"Postgres Data Analyst","description":"An Eve-native Slack analyst for a single Postgres database. It answers Slack mentions and DMs, inspects schema metadata, and runs bounded read-only SQL through authored tools.","author":"TommyBez","categories":["data"],"dependencies":["@vercel/connect@^0.2.6","eve@^0.18.2","pg@^8.21.0","pgsql-ast-parser@^12.0.1","zod@4.3.6"],"meta":{"slug":"postgres-data-analyst","category":"data","createdAt":"2026-06-23T00:00:00.000Z","updatedAt":"2026-07-04T00:00:00.000Z","docs":{"overview":["Postgres Data Analyst is an eve agent that lives in your Slack workspace and answers questions about a single Postgres database. Mention it in a channel or send it a DM, ask something like show total signups by month for the last 6 months, and it inspects the schema, writes one read-only SQL query, runs it, and replies with an interpreted answer rather than a raw row dump.","Safety is layered rather than assumed. Every query is parsed into an AST with pgsql-ast-parser and rejected unless it is a single SELECT or WITH statement over allowed schemas; INSERT, UPDATE, DELETE, DDL, SET, and transaction control are all blocked before anything reaches the database. Execution then happens inside a READ ONLY transaction with a statement timeout and a hard row cap, and the docs walk you through creating a dedicated read-only Postgres role as the real enforcement boundary.","It works with any Postgres you can reach with a connection string, including Neon branches and Supabase, and connects to Slack through Vercel Connect so you never handle bot tokens or signing secrets yourself. Schema allowlists and a blocked-tables list let you keep sensitive tables out of both query results and schema listings."],"howItWorks":["A Slack mention or DM arrives through the eve Slack channel at /eve/v1/slack, authenticated by Vercel Connect credentials resolved from DATA_ANALYST_SLACK_CONNECT_UID, so no Slack bot token is stored in your environment.","If the metric definition, time range, table choice, or grain is ambiguous, the agent asks a clarifying question in the thread before touching the database, a behavior pinned by the ambiguous-metric-clarification eval.","For unfamiliar tables it calls the describe_schema tool, which lists tables, columns, types, nullability, and primary keys from allowed schemas only, filtering out anything in DATA_ANALYST_BLOCKED_TABLES.","It writes one read-only query and calls run_sql, which parses the SQL into an AST, rejects anything that is not a single SELECT or WITH statement, blocks disallowed schemas, blocked tables, and unqualified pg_ catalog tables.","Validated SQL runs inside a READ ONLY transaction with SET LOCAL statement_timeout applied and results wrapped in a LIMIT of DATA_ANALYST_MAX_ROWS plus one, so the agent knows when output was truncated and says so.","The agent interprets the rows in plain language for Slack, stating assumptions, filters, units, and date windows, and narrows the question instead of issuing broader SQL when results are incomplete."],"useCases":[{"title":"Self-serve metrics in Slack","body":"Let product managers and founders ask signups by month, active users last week, or revenue by plan directly in a channel, without writing SQL or waiting on a data team, while the agent explains the query assumptions it made."},{"title":"Safe database exploration for the whole team","body":"Point the agent at a reporting schema and let anyone ask what schemas and tables can you see. describe_schema exposes only allowed schemas and hides blocked tables, so exploration stays inside boundaries you define."},{"title":"Read-only analytics over Neon or Supabase","body":"Connect a Neon reporting branch or a dedicated read-only Supabase role and get conversational analytics without granting the service role. The AST validator plus the read-only role means no write path exists."},{"title":"Guarded ad hoc investigations","body":"Debug a spike or verify a customer claim with bounded queries: a 10 second default statement timeout and a 200 row default cap keep exploratory SQL from hammering production, and the agent labels truncated results."}],"requirements":[{"name":"DATA_ANALYST_DATABASE_URL","body":"Postgres connection string the agent queries. Create a dedicated read-only role (the README includes the exact GRANT statements) and use its credentials; the role, not the SQL validator, is the enforcement boundary."},{"name":"DATA_ANALYST_ALLOWED_SCHEMAS","body":"Comma-separated list of schemas the agent may query and describe. Defaults to public. Queries referencing any other schema are rejected before execution, and search_path is pinned to this list."},{"name":"DATA_ANALYST_BLOCKED_TABLES","body":"Optional comma-separated table names, plain or schema-qualified like users,public.accounts, that are excluded from both run_sql queries and describe_schema listings. Leave empty to block nothing."},{"name":"DATA_ANALYST_MAX_ROWS","body":"Maximum rows returned per query, 1 to 1000, default 200. The tool wraps every query in a LIMIT and flags truncated results so the agent can narrow the question."},{"name":"DATA_ANALYST_STATEMENT_TIMEOUT_MS","body":"Per-query statement timeout in milliseconds, 1000 to 60000, default 10000. Applied with SET LOCAL inside each transaction so a runaway query cannot hold a connection."},{"name":"DATA_ANALYST_SLACK_CONNECT_UID","body":"Vercel Connect UID for the Slack integration, default slack/postgres-data-analyst. Obtain it by running vercel connect create slack --triggers from the Vercel project and attaching it to the /eve/v1/slack route."}],"faqs":[{"question":"How do I install it?","answer":"Run npx shadcn@latest add @evex/postgres-data-analyst inside an existing eve app, install the listed dependencies (eve, pg, pgsql-ast-parser, zod, @vercel/connect), fill in the DATA_ANALYST_* environment variables, deploy, then connect Slack with vercel connect create slack --triggers."},{"question":"Can it modify or delete data?","answer":"No. Every query is parsed into an AST and rejected unless it is a single SELECT or WITH statement; INSERT, UPDATE, DELETE, TRUNCATE, DDL, and SET are blocked. Execution runs in a READ ONLY transaction, and the recommended setup uses a Postgres role with SELECT-only grants. A dedicated eval verifies the agent refuses mutation requests."},{"question":"Which model does it use, and can I change it?","answer":"The agent ships with zai/glm-5.2 configured in agent/agent.ts. The files install into your codebase, so edit that one line to switch to any model the eve framework supports."},{"question":"How do I keep sensitive tables out of Slack?","answer":"Restrict DATA_ANALYST_ALLOWED_SCHEMAS to reporting schemas, list sensitive tables in DATA_ANALYST_BLOCKED_TABLES, and grant the database role SELECT only on safe tables. Blocked tables are hidden from schema listings and rejected in queries, but remember anything the role can read could surface in a channel."},{"question":"What are the query limits?","answer":"One statement per request, SELECT or WITH only, at most 1000 rows (200 by default), a statement timeout capped at 60 seconds (10 by default), and a connection pool of 3. run_sql blocks unqualified pg_catalog tables and labels truncated results."}]}},"files":[{"path":"agent/agent.ts","type":"registry:file","target":"~/agent/agent.ts"},{"path":"agent/channels/slack.ts","type":"registry:file","target":"~/agent/channels/slack.ts"},{"path":"agent/instructions.md","type":"registry:file","target":"~/agent/instructions.md"},{"path":"agent/lib/postgres.ts","type":"registry:file","target":"~/agent/lib/postgres.ts"},{"path":"agent/lib/sql-policy.ts","type":"registry:file","target":"~/agent/lib/sql-policy.ts"},{"path":"agent/tools/describe_schema.ts","type":"registry:file","target":"~/agent/tools/describe_schema.ts"},{"path":"agent/tools/run_sql.ts","type":"registry:file","target":"~/agent/tools/run_sql.ts"},{"path":"evals/ambiguous-metric-clarification.eval.ts","type":"registry:file","target":"~/evals/ambiguous-metric-clarification.eval.ts"},{"path":"evals/evals.config.ts","type":"registry:file","target":"~/evals/evals.config.ts"},{"path":"evals/missing-database-url-does-not-invent.eval.ts","type":"registry:file","target":"~/evals/missing-database-url-does-not-invent.eval.ts"},{"path":"evals/read-only-refusal.eval.ts","type":"registry:file","target":"~/evals/read-only-refusal.eval.ts"},{"path":"README.md","type":"registry:file","target":"~/agent/README.md"},{"path":".env.example","type":"registry:file","target":"~/.env.example"}]},{"name":"programmatic-seo-agent","type":"registry:item","title":"Programmatic SEO Agent","description":"Weekly scheduled agent that grows a product's organic traffic with programmatic SEO: it checks the product's GitHub repository out into its sandbox, discovers and validates keyword opportunities with DataForSEO, researches each target with the Parallel web search API, generates batches of SEO-optimized pages matching the repo's content conventions, and pushes them as a pull request for human review.","author":"TommyBez","categories":["marketing"],"dependencies":["eve@^0.18.2","parallel-web@^1.1.0","zod@4.3.6"],"meta":{"slug":"programmatic-seo-agent","category":"marketing","createdAt":"2026-07-02T22:16:06.740Z","updatedAt":"2026-07-04T00:00:00.000Z","docs":{"overview":["Programmatic SEO Agent is a scheduled eve agent that grows organic traffic by shipping weekly batches of SEO-optimized pages to your product's GitHub repository. Each run clones the repo defined by PSEO_GITHUB_REPO into a Vercel sandbox, studies your product and existing content conventions, and writes new pages that match the format already in the repo, from frontmatter fields to internal-link style.","You interact with it through a cron schedule (PSEO_WEEKLY_CRON, Mondays at 07:00 UTC by default) rather than a chat channel, and everything it produces arrives as a pull request on an idempotent pseo/<year>-w<week> branch. It never merges anything, never touches files outside the configured target directory, and re-running the same week updates the existing PR instead of opening a duplicate.","What makes it useful is that every page is backed by data: keyword opportunities come from the DataForSEO Labs and Google Ads endpoints, factual claims are grounded in Parallel web search excerpts with provenance, and a bundled programmatic-seo skill enforces a quality bar that drops thin doorway pages. A week with no keywords above the volume threshold is deliberately skipped, not padded."],"howItWorks":["At session start the sandbox clones PSEO_GITHUB_REPO into /workspace/repo with credential brokering: the GitHub token is injected at the sandbox firewall as Basic auth on github.com and Bearer auth on api.github.com, so it never enters the sandbox process or any command line.","The agent loads the programmatic-seo skill, reads the repo's README, marketing pages, and existing content under PSEO_TARGET_DIR to learn the product, its personas, and the exact page format to reproduce.","It derives seed keywords from the product context and calls the discover_keywords tool, which queries the DataForSEO Labs keyword_ideas endpoint and returns up to 200 ideas with search volume, difficulty, intent, and CPC.","It designs one or two repeatable page patterns, enumerates the exact keyword permutations, and runs them through validate_keywords, which checks real Google Ads search volumes and flags anything below PSEO_MIN_SEARCH_VOLUME (default 30) for removal.","For each surviving keyword, capped at PSEO_MAX_PAGES_PER_RUN (default 20), the research_keyword tool calls the Parallel Search API with 2-3 focused queries and returns ranked excerpts with URLs, so every factual claim on a page traces back to a source.","Finally it writes one page per keyword into the checkout, commits on the pseo/<year>-w<week> branch, pushes, and opens or updates a pull request via the GitHub REST API, with the PR body listing each page's keyword, search volume, playbook pattern, and research sources for human review."],"useCases":[{"title":"Comparison and alternative pages for a developer tool","body":"Point the agent at your docs or marketing repo and let it build a validated set of product-vs-competitor and alternatives pages, each grounded in Parallel research and linked hub-and-spoke so authority consolidates instead of fragmenting."},{"title":"Integration and use-case landing pages","body":"For products with many integrations or personas, the agent enumerates permutations like product for persona or product with tool, validates each against real Google Ads volumes, and only writes pages for queries people actually search."},{"title":"Steady content pipeline without hiring","body":"A small team gets up to 20 reviewed, data-backed pages per week as pull requests. The human review gate stays in place: you read the PR, edit or reject pages, and merge on your own terms."},{"title":"Glossary and long-tail coverage for a niche domain","body":"Using the skill's playbook catalog, the agent can build glossary or how-to page sets around your domain's terminology, skipping weeks when nothing clears the volume bar rather than shipping index bloat."}],"requirements":[{"name":"PSEO_GITHUB_REPO","body":"The product repository that receives generated pages, in owner/repo form. The sandbox clones it at session start and the weekly PR is opened against its default branch."},{"name":"PSEO_GITHUB_TOKEN","body":"Fine-grained GitHub personal access token (or GitHub App installation token) with Contents and Pull requests read/write on that repo. It is brokered at the sandbox firewall and never enters the sandbox process."},{"name":"DATAFORSEO_LOGIN","body":"DataForSEO API login from app.dataforseo.com/api-access, used with DATAFORSEO_PASSWORD as Basic auth by the discover_keywords and validate_keywords tools."},{"name":"DATAFORSEO_PASSWORD","body":"DataForSEO API password paired with DATAFORSEO_LOGIN. DataForSEO bills per request for the keyword_ideas and Google Ads search_volume endpoints the agent calls."},{"name":"PARALLEL_API_KEY","body":"API key from platform.parallel.ai for the Parallel Search API used by research_keyword. Search mode and result count are tunable via PSEO_SEARCH_MODE (turbo, basic, or advanced) and PSEO_SEARCH_MAX_RESULTS."},{"name":"PSEO_TARGET_DIR","body":"Directory inside the product repo where generated pages are written, defaulting to content/programmatic. The agent only stages files under this directory and never modifies existing files."},{"name":"PSEO_WEEKLY_CRON","body":"Optional 5-field cron expression for the weekly run, defaulting to 0 7 * * 1 (Mondays 07:00 UTC on Vercel). Related tuning knobs: PSEO_MAX_PAGES_PER_RUN, PSEO_MIN_SEARCH_VOLUME, PSEO_LOCATION_CODE, PSEO_LANGUAGE_CODE."}],"faqs":[{"question":"How do I install and run it?","answer":"Install with npx shadcn@latest add @evex/programmatic-seo-agent, copy .env.example into your eve app environment, and fill in the GitHub, DataForSEO, and Parallel credentials. In development you can trigger a run immediately by POSTing to /eve/v1/dev/schedules/weekly-programmatic-seo instead of waiting for the cron."},{"question":"Can it merge changes or modify existing files in my repo?","answer":"No. The agent only writes new pages under PSEO_TARGET_DIR, commits to pseo/<year>-w<week> branches, and opens a pull request. It never pushes to the default branch and never merges; a human reviews every PR. Branch protection on the default branch remains your responsibility."},{"question":"Which model does it use and can I change it?","answer":"The agent is defined with zai/glm-5.2 in agent/agent.ts. Since the eve agent definition is a one-line defineAgent call installed into your codebase, you can swap the model by editing that file."},{"question":"What happens when no keyword is worth a page?","answer":"The run is skipped and reported as such. If nothing clears PSEO_MIN_SEARCH_VOLUME after deduplication and coverage checks against existing repo content, the agent stops without committing or opening a PR. Three bundled evals verify this behavior, including that volumes are never fabricated."},{"question":"How do I control batch size, market, and research depth?","answer":"PSEO_MAX_PAGES_PER_RUN caps each batch at 20 pages by default, PSEO_MIN_SEARCH_VOLUME sets the demand floor at 30 monthly searches, PSEO_LOCATION_CODE and PSEO_LANGUAGE_CODE localize keyword data (defaults 2840 and en for the US), and PSEO_SEARCH_MODE plus PSEO_SEARCH_MAX_RESULTS tune Parallel research per keyword."}]}},"files":[{"path":"agent/agent.ts","type":"registry:file","target":"~/agent/agent.ts"},{"path":"agent/instructions.md","type":"registry:file","target":"~/agent/instructions.md"},{"path":"agent/lib/dataforseo.ts","type":"registry:file","target":"~/agent/lib/dataforseo.ts"},{"path":"agent/lib/pseo-config.ts","type":"registry:file","target":"~/agent/lib/pseo-config.ts"},{"path":"agent/sandbox.ts","type":"registry:file","target":"~/agent/sandbox.ts"},{"path":"agent/schedules/weekly-programmatic-seo.ts","type":"registry:file","target":"~/agent/schedules/weekly-programmatic-seo.ts"},{"path":"agent/skills/programmatic-seo/references/keyword-research.md","type":"registry:file","target":"~/agent/skills/programmatic-seo/references/keyword-research.md"},{"path":"agent/skills/programmatic-seo/references/page-quality.md","type":"registry:file","target":"~/agent/skills/programmatic-seo/references/page-quality.md"},{"path":"agent/skills/programmatic-seo/references/playbooks.md","type":"registry:file","target":"~/agent/skills/programmatic-seo/references/playbooks.md"},{"path":"agent/skills/programmatic-seo/SKILL.md","type":"registry:file","target":"~/agent/skills/programmatic-seo/SKILL.md"},{"path":"agent/tools/discover_keywords.ts","type":"registry:file","target":"~/agent/tools/discover_keywords.ts"},{"path":"agent/tools/research_keyword.ts","type":"registry:file","target":"~/agent/tools/research_keyword.ts"},{"path":"agent/tools/validate_keywords.ts","type":"registry:file","target":"~/agent/tools/validate_keywords.ts"},{"path":"evals/evals.config.ts","type":"registry:file","target":"~/evals/evals.config.ts"},{"path":"evals/low-volume-run-is-skipped.eval.ts","type":"registry:file","target":"~/evals/low-volume-run-is-skipped.eval.ts"},{"path":"evals/missing-config-does-not-publish.eval.ts","type":"registry:file","target":"~/evals/missing-config-does-not-publish.eval.ts"},{"path":"evals/no-fabricated-volumes.eval.ts","type":"registry:file","target":"~/evals/no-fabricated-volumes.eval.ts"},{"path":"README.md","type":"registry:file","target":"~/agent/README.md"},{"path":".env.example","type":"registry:file","target":"~/.env.example"}]},{"name":"supabase-data-analyst","type":"registry:item","title":"Supabase Data Analyst","description":"A Slack-native Eve analyst for a single Supabase project that only runs read-only SQL queries. It exposes just supabase__list_tables and supabase__execute_sql through an MCP client connection to the hosted Supabase MCP server; no write, migration, Edge Function, branch, storage, logs, advisors, account, or docs tools are available.","author":"TommyBez","categories":["data"],"dependencies":["@vercel/connect@^0.2.6","eve@^0.18.2"],"meta":{"slug":"supabase-data-analyst","category":"data","createdAt":"2026-06-26T00:00:00.000Z","updatedAt":"2026-07-04T00:00:00.000Z","docs":{"overview":["Supabase Data Analyst is an eve agent that lives in Slack and answers questions about a single Supabase project with read-only SQL. Mention it in a channel or send it a DM, and it inspects your schema, writes one focused query, runs it through the hosted Supabase MCP server, and replies with an aggregate answer in plain language instead of raw row dumps.","The agent is deliberately narrow: it exposes exactly two tools, supabase__list_tables for schema inspection and supabase__execute_sql for read-only SELECT queries. The MCP connection is pinned to read_only=true and features=database, a client-side allow list hides every other database tool, and the config loader rejects any attempt to set SUPABASE_DATA_ANALYST_READ_ONLY to false or request other feature groups at startup.","It is also scoped to one project by design. SUPABASE_DATA_ANALYST_PROJECT_REF is required whenever the MCP URL points at the hosted endpoint, so your account-level Supabase personal access token can never reach other projects in the account. That makes it a safe way to give a team self-serve analytics over a development or preview database."],"howItWorks":["A teammate mentions the agent in a Slack channel or DMs it; events arrive on the /eve/v1/slack route through a Vercel Connect Slack client identified by SUPABASE_DATA_ANALYST_SLACK_CONNECT_UID.","The model, zai/glm-5.2, uses eve's built-in connection_search to discover the Supabase MCP connection, where only list_tables and execute_sql are visible thanks to the tools.allow list in agent/connections/supabase.ts.","For unfamiliar tables it first calls supabase__list_tables to inspect the schema, and asks a clarifying question if the metric, time range, or grain is ambiguous.","It then writes a single read-only SQL query and runs it with supabase__execute_sql against the hosted server at https://mcp.supabase.com/mcp, authenticated with your Supabase personal access token and scoped by project_ref, read_only=true, and features=database.","It interprets the result for Slack, stating assumptions, filters, units, and date windows, and it never pastes API keys, service role keys, or access tokens into the channel even if a query returns them.","Two bundled evals enforce this contract: one checks the agent refuses migration requests and proposes a read-only alternative, the other checks it redacts a leaked API key when summarizing query results."],"useCases":[{"title":"Self-serve product metrics in Slack","body":"Let product managers ask questions like total signups by month for the last 6 months directly in a channel. The agent inspects the schema, runs one aggregate SELECT, and replies with the numbers plus the assumptions it made."},{"title":"Schema exploration for new teammates","body":"New engineers can DM the agent to ask which tables exist and how they relate. supabase__list_tables gives them an instant map of a development project without dashboard access or a local database connection."},{"title":"Safe analytics over a preview branch","body":"Point the agent at a development project or preview branch and give a whole workspace query access with no write risk: reads are enforced server-side by read_only=true and client-side by the two-tool allow list."},{"title":"Guardrailed alternative to raw SQL access","body":"Instead of sharing database credentials, teams get an analyst that refuses writes, migrations, and admin operations by design, and suggests a read-only alternative whenever someone asks for something it cannot do."}],"requirements":[{"name":"SUPABASE_DATA_ANALYST_ACCESS_TOKEN","body":"A Supabase personal access token used as the Bearer token on every MCP request. Generate it in your Supabase account settings and name it for this agent. Startup fails without it."},{"name":"SUPABASE_DATA_ANALYST_PROJECT_REF","body":"The ref of the one project the agent may query, copied from the Supabase dashboard URL or project settings. Required for the hosted MCP server; optional only when the MCP URL points at a local Supabase CLI server."},{"name":"SUPABASE_DATA_ANALYST_MCP_URL","body":"The Supabase MCP endpoint, defaulting to https://mcp.supabase.com/mcp. Override it with http://localhost:54321/mcp to develop against a local Supabase CLI MCP server."},{"name":"SUPABASE_DATA_ANALYST_READ_ONLY","body":"Must be true (the default). The config loader rejects false at startup, so every query executes as a read-only Postgres user on the server side."},{"name":"SUPABASE_DATA_ANALYST_FEATURES","body":"Must be database (the default). Any other Supabase MCP feature group is rejected at startup because those groups expose non-query operations like migrations, Edge Functions, and account management."},{"name":"SUPABASE_DATA_ANALYST_SLACK_CONNECT_UID","body":"The Vercel Connect UID for the Slack client, created with vercel connect create slack --triggers and attached to the /eve/v1/slack route. Defaults to slack/supabase-data-analyst."},{"name":"@vercel/connect and eve","body":"Runtime dependencies: eve ^0.18.2 provides the agent framework, Slack channel, and MCP client connection; @vercel/connect ^0.2.6 supplies the Slack credentials via connectSlackCredentials. Node 24 or newer is required."}],"faqs":[{"question":"How do I install it?","answer":"Run npx shadcn@latest add @evex/supabase-data-analyst inside an existing eve app, install the listed dependencies, set the SUPABASE_DATA_ANALYST_* environment variables, deploy the app somewhere Slack can reach over HTTPS, and connect Slack with vercel connect create slack --triggers."},{"question":"Can it modify my database?","answer":"No. The MCP connection is pinned to read_only=true so the server runs every query as a read-only Postgres user, only list_tables and execute_sql pass the client-side allow list, and the config loader refuses to start if you try to disable read-only mode. A bundled eval verifies it declines migration requests."},{"question":"Which model does it use, and can I change it?","answer":"The agent is defined with zai/glm-5.2 in agent/agent.ts. Because it is a standard eve agent definition, you can swap the model string for any model your eve deployment supports and adjust agent/instructions.md to tune its analyst behavior."},{"question":"Is it safe to point at production data?","answer":"The README advises against it. Supabase MCP is designed for development and testing, and read-only access can still expose sensitive rows. Use a development project, preview branch, or obfuscated data, and only in workspaces whose members may see that data."},{"question":"Can it access other projects in my Supabase account?","answer":"No. The connection URL always sets project_ref, and the config loader fails startup if SUPABASE_DATA_ANALYST_PROJECT_REF is missing while the MCP URL points at a non-localhost host, precisely so the account-level personal access token cannot reach your other projects."}]}},"files":[{"path":"agent/agent.ts","type":"registry:file","target":"~/agent/agent.ts"},{"path":"agent/channels/slack.ts","type":"registry:file","target":"~/agent/channels/slack.ts"},{"path":"agent/connections/supabase.ts","type":"registry:file","target":"~/agent/connections/supabase.ts"},{"path":"agent/instructions.md","type":"registry:file","target":"~/agent/instructions.md"},{"path":"agent/lib/supabase-config.ts","type":"registry:file","target":"~/agent/lib/supabase-config.ts"},{"path":"evals/evals.config.ts","type":"registry:file","target":"~/evals/evals.config.ts"},{"path":"evals/secret-redaction.eval.ts","type":"registry:file","target":"~/evals/secret-redaction.eval.ts"},{"path":"evals/write-request-refusal.eval.ts","type":"registry:file","target":"~/evals/write-request-refusal.eval.ts"},{"path":"README.md","type":"registry:file","target":"~/agent/README.md"},{"path":".env.example","type":"registry:file","target":"~/.env.example"}]},{"name":"x-draft-assistant","type":"registry:item","title":"X Draft Assistant","description":"A scheduled Eve agent that scans a configured set of X (Twitter) profiles every day, surfaces hot topics from their recent posts, researches each topic with the [Parallel](https://parallel.ai/) web search API, and creates **three draft candidates** for X in [Typefully](https://typefully.com) so a human can review and publish them.","author":"TommyBez","categories":["general"],"dependencies":["eve@^0.18.2","parallel-web@^1.1.0","zod@4.3.6"],"meta":{"slug":"x-draft-assistant","category":"general","createdAt":"2026-06-26T16:19:57.402Z","updatedAt":"2026-07-04T00:00:00.000Z","docs":{"overview":["X Draft Assistant is a scheduled eve agent that turns what a watched set of X (Twitter) accounts posted in the last 24 hours into three ready-to-review draft posts in Typefully. Every day it scans the handles listed in X_HOT_TOPIC_HANDLES via the X API v2, clusters their recent posts into hot topics, researches each topic with the Parallel web search API, and writes three distinct draft candidates with cited sources.","You interact with it through a cron schedule rather than chat: the daily-x-drafts schedule fires at 08:00 UTC by default (configurable with X_HOT_TOPIC_DAILY_CRON), and the output lands as unscheduled drafts in your Typefully social set. The agent never publishes, schedules, replies, or likes anything, so a human always makes the final call on what goes live.","The safety model around draft creation is what makes this workable for teams that review before publishing. The agent previews every candidate in dry-run mode first, only creates drafts after an explicit confirmCreate flag, and attaches a per-run idempotency key to each draft so a retried step never produces a duplicate in Typefully. It labels posts with the X made-with-AI disclosure by default."],"howItWorks":["On each scheduled run, the scan_x_profiles tool pulls recent posts (excluding retweets) from every handle in X_HOT_TOPIC_HANDLES using X API v2 app-only bearer auth, scoped to the X_HOT_TOPIC_LOOKBACK_HOURS window (default 24 hours) so topics do not repeat day over day.","The agent clusters those posts into up to X_HOT_TOPIC_MAX_TOPICS hot topics (default 5), treating recurring themes, launches, debates, or posts with outsized engagement as candidates and merging near-duplicates.","For each topic, the research_hot_topics tool queries the Parallel Search API with 2-3 focused keyword queries and returns up to X_HOT_TOPIC_SEARCH_MAX_RESULTS ranked web sources with provenance, in turbo, basic, or advanced mode.","Before drafting, the agent loads two skills: typefully-best-practices for X automation compliance and the exactly-once creation model, and social for hook formulas, post templates, and platform limits.","It then writes exactly X_HOT_TOPIC_DRAFT_COUNT (default 3) distinct candidates, each a single tweet or a 1-5 post thread within the 280-character limit, citing only post URLs returned by scan_x_profiles, and previews everything with preview_x_draft.","Finally, create_x_drafts creates the drafts in Typefully only when called with confirmCreate true and a unique idempotency key per draft; a bundled eval suite verifies the confirmation gate, the no-retry rule on failed creates, and that missing configuration never results in created drafts."],"useCases":[{"title":"Daily content pipeline for a startup account","body":"Watch your own company handle plus a few competitors and ecosystem accounts. Each morning three researched draft candidates appear in Typefully, so whoever runs the account starts the day choosing between angles instead of staring at a blank composer."},{"title":"Riding launch and announcement waves","body":"Point X_HOT_TOPIC_HANDLES at accounts like vercel or anthropicai. When they ship something, the agent surfaces it as a hot topic, backs it with Parallel web sources, and drafts commentary while the news is still fresh."},{"title":"Developer relations topic monitoring","body":"A DevRel team tracks framework maintainers and community voices. The agent condenses the last 24 hours into at most five topics with cited sources, giving the team both draft posts and a quick research digest per run."},{"title":"Compliance-safe AI drafting","body":"Because the agent never publishes or schedules drafts, labels them with the X made-with-AI disclosure by default, and deduplicates them with idempotency keys, teams with review requirements can adopt LLM drafting without risking unreviewed or duplicate posts."}],"requirements":[{"name":"X_BEARER_TOKEN","body":"App-only bearer token used to read public posts through the X API v2. Create an app in the X Developer Console and copy its bearer token."},{"name":"X_HOT_TOPIC_HANDLES","body":"Comma-separated list of X handles to scan, with or without the @ prefix (for example vercel,parallel_ai,anthropicai). The agent stops and reports missing configuration if this is empty."},{"name":"PARALLEL_API_KEY","body":"API key for the Parallel Search API, used to research each hot topic with ranked web sources. Get one at platform.parallel.ai."},{"name":"TYPEFULLY_API_KEY","body":"Typefully API key used to create drafts and manage tags. Generate it from the API section of your Typefully settings at typefully.com/?settings=api."},{"name":"TYPEFULLY_SOCIAL_SET_ID","body":"The Typefully social set (account) the drafts are created under. Find it by listing your social sets via the Typefully API or copying it from the Typefully URL for that account."},{"name":"X_HOT_TOPIC_DAILY_CRON","body":"Optional 5-field cron expression controlling when the daily run fires, evaluated in UTC on Vercel. Defaults to 0 8 * * * (08:00 UTC daily)."},{"name":"X_HOT_TOPIC_DRAFT_TAG","body":"Optional Typefully tag slug attached to every created draft. If the tag does not exist yet, the agent can list tags and create it on demand. Leave empty to skip tagging."}],"faqs":[{"question":"How do I install and run it?","answer":"Install with npx shadcn@latest add @evex/x-draft-assistant, copy .env.example into your eve app environment, and fill in the X, Parallel, and Typefully credentials plus at least one handle. In dev you can trigger a run manually by POSTing to /eve/v1/dev/schedules/daily-x-drafts."},{"question":"Can it publish or schedule posts on X?","answer":"No, by design. The agent only creates drafts in Typefully in draft status; it never publishes, schedules, replies, likes, or reposts. A human reviews the three candidates in Typefully and decides what to publish."},{"question":"Which model does the agent use?","answer":"The agent config sets deepseek/deepseek-v4-flash as the model in agent.ts. Since it is a standard eve agent definition, you can swap in another model supported by your eve deployment by editing that single line."},{"question":"How does it avoid creating duplicate drafts?","answer":"Creation is a two-step operation: preview_x_draft first, then create_x_drafts with confirmCreate true and a unique idempotency key per draft, derived from the run's lookback window start. Replays within the same Node process return the cached result instead of posting again; replays across a serverless cold start can still re-post, which a durable store would be needed to close."},{"question":"What limits and quotas should I know about?","answer":"Posts per profile are clamped between 5 and the X API maximum of 100 (default 20), topics per run default to 5, and each post respects the 280-character X limit. If Typefully returns a 429 rate limit, the agent does not retry in the same step; it defers to a later run reusing the same idempotency keys."}]}},"files":[{"path":"agent/agent.ts","type":"registry:file","target":"~/agent/agent.ts"},{"path":"agent/instructions.md","type":"registry:file","target":"~/agent/instructions.md"},{"path":"agent/lib/hot-topic-config.ts","type":"registry:file","target":"~/agent/lib/hot-topic-config.ts"},{"path":"agent/lib/typefully-client.ts","type":"registry:file","target":"~/agent/lib/typefully-client.ts"},{"path":"agent/schedules/daily-x-drafts.ts","type":"registry:file","target":"~/agent/schedules/daily-x-drafts.ts"},{"path":"agent/skills/social/references/platform-limits.md","type":"registry:file","target":"~/agent/skills/social/references/platform-limits.md"},{"path":"agent/skills/social/references/post-templates.md","type":"registry:file","target":"~/agent/skills/social/references/post-templates.md"},{"path":"agent/skills/social/SKILL.md","type":"registry:file","target":"~/agent/skills/social/SKILL.md"},{"path":"agent/skills/typefully-best-practices/references/exactly-once.md","type":"registry:file","target":"~/agent/skills/typefully-best-practices/references/exactly-once.md"},{"path":"agent/skills/typefully-best-practices/references/x-automation.md","type":"registry:file","target":"~/agent/skills/typefully-best-practices/references/x-automation.md"},{"path":"agent/skills/typefully-best-practices/SKILL.md","type":"registry:file","target":"~/agent/skills/typefully-best-practices/SKILL.md"},{"path":"agent/tools/create_typefully_tag.ts","type":"registry:file","target":"~/agent/tools/create_typefully_tag.ts"},{"path":"agent/tools/create_x_drafts.ts","type":"registry:file","target":"~/agent/tools/create_x_drafts.ts"},{"path":"agent/tools/list_typefully_tags.ts","type":"registry:file","target":"~/agent/tools/list_typefully_tags.ts"},{"path":"agent/tools/preview_x_draft.ts","type":"registry:file","target":"~/agent/tools/preview_x_draft.ts"},{"path":"agent/tools/research_hot_topics.ts","type":"registry:file","target":"~/agent/tools/research_hot_topics.ts"},{"path":"agent/tools/scan_x_profiles.ts","type":"registry:file","target":"~/agent/tools/scan_x_profiles.ts"},{"path":"evals/create-confirmation.eval.ts","type":"registry:file","target":"~/evals/create-confirmation.eval.ts"},{"path":"evals/evals.config.ts","type":"registry:file","target":"~/evals/evals.config.ts"},{"path":"evals/failed-create-no-retry.eval.ts","type":"registry:file","target":"~/evals/failed-create-no-retry.eval.ts"},{"path":"evals/missing-config-does-not-create.eval.ts","type":"registry:file","target":"~/evals/missing-config-does-not-create.eval.ts"},{"path":"evals/x-draft-assistant.eval.ts","type":"registry:file","target":"~/evals/x-draft-assistant.eval.ts"},{"path":"README.md","type":"registry:file","target":"~/agent/README.md"},{"path":".env.example","type":"registry:file","target":"~/.env.example"}]},{"name":"x-hot-topic-digest","type":"registry:item","title":"X Hot Topic Digest","description":"A scheduled Eve agent that scans a configured set of X (Twitter) profiles every day, surfaces hot topics from their recent posts, researches each topic with the [Parallel](https://parallel.ai/) web search API, and delivers an HTML digest by email through [Resend](https://resend.com).","author":"TommyBez","categories":["research"],"dependencies":["eve@^0.18.2","parallel-web@^1.1.0","resend@^6.14.0","zod@4.3.6"],"meta":{"slug":"x-hot-topic-digest","category":"research","createdAt":"2026-06-26T09:40:22.348Z","updatedAt":"2026-07-04T00:00:00.000Z","docs":{"overview":["X Hot Topic Digest is a scheduled eve agent that watches a list of X (Twitter) profiles you configure and turns their recent posts into a researched daily briefing. It runs unattended on a cron schedule (X_HOT_TOPIC_DAILY_CRON, default 0 8 * * * UTC), reads only public posts through the X API v2 with an app-only bearer token, and never posts anything back to X.","Each run scans up to 20 recent posts per handle inside a configurable lookback window (default 24 hours), clusters them into at most 5 hot topics by recurrence and engagement, and researches every topic with the Parallel web search API to attach ranked sources with titles, URLs, and excerpts. The result is a single accessible HTML email delivered through Resend to your configured recipients.","You interact with it through configuration and your inbox: set the handles, schedule, and recipients in environment variables, and the digest arrives by email. The agent gates every send: it previews the email first and only sends with an explicit confirmation flag plus an idempotency key, so a replayed run never delivers the same digest twice."],"howItWorks":["On the daily-hot-topic-digest schedule (cron from X_HOT_TOPIC_DAILY_CRON, default 08:00 UTC), the agent loads the bundled email-best-practices skill before drafting anything.","It calls the scan_x_profiles tool, which resolves each handle in X_HOT_TOPIC_HANDLES via X API v2, fetches recent posts excluding retweets, and filters them to the X_HOT_TOPIC_LOOKBACK_HOURS window along with like, reply, repost, and impression counts.","From those posts it surfaces up to X_HOT_TOPIC_MAX_TOPICS recurring themes, announcements, or high-engagement signals, clustering near-duplicate posts into a single topic.","For each topic it calls research_hot_topics, which sends 2 to 3 focused keyword queries to the Parallel Search API in the configured mode (turbo, basic, or advanced) and returns ranked results with URLs, titles, publish dates, and excerpts.","It composes one HTML email with a per-topic takeaway, the originating X posts with links, and the research sources, then calls preview_digest_email to review the exact sender, recipients, subject, and HTML before anything is sent.","Finally it calls send_digest_email with confirmSend set to true and a date-derived idempotency key that is forwarded to Resend as the Idempotency-Key header; four bundled evals verify the digest flow, send confirmation, failed-send reporting, and that missing configuration blocks delivery."],"useCases":[{"title":"Daily competitor and ecosystem watch","body":"Track the X accounts of competitors, partners, and platform vendors and get one morning email that names what they announced, how much engagement it drew, and what independent web sources say about it."},{"title":"Founder or investor market signal briefing","body":"Watch a curated list of founders, VCs, and analysts and receive up to five clustered topics per day, each backed by Parallel research sources, instead of scrolling timelines yourself."},{"title":"Developer relations trend monitoring","body":"Follow framework maintainers and developer advocates to catch launches, RFC debates, and breaking-change chatter early, with links back to the original posts and supporting articles for your team."},{"title":"Team newsletter without the manual curation","body":"Point X_HOT_TOPIC_DIGEST_TO at a team alias and let the agent produce an accessible HTML digest daily; the 24-hour lookback window keeps topics from repeating day over day."}],"requirements":[{"name":"X_BEARER_TOKEN","body":"App-only bearer token from the X Developer Console. Used to resolve handles and read public posts via X API v2; the agent stops with an authRequired error if it is missing."},{"name":"X_HOT_TOPIC_HANDLES","body":"Comma-separated X handles to scan, with or without the @ prefix, for example vercel,parallel_ai,anthropicai. With no handles configured the run reports the missing configuration instead of inventing profiles."},{"name":"PARALLEL_API_KEY","body":"API key for the Parallel Search API, created at platform.parallel.ai. Powers the research_hot_topics tool that attaches ranked web sources to each topic."},{"name":"RESEND_API_KEY","body":"Resend API key used by send_digest_email to deliver the HTML digest. The idempotency key is passed to Resend so retried sends are deduplicated."},{"name":"X_HOT_TOPIC_DIGEST_FROM","body":"Sender address for the digest; it must be verified in Resend or delivery fails. Recipients and sender cannot be overridden through tool input."},{"name":"X_HOT_TOPIC_DIGEST_TO","body":"Comma-separated recipient addresses. Optional tuning variables include X_HOT_TOPIC_DAILY_CRON, X_HOT_TOPIC_LOOKBACK_HOURS, X_HOT_TOPIC_MAX_TWEETS_PER_PROFILE, X_HOT_TOPIC_MAX_TOPICS, X_HOT_TOPIC_SEARCH_MAX_RESULTS, X_HOT_TOPIC_SEARCH_MODE, and X_HOT_TOPIC_DIGEST_SUBJECT."}],"faqs":[{"question":"How do I install and run it?","answer":"Install with npx shadcn@latest add @evex/x-hot-topic-digest, copy .env.example into your eve app environment, fill in the X, Parallel, and Resend credentials plus handles and recipients, then trigger the schedule in dev with a POST to /eve/v1/dev/schedules/daily-hot-topic-digest."},{"question":"Can it accidentally send duplicate or unwanted emails?","answer":"No. send_digest_email refuses to send unless confirmSend is true, and every send requires a stable idempotency key derived from the digest date. The key is cached in the tool and forwarded to Resend as the Idempotency-Key header, so a replayed eve step returns the recorded result instead of sending again."},{"question":"Which model does the agent use?","answer":"The agent is defined with openai/gpt-5.4-mini in agent/agent.ts. You can change the model there after installing; the tools, schedule, and instructions are plain TypeScript and Markdown files you own in your project."},{"question":"How do I control how much it scans and researches?","answer":"Tune the environment variables: lookback window defaults to 24 hours, up to 20 posts per profile, at most 5 topics per run, and 5 Parallel results per topic. X_HOT_TOPIC_SEARCH_MODE switches Parallel between turbo, basic, and advanced search."},{"question":"Does it post to X or need write access?","answer":"No. The agent only reads public posts with app-only bearer auth and explicitly excludes retweets. Its guardrails forbid posting to X, and every citation in the digest must come from a tool result, so URLs, excerpts, and post ids are never fabricated."}]}},"files":[{"path":"agent/agent.ts","type":"registry:file","target":"~/agent/agent.ts"},{"path":"agent/instructions.md","type":"registry:file","target":"~/agent/instructions.md"},{"path":"agent/lib/hot-topic-config.ts","type":"registry:file","target":"~/agent/lib/hot-topic-config.ts"},{"path":"agent/schedules/daily-hot-topic-digest.ts","type":"registry:file","target":"~/agent/schedules/daily-hot-topic-digest.ts"},{"path":"agent/skills/email-best-practices/references/accessibility.md","type":"registry:file","target":"~/agent/skills/email-best-practices/references/accessibility.md"},{"path":"agent/skills/email-best-practices/references/sending-reliability.md","type":"registry:file","target":"~/agent/skills/email-best-practices/references/sending-reliability.md"},{"path":"agent/skills/email-best-practices/SKILL.md","type":"registry:file","target":"~/agent/skills/email-best-practices/SKILL.md"},{"path":"agent/tools/preview_digest_email.ts","type":"registry:file","target":"~/agent/tools/preview_digest_email.ts"},{"path":"agent/tools/research_hot_topics.ts","type":"registry:file","target":"~/agent/tools/research_hot_topics.ts"},{"path":"agent/tools/scan_x_profiles.ts","type":"registry:file","target":"~/agent/tools/scan_x_profiles.ts"},{"path":"agent/tools/send_digest_email.ts","type":"registry:file","target":"~/agent/tools/send_digest_email.ts"},{"path":"evals/evals.config.ts","type":"registry:file","target":"~/evals/evals.config.ts"},{"path":"evals/failed-send-not-delivered.eval.ts","type":"registry:file","target":"~/evals/failed-send-not-delivered.eval.ts"},{"path":"evals/hot-topic-digest.eval.ts","type":"registry:file","target":"~/evals/hot-topic-digest.eval.ts"},{"path":"evals/missing-config-does-not-send.eval.ts","type":"registry:file","target":"~/evals/missing-config-does-not-send.eval.ts"},{"path":"evals/send-confirmation.eval.ts","type":"registry:file","target":"~/evals/send-confirmation.eval.ts"},{"path":"README.md","type":"registry:file","target":"~/agent/README.md"},{"path":".env.example","type":"registry:file","target":"~/.env.example"}]}]}