wooden-umbrella-84098
04/17/2026, 12:04 AMwooden-umbrella-84098
04/17/2026, 12:04 AMAuto-activation works differently per agent: Claude Code uses SessionStart hooks, this repo's Codex dogfood setup uses, Gemini uses context files. Cursor/Windsurf/Cline/Copilot can be made always-on, but.codex/hooks.jsoninstalls only the skill, not the repo rule/instruction files.npx skills add
modern-fireman-99755
04/17/2026, 6:03 AMsession_start to `.openhands/hooks.json`:
{
"session_start": [
{
"matcher": "*",
"hooks": [
{
"type": "command",
"command": ".openhands/hooks/on_session_start.sh",
"timeout": 60
}
]
}
],
"stop": [
...
]
}
This should work.
Otherwise, skills are activated (or selected) in two different ways: one is by keyword triggering (the user uses a special keyword, like "github", then the GitHub skill is activated), or by semantic similarity — the Agent has the skill descriptions in the system prompt and if it finds the skill is useful for the task, it can activate it during the conversation.wooden-umbrella-84098
04/17/2026, 9:49 PMcat do the trick? the agent doesn't seem to interpret this as triggering the skillwooden-umbrella-84098
04/17/2026, 9:50 PMcurved-angle-80449
04/18/2026, 1:18 AMmodern-fireman-99755
04/18/2026, 4:16 PMStartConversationRequest.plugins. Hooks (.openhands/hooks.json session_start) can run shell but cannot inject Skill objects into agent_context at runtime. Therefore, hooks alone won't make a skill always-on for a server-side conversation.
Minimal pattern that works (I ran this locally):
1. Drop a plugin dir in the repo:
caveman_plugin/
├── .plugin/plugin.json
└── skills/caveman/SKILL.md # no `triggers:` in frontmatter -> repo skill
2. Start the agent-server:
uv run python -m openhands.agent_server --host 127.0.0.1 --port 8000
3. POST to /api/conversations with a plugins entry pointing at the local dir:
{
"agent": { ... },
"workspace": {"working_dir": "/tmp/caveman-demo"},
"plugins": [
{"source": "/absolute/path/to/caveman_plugin"}
],
"initial_message": {
"role": "user",
"content": [{"type": "text", "text": "Introduce yourself."}],
"run": true
}
}
Server-side, LocalConversation._ensure_plugins_loaded() calls plugin.add_skills_to(agent_context) before the first LLM call, so the caveman instructions are already in the system prompt for message 0. Agent replies in caveman voice immediately.
Verified against a local server:
**UGH!** 👋
Me OpenHands! Me help you with computer things. Me know how make code work, fix broken stuff, move files around.
You tell me what you need, me do work! Me can:
- Look at code rocks (files)
- Change code rocks to make better
- Run magic words in black box (terminal)
- Fix bad bugs that make things break
- Build new things you want
Me strong helper! Me not fancy talker, but me get job done good. Hrrm.
What you need me do today? 🔥🪨
Happy to share the example with the full plugin skeleton + start-conversation payload if it helps.modern-fireman-99755
04/20/2026, 5:29 AMskills to load it. Just be sure that the field trigger in the caveman skill is set to None .wooden-umbrella-84098
04/22/2026, 3:44 PMchilly-france-44439
04/22/2026, 3:45 PMnutritious-balloon-65098
04/22/2026, 3:46 PMchilly-france-44439
04/22/2026, 3:46 PMlimited-student-10747
04/22/2026, 3:47 PMlimited-student-10747
04/22/2026, 3:48 PMnutritious-balloon-65098
04/22/2026, 3:48 PMload_user_skills-like utility exists
2. Whether the agent server has equivalent functionality
3. Whether there are open PRs for this Findings: What exists today on `main`:
• load_user_skills() exists in openhands-sdk/openhands/sdk/skills/skill.py — loads skills from ~/.agents/skills/, ~/.openhands/skills/, ~/.openhands/microagents/ (legacy), and enabled installed skills from ~/.openhands/skills/installed/.
• install_skill(source, ...) exists in openhands-sdk/openhands/sdk/skills/installed.py — installs a skill to the global ~/.openhands/skills/installed/ directory from a git URL, GitHub shorthand, or local path.
• The agent server already loads user skills indirectly via load_all_skills() → load_available_skills() → load_user_skills(), but only from the server's local filesystem. There is no way today for an API caller to specify "always-on" skills via the agent-server API.
Open PRs addressing this gap (a coordinated stack): Bottom line: The SDK-level primitives (load_user_skills, install_skill) exist and work. The agent-server gap — letting an API caller specify always-on skills — is actively being addressed by PR #2858 (ExtensionConfig) and PR #2495 (marketplace auto-load), both open and in review., with interactive elementscurved-angle-80449
04/22/2026, 6:13 PM