Loading...
Loading...
Author and maintain Eve manifest files (.eve/manifest.yaml) for services, environments, pipelines, workflows, and secret interpolation. Use when changing deployment shape or runtime configuration in an Eve-compatible repo.
npx skill4agent add eve-horizon/eve-skillpacks eve-manifest-authoringschema: eve/compose/v2
project: my-project
registry: "eve" # Use managed registry by default for Eve apps
services:
api:
build:
context: ./apps/api # Build context directory
dockerfile: Dockerfile # Optional, defaults to context/Dockerfile
# image omitted by default; when build is present, Eve derives image name from service key
ports: [3000]
environment:
NODE_ENV: production
x-eve:
ingress:
public: true
port: 3000
environments:
staging:
pipeline: deploy
pipeline_inputs:
some_key: default_value
pipelines:
deploy:
steps:
- name: build
action:
type: build # Builds all services with build: config
- name: release
depends_on: [build]
action:
type: release
- name: deploy
depends_on: [release]
action:
type: deployLABEL org.opencontainers.image.source="https://github.com/YOUR_ORG/YOUR_REPO"
LABEL org.opencontainers.image.description="Service description"registry: "eve" # Eve-native registry (internal JWT auth)
registry: "none" # Disable registry handling (public images)
registry: # BYO registry (full object — see section below)
host: public.ecr.aws/w7c4v0w3
namespace: myorg
auth: { username_secret: REGISTRY_USERNAME, token_secret: REGISTRY_PASSWORD }registry:
host: public.ecr.aws/w7c4v0w3
namespace: myorg
auth:
username_secret: REGISTRY_USERNAME
token_secret: REGISTRY_PASSWORDx-eve.role: managed_dbservices:
db:
x-eve:
role: managed_db
managed:
class: db.p1
engine: postgres
engine_version: "16"${managed.db.url}schema_migrationsservices:
migrate:
image: public.ecr.aws/w7c4v0w3/eve-horizon/migrate:latest
environment:
DATABASE_URL: ${managed.db.url}
MIGRATIONS_DIR: /migrations
x-eve:
role: job
files:
- source: db/migrations
target: /migrationsdb/migrations/20260312000000_initial_schema.sqlx-eve.files/migrationspipelines:
deploy:
steps:
- name: build
action: { type: build }
- name: release
depends_on: [build]
action: { type: release }
- name: deploy
depends_on: [release]
action: { type: deploy }
- name: migrate
depends_on: [deploy]
action: { type: job, service: migrate }# docker-compose.yml
services:
migrate:
image: public.ecr.aws/w7c4v0w3/eve-horizon/migrate:latest
environment:
DATABASE_URL: postgres://app:app@db:5432/myapp
volumes:
- ./db/migrations:/migrations:ro
depends_on:
db: { condition: service_healthy }components:services:schema: eve/compose/v2imagebuildportsenvironmenthealthcheckdepends_onx-eve.external: truex-eve.connection_urlx-eve.role: jobeve-migrateservices:
api:
build:
context: ./apps/api # Build context directory
dockerfile: Dockerfile # Optional, defaults to context/Dockerfile
# image: api # optional if using build; managed registry derives this
ports: [3000]buildrelease${secret.KEY}.eve/dev-secrets.yamlenvironments.<env>.pipelinepipelineeve env deploy <env>environments.<env>.pipeline_inputseve env deploy <env> --ref <sha> --inputs '{"key":"value"}' --repo-dir ./my-app--directeve env deploy <env> --ref <sha> --direct --repo-dir ./my-appactionscriptagentaction.type: create-prworkflowsdb_accessharnessharness_profileharness_optionsconditiongitreferences/manifest.mdscopeorgfsorgdocsenvdbcloud_fsworkflows:
create-design:
scope:
orgfs: { allow_prefixes: [/groups/projects/proj-a/**] }
steps:
- name: publish
scope:
cloud_fs: { allow_mount_ids: [mount_a] }
agent: { name: publisher }scopejobs:harness_override--scope-*services:
api:
x-eve:
ingress:
public: true
port: 3000
domains: ["app.example.com", "www.example.com"] # max 10
networking:
egress: stable # default 'nat'; opt in only when a vendor needs allowlisted source IPsingress.domainsowned by environment "<A>"eve domain list|verify|status|transfer|unbind|removeeve-deploy-debuggingnetworking.egress: stablehostNetwork: truereferences/manifest.mdx-eve.brandingx-eve.autheve project syncx-eve.brandingx-eve:
branding:
app_name: "ACME Portal" # required, <=60 chars
app_logo_url: "https://app.example.com/logo.svg" # https only on emitted mail
primary_color: "#1f6feb" # six-digit hex
email_from_name: "ACME Portal" # From-name header
reply_to_email: "support@example.com"
support_email: "support@example.com"
support_url: "https://example.com/help"email_from_namereply_to_emailsupport_emailx-eve.auth.login_method: magic_linkx-eve:
auth:
login_method: magic_link # password_or_magic_link | password | magic_link
self_signup: false
invite_requires_password: falsemagic_linkPOST /auth/magic-linkself_signup: falseinvite_requires_password: false/set-passwordpassword_or_magic_linkx-eve.auth.org_access.domain_signupx-eve:
auth:
org_access:
mode: allowlist
allowed_orgs: [org_acme, org_partner]
domain_signup:
enabled: true
domains:
- { domain: acme.com, target_org: org_acme, role: member }
- { domain: partner.example, target_org: org_partner }
- { domain: "*.acme.com", target_org: org_acme } # wildcard; apex needs its own ruledomains[]target_orgtarget_orgtarget_orgallowed_orgslogin_method: passwordfree-mail.exampleoutlook.comx-eve.auth.allowed_redirect_originsx-eve:
auth:
allowed_redirect_origins:
- https://app.example.com
- https://www.example.comscheme://host[:port]http://localhost*.lvh.mecustom_domainsallowlistallowed_orgseve project auth-context <project_id>references/manifest.mdEVE_SERVICE_TOKENservices:
api:
x-eve:
permissions: [jobs:write, events:write, threads:write]references/manifest.md| Variable | Description |
|---|---|
| Internal cluster URL for server-to-server calls |
| Public ingress URL for browser-facing apps |
| The project ID |
| The organization ID |
| The environment name |
EVE_API_URLEVE_PUBLIC_API_URLenvironment${ENV_NAME}${PROJECT_ID}${ORG_ID}${ORG_SLUG}${COMPONENT_NAME}${secret.KEY}.eve/dev-secrets.yaml${managed.<service>.<field>}.eve/dev-secrets.yamlx-eve.defaultsx-eve.agentsx-eve.packsx-eve.install_agentsx-eve.agents.config_pathx-eve.agents.teams_pathx-eve.chat.config_pathx-evex-eve.api_specx-eve.api_specsx-eve.clitoolchainsreferences/integrations.mdeve integrations configureeve-auth-and-secretsx-eve:
agents:
version: 1
config_path: agents/agents.yaml
teams_path: agents/teams.yaml
chat:
config_path: agents/chat.yaml
install_agents: [claude-code, codex]
packs:
- source: ./skillpacks/my-packx-eve.clix-eve.api_spec$PATHwith_apisservices:
api:
x-eve:
api_spec:
type: openapi
cli:
name: myapp # Binary name (goes on $PATH)
bin: cli/bin/myapp # Path relative to repo root (pre-bundled)services:
api:
x-eve:
cli:
name: myapp
image: ghcr.io/org/myapp-cli:latest # Pre-built imageapi_specchmod +x/usr/local/bin/EVE_APP_API_URL_{SERVICE}EVE_JOB_TOKEN[a-z][a-z0-9-]*eden projects list# In agents.yaml
agents:
data-analyst:
name: Data Analyst
skill: analyze-data
harness_profile: claude-sonnet
toolchains: [python] # Needs python + uv
doc-processor:
name: Document Processor
skill: process-documents
harness_profile: claude-sonnet
toolchains: [media] # Needs ffmpeg + whisperpythonmediarustjavakotlinworkflows:
process-document:
steps:
- name: process
agent: doc-processor
toolchains: [media, python] # Override: needs both/opt/eve/toolchains/{name}/$PATHbase# Org admin registers Google Drive OAuth app credentials (BYOA)
eve integrations configure google-drive \
--client-id "xxx.apps.googleusercontent.com" \
--client-secret "GOCSPX-xxx"
# Connect and mount a Drive folder
eve integrations connect google-drive
eve cloud-fs mount --org org_xxx \
--provider google-drive \
--folder-id <drive-folder-id> \
--label "Shared Drive"eve cloud-fs lseve cloud-fs search--mount-patheve env diagnoseservices:
api:
x-eve:
object_store:
buckets:
- name: uploads
visibility: private
- name: avatars
visibility: public
cors:
origins: ["*"]
methods: [GET, PUT, HEAD]
max_age_seconds: 3600| Variable | Description |
|---|---|
| S3-compatible endpoint URL |
| Storage region |
| App-facing access key |
| App-facing secret key |
| Physical bucket name for each logical bucket |
| |
demo-eve-app-*uploadsavatarsexportsvisibility: publiccors.originscors.methodseve-read-eve-docsreferences/object-store-filesystem.md