The SKILL.md file has two parts: YAML frontmatter (metadata) and markdown body (the skill content).
Copy
---name: react-best-practicesdescription: React optimization patterns for code reviewlicense: MITmetadata: author: yourname---## React Best Practices### Component Design- Use functional components over class components- Memoize expensive computations with useMemo- Use useCallback for event handlers passed to child components### Performance- Avoid creating objects/arrays in render- Use React.memo for components that render often with the same props- Lazy-load routes and heavy components with React.lazy
Frontmatter fields:
Field
Required
Description
name
Yes
Skill name (lowercase, hyphens allowed)
description
Yes
What this skill teaches — also used as the trigger description for AI tools
license
No
License identifier (e.g., MIT, Apache-2.0)
metadata
No
Arbitrary key-value pairs (author, version notes, etc.)
The markdown body is the actual skill content — instructions, rules, examples, and guidelines that get injected into agent prompts at runtime.
Do not mix formats. If your directory has an orchagent.json with type: "skill", the CLI will reject it. Skills must use the SKILL.md format. Use orch skill create to set up the correct structure.
Skills are composable — agents can declare default_skills in their manifest to automatically include skill content in their prompts. See Manifest Format — Skill Composition for details.
# Create an agent (default: direct LLM, on-demand)orch init my-agent# Create a JavaScript agentorch init my-agent --language javascript# Create an agent for always-on deploymentorch init my-agent --run-mode always_on# Create a JavaScript Discord bot from templateorch init my-bot --template discord-js# Create a skillorch init my-skill --type skillcd my-agent
This creates a directory with the basic structure: orchagent.json, prompt.md, and schema.json. For tool types with --language javascript, it creates main.js and package.json instead. The manifest uses the specified type (defaulting to "prompt") with canonical fields.
The execution engine is determined by your type field: prompt → direct_llm, tool → code_runtime, agent → managed_loop. Explicit runtime.command or loop declarations override the type default. See Manifest Format for details.
The required_secrets field declares which env vars your code needs at runtime. These are matched by name against your workspace secrets vault. See Manifest Format for all options.
For agents with runtime.command or loop config that need to run continuously (Discord bots, webhook listeners, background workers), deploy as an always-on service:
Copy
# Secrets are auto-resolved from the agent's required_secretsorch service deploy yourorg/my-agent --env LOG_LEVEL=info
The platform reads required_secrets from the agent and injects them from your workspace vault. See Always-On Services for full documentation.
Agents have two distribution modes that control what non-owners can see and do:
Mode
Prompt/code visible?
orch run --local
Badge
Source Available (default)
Yes
Yes
”Source Available”
Server Only (default)
No — redacted
No — cloud only (orch run)
“Server Only”
Server-only agents (the default) redact the prompt, manifest, and skill files from public API responses. This protects your intellectual property while still letting users run the agent via orch run (cloud execution).Source-available agents expose the full prompt and code. Users can inspect, run locally, and fork into their own workspace. Use this for open/community agents where transparency builds trust.
The CLI looks for entrypoints in this order:Python:main.py, app.py, agent.py, run.py, __main__.pyJavaScript:main.js, index.js, agent.js, main.ts, index.ts, agent.tsOverride in your manifest:
package.json and package-lock.json are automatically included when a JavaScript entrypoint is detected. They are excluded from Python-only bundles to prevent monorepo conflicts. This ensures npm install runs correctly in the sandbox.
Git & IDE:
.git/, .gitignore, .gitattributes
.idea/, .vscode/, .DS_Store
Documentation:
README.md, CHANGELOG.md, LICENSE
docs/
Docker & CI:
Dockerfile, docker-compose.yml, .dockerignore
.github/, .gitlab-ci.yml, .circleci/
Tests:
tests/, test/, __tests__/
*_test.py, test_*.py, *.test.js, *.spec.ts
conftest.py, pytest.ini, coverage/
Other:
orchagent.json (read separately)
*.zip, bundle.zip
scripts/, Makefile
For custom exclusions, add a bundle section to your manifest:
By default, new agents allow local download — users can download and run them with orch run --local. To make an agent server-only (cloud execution only):
Copy
# Publish as server-only (disables local download)orch publish --no-local-download
Agent owners can always download their own agents regardless of this setting.
Use orch pull to reconstruct a local project from any published version. This is the reverse of orch publish — it downloads the manifest, prompt, schemas, and code bundle into a local directory. See CLI Commands for details.
The CLI auto-detects entrypoints: main.py, app.py, agent.py, run.py for Python; main.js, index.js, agent.js for JavaScript. If your entrypoint has a different name: