PLATFORM_SPEC.md — OpenHands (All Hands AI, formerly OpenDevin)¶
New to gald3r on this platform? Start at Use gald3r with OpenHands for a short overview before the full breakdown below.
OpenHands ships as a composable Software Agent SDK (V1) plus CLI / GUI / Cloud / Enterprise
surfaces, all driven by the same file-based extension config. As of mid-2026 OpenHands natively
supports all six gald3r-relevant extension primitives — custom slash commands, rules/context,
agents/subagents, Agent Skills, lifecycle hooks, and MCP — and bundles them through a single
redistributable Plugin unit. Critically for gald3r, OpenHands uses AGENTS.md as the
always-on instruction file (it does not require a CLAUDE.md, though CLAUDE.md / GEMINI.md
are recognized as variants), follows the extended AgentSkills SKILL.md standard, and accepts
gald3r's .claude/skills/ tree under its compatibility notes — so gald3r's Agent-Skills artifacts
are largely drop-in reusable.
Authoring path: UPDATE. Verified 2026-06-02 against https://docs.openhands.dev (see
Verification Evidence). This supersedes the prior spec (last_doc_scan: 2026-05-26, which
incorrectly marked hooks/commands as ❌ and skills/rules/MCP as ⚠️ on a Docker-sandbox framing) —
every mechanism is now confirmed NATIVE on OpenHands V1.
Surface split: the same extension config (
.agents/tree,.openhands/hooks.json,config.toml [mcp], plugins) applies uniformly across CLI, local GUI, Cloud, and Enterprise. OpenHands is also exposed as an ACP agent (Zed) and is delegatable from other agents (e.g. Hermes). The deepest extensibility (programmaticregister_agent()factories, custom tools and visualizers, theAgentFactoryregistry) is SDK/Python-level rather than file-declarative — noted inline where a capability is code-only.Directory migration (important): OpenHands is mid-migration from the legacy
.openhands/tree to the modern.agents/tree..agents/is the recommended target;.openhands/skills/and.openhands/microagents/are deprecated but still honored by older OpenHands versions in the wild. gald3r installs should write the new.agents/tree.
1. Folder Hierarchy¶
<project-root>/
├── AGENTS.md ← always-on instruction file OpenHands reads (NOT CLAUDE.md)
│ (CLAUDE.md / GEMINI.md recognized as variants)
├── config.toml ← [mcp] sse_servers / shttp_servers (+ stdio)
├── .agents/ ← RECOMMENDED modern tree
│ ├── skills/ <name>/SKILL.md ← Agent Skills (extended AgentSkills standard)
│ └── agents/ *.md ← File-Based Agents (markdown + YAML frontmatter)
├── .openhands/ ← legacy / config-side tree (still honored)
│ ├── hooks.json ← lifecycle event hooks
│ ├── skills/ ← DEPRECATED skills location
│ ├── agents/ ← agents (priority 2, after .agents/agents/)
│ └── microagents/ repo.md ← DEPRECATED always-on rules (legacy)
└── .plugin/
└── plugin.json ← Plugin manifest — bundles skills/hooks/agents/commands/MCP
User-level mirrors exist at ~/.agents/ and ~/.openhands/; project scope takes precedence over
user scope.
gald3r writes: the .agents/ tree (skills/, agents/), AGENTS.md, .openhands/hooks.json,
and config.toml [mcp] — or a single Plugin bundle carrying all of them.
OpenHands owns: the .openhands/ legacy namespace, the config.toml schema, and the
SDK-level AgentFactory / custom-tool registry (a code surface, not a gald3r-writable file store).
2. AI Instruction File¶
OpenHands reads a repository-root AGENTS.md as always-on context injected into the system
prompt at conversation start — the preferred file for repository-wide, always-on instructions.
GEMINI.md and CLAUDE.md are recognized as model-specific variants. The legacy
.openhands/microagents/repo.md serves the same always-on role (deprecated). "General Skills"
(no-frontmatter / trigger=None) are also loaded continuously as part of context.
gald3r note: write
AGENTS.mdas the canonical instruction file. Unlike Augment, OpenHands does not require aCLAUDE.md—AGENTS.mdis first-class and is the documented default.
3. Agents Support — ✅ NATIVE¶
- File-Based Agents: markdown + YAML frontmatter (
name,description,tools,model: inherit) loaded from{project}/.agents/agents/*.md(priority 1) or.openhands/agents/*.md(priority 2); registered viaregister_file_agents(). Closest analog to Claude Code subagents. - Sub-Agent Delegation: hierarchical parallel sub-agents spawned via
DelegateTool({"command": "spawn", "ids": [...]}); roles such as research / implementation / testing. A built-inexploresubagent exists. - Code path (SDK): programmatic
register_agent()factories via theAgentFactoryregistry — required for advanced multi-agent orchestration beyond the declarative markdown files. - gald3r
g-agnt-*definitions map directly to File-Based Agent files (.agents/agents/*.md). - Source: https://docs.openhands.dev/sdk/guides/agent-file-based.md
4. Skills Support — ✅ NATIVE¶
- Agent Skills on the extended AgentSkills standard:
<name>/SKILL.mdwith ascripts/+references/+assets/layout, recommended under.agents/skills/. Frontmatter:name,description,triggers,license,compatibility,metadata. - Three invocation modes: keyword
triggers:(frontmatter), agent-mediatedinvoke_skill(), and always-on (trigger=None/ no frontmatter). Every skill is also invocable as a slash command (/skill-name). - Loading priority:
.agents/skills/(recommended) >.openhands/skills/(deprecated) >.openhands/microagents/(deprecated)..claude/skills/is also accepted per plugin/skill compatibility notes. - gald3r
g-skl-*/SKILL.mdload natively — the directory layout already matches the AgentSkills convention, giving strong cross-tool portability (TRAE, CodeBuddy, etc.). - Source: https://docs.openhands.dev/sdk/guides/skill.md
5. Commands / Workflows — ✅ NATIVE¶
- Custom slash commands ship two ways: (1) Plugin
commands/<name>.mdfiles, and (2) Agent Skills exposed as/skill-name(e.g. a skill namedrandom-numberis invocable as/random-number). A slash-command menu listing skills and commands was added to the chat input (May 2026 product update). - The CLI command-reference page documents only built-in commands (
/help,/new,/skills, etc.) and does not define a standalone per-repo custom-command file — so the user-defined path is primarily Skills + Plugins, not a first-class.commands/directory. - gald3r
@g-*//g-*commands map via skills-as-commands and/or a Plugincommands/bundle. - Source: https://docs.openhands.dev/sdk/guides/plugins
6. Hooks System — ✅ NATIVE¶
- Lifecycle event hooks configured per-repo in
.openhands/hooks.json(also bundleable via a Plugin'shooks/hooks.json). Six event types: PreToolUse, PostToolUse, UserPromptSubmit, Stop, SessionStart, SessionEnd. Each hook runs a shell command with atimeoutand amatcher(tool name or*). - Event payload: JSON on stdin (
event_type,tool_name,tool_input,session_id,working_dir); a hook can block by returning{"decision": "deny", "reason", "additionalContext"}. - Works across Cloud, CLI, and local GUI — a true deterministic control layer comparable to
Claude Code hooks (block dangerous commands on PreToolUse, enforce tests/lint before Stop, inject
context on SessionStart). gald3r
g-hk-*.pyhooks wire natively; invokepython <path>directly as the shell command (post- Python port; no PowerShell involved, no wrapper needed) since hooks are shell-command based. - Source: https://docs.openhands.dev/openhands/usage/customization/hooks
7. Rules / Context — ✅ NATIVE¶
- Always-on context is
AGENTS.md(repo root, injected at conversation start) plus "General Skills" — no-frontmatter /trigger=Nonemicroagents loaded continuously.GEMINI.md/CLAUDE.mdvariants are recognized; legacy.openhands/microagents/repo.mdserves the same role (deprecated). - gald3r
g-rl-*always-apply rules map toAGENTS.mdcontent (or to General Skills for modular, always-loaded rule fragments). No.mdcper-ruleglobs:engine exists — the split is binary: always-on (AGENTS.md/ General Skills) vs. keyword-triggered (triggers:skills). - Source: https://docs.openhands.dev/overview/skills/repo.md
8. MCP Support — ✅ NATIVE¶
- Model Context Protocol with three transports — stdio, SSE, and SHTTP (Streamable HTTP) —
configured via
config.toml[mcp](sse_servers = [...],shttp_servers = [...]), the Settings > MCP UI, or a Plugin's.mcp.json. Entries may be string URLs or objects withurl/api_key/timeout. - Per-tool timeouts (1–3600s), API-key and OAuth auth (OAuth-protected servers such as Notion via the FastMCP library). A proxy (e.g. SuperGateway) is recommended over direct stdio for reliability.
- Source: https://docs.openhands.dev/openhands/usage/settings/mcp-settings
9. Plugins / Extensions Registry — distribution channel¶
- Plugins are the headline distribution unit: one bundle carries **skills + hooks + MCP servers
- agents + commands together. Layout:
.plugin/plugin.json(required),skills/<name>/SKILL.md,hooks/hooks.json,agents/<name>.md,commands/<name>.md,.mcp.json,README.md. A public extensions registry (github.com/OpenHands/extensions) and a Cloud Plugin Launcher** exist. - This single mechanism is the ideal gald3r packaging target — one OpenHands Plugin can ship the entire gald3r primitive set.
- Source: https://docs.openhands.dev/sdk/guides/plugins
Parity vs. Cursor Reference¶
OpenHands reaches full parity with the Cursor reference (g-skl-platform-cursor): native
commands, rules, agents, skills, hooks, and MCP. Caveats: (1) user-defined slash commands have
no first-class standalone file outside Plugins/Skills (/skill-name + Plugin commands/ cover
it, and the slash-menu surfacing only landed May 2026); (2) the richer agent capabilities
(programmatic register_agent(), DelegateTool parallel orchestration, custom tools/visualizers)
are SDK/Python-level, not file-declarative; (3) directory conventions are mid-migration
(.agents/ recommended vs deprecated .openhands/skills|microagents).
Reuse note (important): OpenHands reads AGENTS.md, follows the AgentSkills SKILL.md
standard, and accepts .claude/skills/ — so gald3r's Agent-Skills artifacts are largely reusable
without a separate port. The cheapest high-parity install is to write the .agents/ tree (skills
+ agents) + AGENTS.md + .openhands/hooks.json + config.toml [mcp], or ship a single Plugin
bundle.
Hook System¶
- Type: native (lifecycle event hooks)
- Config file:
.openhands/hooks.json(or Pluginhooks/hooks.json) - Events available: PreToolUse, PostToolUse, UserPromptSubmit, Stop, SessionStart, SessionEnd
- Event payload format: JSON via stdin (
event_type,tool_name,tool_input,session_id,working_dir); block via{"decision": "deny", "reason", "additionalContext"} - Command extensions: shell command +
timeout+matcher; gald3r.pyhooks run viapython <path>directly (post- Python port; no PowerShell involved, no wrapper needed) - Surfaces: Cloud, CLI, local GUI
Atypical Handling¶
- Instruction file is
AGENTS.md, notCLAUDE.md— writeAGENTS.mdas canonical;CLAUDE.md/GEMINI.mdare recognized variants, not requirements. - Directory migration: target the modern
.agents/tree;.openhands/skills/and.openhands/microagents/are deprecated (still honored by older versions). - Commands are not a first-class file — deliver via Skills-as-commands (
/skill-name) and/or a Plugincommands/directory. - Advanced agents are code-only — file-based agents cover the basics; multi-agent roles via
DelegateTool/register_agent()require Python. - Hooks are shell-command based — JSON config, stdin payload; gald3r's
g-hk-*.pyhooks run directly viapython <path>(post- Python port; no PowerShell involved, no wrapper needed).
gald3r Integration Notes¶
- Ship the
.agents/tree (skills + agents) +AGENTS.md— OpenHands discovers it; or package a single Plugin bundle (skills + hooks + agents + commands + MCP) for the registry / Cloud Plugin Launcher. - Skills load natively (AgentSkills
SKILL.md);.claude/skills/is accepted per compatibility notes, so gald3r's Agent-Skills are largely reusable. - Hooks fire natively via
.openhands/hooks.json(stdin JSON, deny decisions) — wire SessionStart context injection, PreToolUse.gald3r/guards, and pre-Stop test/lint gates. - Re-verify on the next
@g-platform-scan-docs openhands(crawl_max_age_days: 14).
Capability Summary¶
| Hooks | Rules | Skills | Commands | MCP | Docs Fresh |
|---|---|---|---|---|---|
| ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
Legend: ✅ verified working · ⚠️ partial / Cursor-generic · ❌ not supported · ❓ untested.
Verification Evidence (docs crawl 2026-06-02, https://docs.openhands.dev)¶
| Capability | How verified |
|---|---|
| Commands | /sdk/guides/plugins — Plugin commands/<name>.md; Agent Skills invocable as /skill-name; slash-command menu added May 2026. No standalone per-repo command-file format (CLI ref lists built-ins only) |
| Rules | /overview/skills/repo.md — AGENTS.md always-on (injected at conversation start); General Skills loaded continuously; GEMINI.md / CLAUDE.md variants; legacy .openhands/microagents/repo.md |
| Agents | /sdk/guides/agent-file-based.md — File-Based Agents (name/description/tools/model: inherit) in .agents/agents/*.md (priority 1) / .openhands/agents/*.md; DelegateTool spawn; built-in explore; code register_agent() |
| Skills | /sdk/guides/skill.md — extended AgentSkills SKILL.md in .agents/skills/ (> deprecated .openhands/skills / microagents); triggers / invoke_skill() / always-on modes; .claude/skills/ accepted |
| Hooks | /openhands/usage/customization/hooks — .openhands/hooks.json; PreToolUse/PostToolUse/UserPromptSubmit/Stop/SessionStart/SessionEnd; stdin JSON payload; {"decision":"deny"} block; Cloud/CLI/GUI |
| MCP | /openhands/usage/settings/mcp-settings — config.toml [mcp] sse/shttp + stdio; per-tool timeout (1–3600s); API-key + OAuth (FastMCP); SuperGateway proxy |
| Plugins | /sdk/guides/plugins — .plugin/plugin.json bundles skills+hooks+MCP+agents+commands; OpenHands/extensions registry + Cloud Plugin Launcher |
| Instruction file | AGENTS.md is the canonical always-on file (NOT CLAUDE.md); CLAUDE.md / GEMINI.md recognized as variants → gald3r writes AGENTS.md |
Reference page — canonical source: g-skl-platform-openhands/PLATFORM_SPEC.md in the engine repo, generated by scripts/generate_platform_support_docs.py. Pages marked curated are hand-assessed and not yet live-verified.