Repository navigation
Stock prompt plugin for plugin-spec prompt automations #800
Description
Problem
"Create Automation → enter a prompt" runs ignore the user's agent profile, so a profile with sub-agents runs without the task tool (OpenHands/automation#557). Prompt automations are created through the prompt preset, which never reads a profile, and presets are frozen in favor of plugin-spec automations (OpenHands/automation#600).
Plugin-spec automations do launch from an agent profile, but there is no stock plugin that carries a per-automation prompt, so the prompt flow can't move onto them.
Proposed change
Add plugins/prompt-task, a conversation-runner plugin:
- Its command takes the automation's prompt as arguments:
entrypoint.arguments: "{{ config.prompt }}", rendered by the Automation Service (feat: let users choose a plugin-spec automation's agent profile automation#615). runtime.agent_profile.required: truewith nodefault_name, so the creator picks the profile.config_schematakes one requiredprompt.
Acceptance criteria
- A plugin-spec automation created from
plugins/prompt-taskwith apromptand anagent_profile_idruns the prompt on a conversation launched from that profile. - The run's first message (
/prompt-task:run <prompt>) triggers no public skill. - Repo checks pass (
pytest tests/,scripts/sync_extensions.py --check,scripts/check_plugin_resources.py).
Implementation: #799.
I'm an AI agent (Claude Code) helping @simonrosenberg.
OpenHands AI triage
The following comments and acceptance criteria were added by the OpenHands AI agent.
Triage
Add plugins/prompt-task to OpenHands/extensions: a conversation-runner automation plugin whose run message carries a per-automation prompt and whose run launches from the agent profile the creator picks. The extensions-owned deliverable is the plugin (manifest, command, README, vendor manifests) and a contract test; the Automation Service pieces it depends on are OpenHands/automation#614 (dispatch launches the run's conversation from the profile) and OpenHands/automation#615 (agent_profile_id on POST /v1/plugin-spec plus {{ config.* }} argument rendering), and Canvas creation is OpenHands/OpenHands. Scope is bounded to the new plugin directory and its test.
Non-goals: no changes to the prompt or plugin presets; no Automation Service, SDK, or Canvas code; no marketplace/catalog listing (this plugin is prompt-flow infrastructure, so the sync_extensions.py coverage warning for it is expected and non-blocking); no tool, secret, or MCP allowlists on the profile requirement, since the plugin inherits the selected profile's own settings.
Acceptance Criteria
-
plugins/prompt-taskexists as an executable automation plugin:.plugin/plugin.jsonvalidates against the Automation Service manifest schema (openhands.automation.plugin.v1) withentrypoint.runner: "conversation", anentrypoint.commandwhosecommands/<command>.mdfile exists, andentrypoint.argumentsthat rendersconfig.promptrather than emitting the literal{{ config.prompt }}. -
runtime.agent_profileisrequired: truewith nodefault_name, so creating a plugin-spec automation from this plugin with apromptand anagent_profile_idis accepted, and creating one withoutagent_profile_idis rejected. -
config_schemarequires exactly oneprompt(non-empty string, documented maximum length) and rejects a config that omitsprompt. - A dispatched run's first user message is
/<plugin-name>:<command> <prompt>, containing the configured prompt text; the run's conversation reportslaunched_agent_profileas the chosen profile, and the tools offered to the model include that profile's (for exampletaskwhen the profile enables sub-agents). - The run message triggers no public skill: no
triggers:entry in anyskills/*/SKILL.md,plugins/*/SKILL.md, orplugins/*/skills/*/SKILL.mdmatches the run message (case-insensitive). -
.claude-pluginand.codex-pluginresolve to.plugin(symlink or byte-identicalplugin.jsonmirror). - Repo checks pass:
pytest tests/,python scripts/sync_extensions.py --check,python scripts/check_plugin_resources.py. - The README states the Automation Service version requirement (
pluginSpecAgentProfilesinGET /v1/capabilities) and that an older service rejects the plugin at create instead of running a literal{{ config.prompt }}.
Activity