with one click
add-capability
Use when adding a new
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
Use when adding a new
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
Use to verify changes to agents, capabilities, integrations, steps, or runtime end-to-end before declaring a task done. Boots the full server stack with embedded WASM runner and separate DBs, then drives the server HTTP API to create, compile, and execute a workflow and assert observable behavior. Unit tests are not sufficient — agent/runtime changes must e2e-verify.
Use when local dev state has drifted into a weird shape — failing migrations, half-applied schema changes, stale cached binaries, suspended instances clogging the system. Wipes the e2e DBs and data dir and gives you a clean slate. Distinct from e2e-verify which assumes a clean env.
Use to set up the right RUST_LOG filters and tail server + environment logs scoped to a specific tenant, instance, or component. Saves the "what's the right log filter again" lookup. Pair with trace-instance when you need both API state and live log output.
Use when a workflow that uses a connection misbehaves — to see stored params (secrets masked), token state, rate-limit history, and which integration it belongs to. Catches stale OAuth tokens and misconfigured connection params before you blame the agent.
Use to get a quick health view of a workflow — its definition, registered versions, recent instances and their statuses, and which connections it touches. The "is this thing healthy / what does it look like right now" view, distinct from trace-instance which drills into one specific run.
Use for the tight inner loop when developing or debugging a single capability — rebuild only the changed crate, recompile a small test workflow that exercises it, register, run, dump output. ~10s feedback vs full e2e-verify. Use e2e-verify for the final pre-commit check; use this while iterating.
| name | add-capability |
| description | Use when adding a new |
A capability is a single #[capability]-annotated function inside an agent module. It auto-registers via the inventory crate at compile time — no manual registry edits needed.
Reference templates:
from_xmlsend_email#[derive(Debug, Deserialize, CapabilityInput)]
#[capability_input(display_name = "<Human-readable input name>")]
pub struct MyCapabilityInput {
#[field(
display_name = "Field Label",
description = "What the user sees in tooltips",
example = "some example",
default = "default value"
)]
pub field_name: FieldType,
// For optional fields:
#[serde(default)]
#[field(display_name = "Optional Field", description = "...")]
pub optional_field: Option<String>,
}
For integration capabilities that need a connection, include:
#[field(skip)]
#[serde(skip_serializing_if = "Option::is_none")]
pub _connection: Option<RawConnection>,
The runtime injects _connection automatically when the workflow step references a connection.
#[derive(Debug, Serialize, Deserialize, CapabilityOutput)]
#[capability_output(display_name = "<Human-readable output name>")]
pub struct MyCapabilityOutput {
#[field(display_name = "Result", description = "What this returns")]
pub result: String,
}
Signature: fn(InputType) -> Result<OutputType, AgentError>.
#[capability(
module = "my_agent", // matches the file name
display_name = "Do The Thing", // shown in the step picker
description = "Does the thing with X",
module_display_name = "My Agent", // grouping label
module_description = "What this agent does",
module_has_side_effects = false, // true if it mutates external state
module_supports_connections = false, // true for integrations
module_secure = false // true if it handles secrets
)]
pub fn do_the_thing(input: MyCapabilityInput) -> Result<MyCapabilityOutput, AgentError> {
// ...
Ok(MyCapabilityOutput { result: "done".to_string() })
}
For integration capabilities, also add: module_integration_ids = "<integration_id>" (matches the integration_id from the connection params struct).
Use AgentError::permanent(code, msg) for terminal errors and AgentError::transient(...) for retryable ones. Attach context with .with_attr(attrs::FIELD, "...") so the UI can highlight the offending field.
After build:
regen-frontend-api so the capability appears in the Step Picker.e2e-verify — compile + register + execute a workflow that uses the new capability and assert observable behavior. Unit tests alone are insufficient (see always-e2e-verify).crates/runtara-agents/src/agents/<existing-agent>.rs — append input/output structs and the function