Show HN: VAEN – Package and import portable AI coding-agent Harnesses VAEN, a portable command-line tool for packaging and importing portable AI coding-agent configurations, has been released. The tool bundles instructions, skills, and MCP declarations into an OCI-backed `.agent` archive that can be imported into another repository without transporting secrets, addressing the gap between simple file transfer and explicit setup handoffs. VAEN is a portable CLI for packaging and importing agentic coding setups. It takes an agent.yaml manifest, bundles instructions, skills, and project-scoped MCP declarations into an OCI-backed .agent archive, and imports that setup into another repository without transporting secrets. Watch the 24-second flow: docs/assets/vaen-demo.mp4 /sjhalani7/vaen/blob/main/docs/assets/vaen-demo.mp4 vaen validate -f agent.yaml vaen build -f agent.yaml -o team-setup.agent vaen inspect team-setup.agent vaen import team-setup.agent --client codex vaen doctor --client codex VAEN packages configuration and authoring files, not runtime environments. - Main instructions and optional instruction includes - Skill directories and their files - Project-scoped MCP declarations - Bundle metadata used for import, inspection, and validation VAEN never packages credential values, .env files, private keys, OAuth state, or MCP server implementations. A zip file can move files, but it does not explain what the setup is, what should be imported, where files should land, or which credential variable names the receiver must provide locally. VAEN keeps that handoff explicit: agent.yaml declares the instructions, skills, MCP declarations, and required variable names. vaen validate catches malformed manifests before sharing. vaen inspect lets the receiver review bundle contents before import. vaen import materializes the setup into predictable client-specific locations. vaen doctor checks the imported structure without reading credential values. Install from GitHub with pipx : pipx install git+https://github.com/sjhalani7/vaen.git Or install from a local clone: python3 -m venv .venv . .venv/bin/activate pip install -e . The CLI provides: python vaen validate vaen build vaen inspect vaen import vaen doctor vaen cleanup See docs/quick-start.md /sjhalani7/vaen/blob/main/docs/quick-start.md for a minimal instructions-only bundle flow. The dist/agents/ /sjhalani7/vaen/blob/main/dist/agents directory contains ready-to-import .agent archives for popular, reputable public agent setups.Current packages: — complete promoted skill set from mattpocock-skills.agent mattpocock/skills — engineering skills mattpocock-engineering.agent — productivity skills mattpocock-productivity.agent — misc utility skills mattpocock-misc.agent See dist/agents/README.md /sjhalani7/vaen/blob/main/dist/agents/README.md for import commands and attribution. agent.yaml is the source of truth for a bundle. version: "0.1" publisher: "Shiv Jhalani" instructions: main: "~/.codex/AGENTS.md" includes: - "./style.md" artifacts: - type: skills path: "~/.codex/skills/code-review" - type: skills path: "~/.codex/skills/refactor" requiredVars: - OPENAI API KEY mcp: servers: - name: context7 transport: stdio command: npx args: "-y", "@upstash/context7-mcp" env vars: - CONTEXT7 API KEY - name: docs transport: http url: https://example.com/mcp http headers: X-Region: us-east-1 bearer token env var: DOCS MCP TOKEN header env vars: X-API-Key: DOCS MCP TOKEN Manifest rules: version , publisher , and instructions.main are required. instructions.includes is optional. artifacts is a list and may be empty for instructions-only bundles. skills is the supported artifact type. requiredVars and MCP env fields store environment variable names only, never values.- Manifest authors are responsible for writing names such as OPENAI API KEY , not credential values such as API keys, tokens, URLs with passwords, or NAME=value assignments. http headers stores non-secret static HTTP headers for MCP servers. mcp is optional and lives at the top level of the manifest.- Source paths may point inside or outside the repo. Correct: requiredVars: - OPENAI API KEY mcp: servers: - name: docs transport: http url: https://example.com/mcp bearer token env var: DOCS MCP TOKEN Incorrect: requiredVars: - OPENAI API KEY=sk-proj-secret - sk-proj-secret mcp: servers: - name: docs transport: http url: https://user:password@example.com/mcp bearer token env var: sk-proj-secret MCP support is host-neutral in the manifest. During import, VAEN writes the selected client format for Codex, Claude Code, or Copilot. Instructions only: version: "0.1" publisher: "Your Name" instructions: main: "./AGENTS.md" artifacts: instructions.main points to AGENTS.md or another main agent instruction file. Instructions with skills: version: "0.1" publisher: "Your Name" instructions: main: "./AGENTS.md" includes: - "./style.md" artifacts: - type: skills path: "./skills/code-review" - type: skills path: "./skills/refactor" instructions.includes is for extra Markdown instruction/context files.- Each artifacts entry points to one skill directory. MCP servers: version: "0.1" publisher: "Your Name" instructions: main: "./AGENTS.md" artifacts: mcp: servers: - name: context7 transport: stdio command: npx args: "-y", "@upstash/context7-mcp" env vars: - CONTEXT7 API KEY - name: figma transport: http url: "https://mcp.figma.com/mcp" bearer token env var: FIGMA OAUTH TOKEN http headers: X-Figma-Region: us-east-1 name is the local MCP server name. transport is either stdio or http . command and args define how stdio MCP servers are launched. url defines the HTTP MCP endpoint. env vars and bearer token env var contain environment variable names only, never secret values. http headers contains non-secret static headers. vaen validate -f examples/synthetic-fixture/agent.yaml vaen build -f examples/synthetic-fixture/agent.yaml If -o is omitted, VAEN writes