Install
openclaw skills install rubeUse Rube tools. Triggers on: RUBE_FIND_RECIPE, RUBE_MANAGE_RECIPE_SCHEDULE, RUBE_MANAGE_CONNECTIONS, RUBE_MULTI_EXECUTE_TOOL, RUBE_REMOTE_BASH_TOOL, RUBE_REMOTE_WORKBENCH, RUBE_SEARCH_TOOLS, RUBE_GET_TOOL_SCHEMAS, RUBE_CREATE_UPDATE_RECIPE, RUBE_EXECUTE_RECIPE, RUBE_GET_RECIPE_DETAILS.
openclaw skills install rube$HOME/.openclaw/skills/rube/scripts/rube.sh <tool-name> '<json-args>'
Find recipes using natural language search. Use this tool when:
The tool uses semantic matching to find the most relevant recipes based on the user's query.
Input:
Output:
Example flow: User: "Run my recipe that sends GitHub PRs to Slack"
Parameters:
query (string) (required): Natural language query to find recipeslimit (integer) (optional): Maximum number of recipes to returninclude_details (boolean) (optional): Include full details (description, toolkits, tools, default params)$HOME/.openclaw/skills/rube/scripts/rube.sh RUBE_FIND_RECIPE '{"query":"<query>"}'
Manage scheduled recurring runs for recipes. Each recipe can have one schedule that runs indefinitely. Only recurring schedules are supported. Schedules can be paused and resumed anytime.
Use this tool when user wants to:
If vibeApiId is already in context, use it directly. Otherwise, use RUBE_FIND_RECIPES first.
Behavior:
Cron format: "minute hour day month weekday" Examples:
Parameters:
vibeApiId (string) (required): Recipe identifier, starts with "rcp_". Example: "rcp_rBvLjfof_THF"targetStatus (string) (optional): Indicates the target state of the recipe schedule. If not specified, use "no_update".delete (boolean) (optional): Set true to delete schedule. Takes priority over other actions.cron (string) (optional): Cron expression. Examples: "0 9 * * 1-5" (weekdays 9am), "0 0 * * *" (daily midnight)params (object) (optional): Parameters for scheduled runs (e.g., email, channel_name, repo). Overrides recipe defaults.$HOME/.openclaw/skills/rube/scripts/rube.sh RUBE_MANAGE_RECIPE_SCHEDULE '{"vibeApiId":"<vibeApiId>"}'
Create or manage connections to user's apps. Returns a branded authentication link that works for OAuth, API keys, and all other auth types.
Call policy:
Tool Behavior:
Workflow after initiating connection:
Parameters:
toolkits (array) (required): List of toolkits to check or connect. Should be a valid toolkit returned by SEARCH_TOOLS (never invent one). If a toolkit is not connected, will initiate connection. Example: ['gmail', 'exa', 'github', 'outlook', 'reddit', 'googlesheets', 'one_drive']reinitiate_all (boolean) (optional): Force reconnection for ALL toolkits in the toolkits list, even if they already have Active connections.
WHEN TO USE:
- You suspect existing connections are stale or broken.
- You want to refresh all connections with new credentials or settings.
- You're troubleshooting connection issues across multiple toolkits.
BEHAVIOR:
- Overrides any existing active connections for all specified toolkits and initiates new link-based authentication flows.
DEFAULT: false (preserve existing active connections)session_id (string) (optional): ALWAYS pass the session_id that was provided in the SEARCH_TOOLS response.$HOME/.openclaw/skills/rube/scripts/rube.sh RUBE_MANAGE_CONNECTIONS '{"toolkits":"<toolkits>"}'
Fast and parallel tool executor for tools and recipes discovered through RUBE_SEARCH_TOOLS. Use this tool to execute up to 50 tools in parallel across apps only when they're logically independent (no ordering/output dependencies). Response contains structured outputs ready for immediate analysis - avoid reprocessing them via remote bash/workbench tools.
Prerequisites:
Usage guidelines:
Restrictions: Some tools or toolkits may be disabled in this environment. If the response indicates a restriction, inform the user and STOP execution immediately. Do NOT attempt workarounds or speculative actions.
Memory Storage:
Parameters:
tools (array) (required): List of logically independent tools to execute in parallel.thought (string) (optional): One-sentence, concise, high-level rationale (no step-by-step).sync_response_to_workbench (boolean) (required): Syncs the response to the remote workbench (for later scripting/processing) while still viewable inline. Predictively set true if the output may be large or need scripting; if it turns out small/manageable, skip workbench and use inline only. Default: falsememory (object) (optional): CRITICAL: Memory must be a dictionary with app names as keys and string arrays as values. NEVER use nested objects. Format: {"app_name": ["string1", "string2"]}. Store durable facts - stable IDs, mappings, roles, preferences. Exclude ephemeral data like message IDs or temp links. Use full sentences describing relationships. Always include this parameter.session_id (string) (optional): ALWAYS pass the session_id that was provided in the SEARCH_TOOLS response.current_step (string) (optional): Short enum for current step of the workflow execution. Eg FETCHING_EMAILS, GENERATING_REPLIES. Always include to keep execution aligned with the workflow.current_step_metric (string) (optional): Progress metrics for the current step - use to track how far execution has advanced. Format as a string "done/total units" - example "10/100 emails", "0/n messages", "3/10 pages".$HOME/.openclaw/skills/rube/scripts/rube.sh RUBE_MULTI_EXECUTE_TOOL '{"tools":"<tools>","sync_response_to_workbench":"<sync_response_to_workbench>"}'
Execute bash commands in a REMOTE sandbox for file operations, data processing, and system tasks. Essential for handling large tool responses saved to remote files. PRIMARY USE CASES:
Parameters:
command (string) (required): The bash command to executesession_id (string) (optional): ALWAYS pass the session_id that was provided in the SEARCH_TOOLS response.$HOME/.openclaw/skills/rube/scripts/rube.sh RUBE_REMOTE_BASH_TOOL '{"command":"<command>"}'
Process REMOTE FILES or script BULK TOOL EXECUTIONS using Python code IN A REMOTE SANDBOX. If you can see the data in chat, DON'T USE THIS TOOL. ONLY use this when processing data stored in a remote file or when scripting bulk tool executions.
DO NOT USE
USE IF
OUTPUTS
/home/user/.code_out.IMPORTANT CODING RULES:
/tmp/. Call RUBE_REMOTE_WORKBENCH again for the next step. This improves composability and avoids timeouts.ENV & HELPERS:
/home/user.run_composio_tool(tool_slug: str, arguments: dict) -> tuple[Dict[str, Any], str]: Execute a known Composio app tool (from RUBE_SEARCH_TOOLS). Do not invent names; match the tool's input schema. Suited for loops/parallel/bulk over datasets.
i) run_composio_tool returns JSON with top-level "data". Parse carefully—structure may be nested.
-
invoke_llm(query: str) -> tuple[str, str]: Invoke an LLM for semantic tasks. Pass MAX 200k characters in input.
i) NOTE Prompting guidance: When building prompts for invoke_llm, prefer f-strings (or concatenation) so literal braces stay intact. If using str.format, escape braces by doubling them ({{ }}).
ii) Define the exact JSON schema you want and batch items into smaller groups to stay within token limit.
- `upload_local_file(*file_paths) -> tuple[Dict[str, Any], str]`: Upload files in workbench to Composio S3/R2 storage. Use this to download any generated files/artifacts from the workbench.
- `proxy_execute(method, endpoint, toolkit, query_params=None, body=None, headers=None) -> tuple[Any, str]`: Call a toolkit API directly when no Composio tool exists. Only one toolkit can be invoked with proxy_execute per workbench call
- `web_search(query: str) -> tuple[str, str]`: Search the web for information.
- `smart_file_extract(sandbox_file_path: str, show_preview: bool = True) -> tuple[str, str]`: Extracts text from files in the sandbox (e.g., PDF, image).
- Workbench comes with comprehensive Image Processing (PIL/Pillow, OpenCV, scikit-image), PyTorch ML libraries, Document and Report handling tools (pandoc, python-docx, pdfplumber, reportlab), and standard Data Analysis tools (pandas, numpy, matplotlib) for advanced visual, analytical, and AI tasks.
All helper functions return a tuple (result, error). Always check error before using result.
Executes a known Composio tool via backend API. Do NOT call COMPOSIO_* meta tools to avoid cyclic calls.
def run_composio_tool(tool_slug: str, arguments: Dict[str, Any]) -> tuple[Dict[str, Any], str]
# Returns: (tool_response_dict, error_message)
# Success: ({"data": {actual_data}}, "") - Note the top-level data
# Error: ({}, "error_message") or (response_data, "error_message")
result, error = run_composio_tool("GMAIL_FETCH_EMAILS", {"max_results": 1, "user_id": "me"})
if error:
print("GMAIL_FETCH_EMAILS error:", error); return
email_data = result.get("data", {})
print("Fetched:", email_data)
Calls LLM for reasoning, analysis, and semantic tasks. Pass MAX 200k characters input.
def invoke_llm(query: str) -> tuple[str, str]
# Returns: (llm_response, error_message)
resp, error = invoke_llm("Summarize the key points from this data")
if not error:
print("LLM:", resp)
# Example: analyze tool response with LLM
tool_resp, err = run_composio_tool("GMAIL_FETCH_EMAILS", {"max_results": 5, "user_id": "me"})
if not err:
parsed = tool_resp.get("data", {})
resp, err2 = invoke_llm(f"Analyze these emails and summarize: {parsed}")
if not err2:
print("LLM Gmail Summary:", resp)
# TIP: batch prompts to reduce LLM calls.
Uploads sandbox files to Composio S3/R2 storage. Single files upload directly, multiple files are auto-zipped. Use this when you need to upload/download any generated artifacts from the sandbox.
def upload_local_file(*file_paths) -> tuple[Dict[str, Any], str]
# Returns: (result_dict, error_string)
# Success: ({"s3_url": str, "uploaded_file": str, "type": str, "id": str, "s3key": str, "message": str}, "")
# Error: ({}, "error_message")
# Single file
result, error = upload_local_file("/path/to/report.pdf")
# Multiple files (auto-zipped)
result, error = upload_local_file("/home/user/doc1.txt", "/home/user/doc2.txt")
if not error:
print("Uploaded:", result["s3_url"])
Direct API call to a connected toolkit service.
def proxy_execute(
method: Literal["GET","POST","PUT","DELETE","PATCH"],
endpoint: str,
toolkit: str,
query_params: Optional[Dict[str, str]] = None,
body: Optional[object] = None,
headers: Optional[Dict[str, str]] = None,
) -> tuple[Any, str]
# Returns: (response_data, error_message)
# Example: GET request with query parameters
query_params = {"q": "is:unread", "maxResults": "10"}
data, error = proxy_execute("GET", "/gmail/v1/users/me/messages", "gmail", query_params=query_params)
if not error:
print("Success:", data)
Searches the web via Exa AI.
def web_search(query: str) -> tuple[str, str]
# Returns: (search_results_text, error_message)
results, error = web_search("latest developments in AI")
if not error:
print("Results:", results)
res, err = run_composio_tool("GMAIL_FETCH_EMAILS", {"max_results": 5})
if err:
print("error:", err); return
if isinstance(res, dict):
print("res keys:", list(res.keys()))
data = res.get("data") or {}
print("data keys:", list(data.keys()))
msgs = data.get("messages") or []
print("messages count:", len(msgs))
for m in msgs:
print("subject:", m.get("subject", "<missing>"))
Adjust concurrency so all tasks finish within 4 minutes.
import concurrent.futures
MAX_CONCURRENCY = 10 # Adjust as needed
def send_bulk_emails(email_list):
def send_single(email):
result, error = run_composio_tool("GMAIL_SEND_EMAIL", {
"to": email["recipient"], "subject": email["subject"], "body": email["body"]
})
if error:
print(f"Failed {email['recipient']}: {error}")
return {"status": "failed", "error": error}
return {"status": "sent", "data": result}
results = []
with concurrent.futures.ThreadPoolExecutor(max_workers=MAX_CONCURRENCY) as ex:
futures = [ex.submit(send_single, e) for e in email_list]
for f in concurrent.futures.as_completed(futures):
results.append(f.result())
return results
email_list = [{"recipient": f"user{i}@example.com", "subject": "Test", "body": "Hello"} for i in range(1000)]
results = send_bulk_emails(email_list)
Parameters:
code_to_execute (string) (required): Python to run inside the persistent remote Jupyter sandbox. State (imports, variables, files) is preserved across executions. Keep code concise to minimize tool call latency. Avoid unnecessary comments.
Examples:
"import json, glob\npaths = glob.glob(file_path)\n..."
"result, error = run_composio_tool(tool_slug='SLACK_SEARCH_MESSAGES', arguments={'query': 'Rube'})\nif error: return\nmessages = result.get('data', {}).get('messages', [])"thought (string) (optional): Concise objective and high-level plan (no private chain-of-thought). 1 sentence describing what the cell should achieve and why the sandbox is needed.session_id (string) (optional): ALWAYS pass the session_id that was provided in the SEARCH_TOOLS response.current_step (string) (optional): Short enum for current step of the workflow execution. Eg FETCHING_EMAILS, GENERATING_REPLIES. Always include to keep execution aligned with the workflow.current_step_metric (string) (optional): Progress metrics for the current step - use to track how far execution has advanced. Format as a string "done/total units" - example "10/100 emails", "0/n messages", "3/10 pages".$HOME/.openclaw/skills/rube/scripts/rube.sh RUBE_REMOTE_WORKBENCH '{"code_to_execute":"<code_to_execute>"}'
MCP Server Info: COMPOSIO MCP connects 500+ apps—Slack, GitHub, Notion, Google Workspace (Gmail, Sheets, Drive, Calendar), Microsoft (Outlook, Teams), X/Twitter, Figma, Web Search / Deep research, Browser tool (scrape URLs, browser automation), Meta apps (Instagram, Meta Ads), TikTok, AI tools like Nano Banana & Veo3, and more—for seamless cross-app automation. Use this MCP server to discover the right tools and the recommended step-by-step plan to execute reliably. ALWAYS call this tool first whenever a user mentions or implies an external app, service, or workflow—never say "I don't have access to X/Y app" before calling it.
Tool Info: Extremely fast discovery tool that returns relevant MCP-callable tools along with a recommended execution plan and common pitfalls for reliable execution.
Usage guidelines:
Splitting guidelines (Important):
Example: User query: "send an email to John welcoming him and create a meeting invite for tomorrow" Search call: queries: [ {use_case: "send an email to someone", known_fields: "recipient_name: John"}, {use_case: "create a meeting invite", known_fields: "meeting_date: tomorrow"} ]
Plan review checklist (Important):
Response:
SESSION: ALWAYS set this parameter, first for any workflow. Pass session: {generate_id: true} for new workflows OR session: {id: "EXISTING_ID"} to continue. ALWAYS use the returned session_id in ALL subsequent meta tool calls.
Parameters:
queries (array) (required): List of structured search queries (in English) to process in parallel. Each query represents a specific use case or task. For multi-app or complex workflows, split them into smaller single-app, API-level actions for best accuracy, including implicit prerequisites (e.g., fetch the resource before updating it). Each query returns 5-10 tools.session (object) (optional): Session context for correlating meta tool calls within a workflow. Always pass this parameter. Use {generate_id: true} for new workflows or {id: "EXISTING_ID"} to continue existing workflows.model (string) (optional): Client LLM model name (recommended). Used to optimize planning/search behavior. Ignored if omitted or invalid.
Examples:
"gpt-5.2"
"claude-4.5-sonnet"$HOME/.openclaw/skills/rube/scripts/rube.sh RUBE_SEARCH_TOOLS '{"queries":"<queries>"}'
Retrieve input schemas for tools by slug. Returns complete parameter definitions required to execute each tool. Make sure to call this tool whenever the response of RUBE_SEARCH_TOOLS does not provide a complete schema for a tool - you must never invent or guess any input parameters.
Parameters:
tool_slugs (array) (required): Array of tool slugs to retrieve schemas for. Pass slugs exactly as returned by COMPOSIO_SEARCH_TOOLS.
Example: ["GMAIL_SEND_EMAIL","SLACK_SEND_MESSAGE"]session_id (string) (optional): ALWAYS pass the session_id that was provided in the SEARCH_TOOLS response.include (array) (optional): Schema fields to include. Defaults to ["input_schema"]. Include "output_schema" when calling tools in the workbench to validate response structure.
Examples:
["input_schema"]
["input_schema","output_schema"]$HOME/.openclaw/skills/rube/scripts/rube.sh RUBE_GET_TOOL_SCHEMAS '{"tool_slugs":"<tool_slugs>"}'
Convert executed workflow into a reusable notebook. Only use when workflow is complete or user explicitly requests.
--- DESCRIPTION FORMAT (MARKDOWN) - MUST BE NEUTRAL ---
Description is for ANY user of this recipe, not just the creator. Keep it generic.
Generate rich markdown with these sections:
[2-3 sentences: what it does, what problem it solves]
[End-to-end flow in plain language]
| App | Purpose |
|---|---|
| [App] | [Usage] |
| Input | Description | Format |
|---|---|---|
| channel_name | Slack channel to post to | WITHOUT # prefix |
(No default values here - just format guidance)
[What the recipe produces]
--- CODE STRUCTURE ---
Code has 2 parts:
DOCSTRING HEADER (preserve all history when updating):
""" RECIPE: [Name] FLOW: [App1] → [App2] → [Output]
VERSION HISTORY: v2 (current): [What changed] - [Why] v1: Initial version
API LEARNINGS:
KNOWN ISSUES:
Then EXECUTABLE CODE follows (keep code clean, learnings stay in docstring).
--- INPUT SCHEMA (USER-FRIENDLY) ---
Ask for: channel_name, repo_name, sheet_url, email_address Never ask for: channel_id, spreadsheet_id, user_id (resolve in code) Never ask for large inputs: use invoke_llm to generate content in code
GOOD DESCRIPTIONS (explicit format, generic examples - no PII): channel_name: Slack channel WITHOUT # prefix repo_name: Repository name only, NOT owner/repo google_sheet_url: Full URL from browser gmail_label: Label as shown in Gmail sidebar
REQUIRED vs OPTIONAL:
--- DEFAULTS FOR REQUIRED PARAMETERS ---
--- CODING RULES ---
SINGLE EXECUTION: Generate complete notebook that runs in one invocation. CODE CORRECTNESS: Must be syntactically and semantically correct and executable. ENVIRONMENT VARIABLES: All inputs via os.environ.get(). Code is shared - no PII. TIMEOUT: 4 min hard limit. Use ThreadPoolExecutor for bulk operations. SCHEMA SAFETY: Never assume API response schema. Use invoke_llm to parse unknown responses. NESTED DATA: APIs often double-nest. Always extract properly before using. ID RESOLUTION: Convert names to IDs in code using FIND/SEARCH tools. FAIL LOUDLY: Raise Exception if expected data is empty. Never silently continue. CONTENT GENERATION: Never hardcode text. Use invoke_llm() for generated content. DEBUGGING: Timestamp all print statements. NO META LOOPS: Never call RUBE_* or RUBE_* meta tools via run_composio_tool. OUTPUT: End with just output variable (no print).
--- HELPERS ---
Available in notebook (dont import). See RUBE_REMOTE_WORKBENCH for details: run_composio_tool(slug, args) returns (result, error) invoke_llm(prompt, reasoning_effort="low") returns (response, error)
proxy_execute(method, endpoint, toolkit, ...) returns (result, error) upload_local_file(*paths) returns (result, error)
--- CHECKLIST ---
Parameters:
recipe_id (string) (optional): Recipe id to update (optional). If not provided, will create a new recipe
Example: "rcp_rBvLjfof_THF"name (string) (required): Name for the notebook / recipe. Please keep it short (ideally less than five words)
Examples:
"Get Github Contributors"
"Send Weekly Gmail Report"
"Analyze Slack Messages"description (string) (required): Description for the notebook / recipe
Examples:
"Get contributors from Github repository and save to Google Sheet"
"Send weekly Gmail report to all users by sending email to each user"
"Analyze Slack messages from a particular channel and send summary to all users"output_schema (object) (required): Expected output json schema of the Notebook / Recipe. If the schema has array, please ensure it has "items" in it, so we know what kind of array it is. If the schema has object, please ensure it has "properties" in it, so we know what kind of object it is
Example: {"properties":{"contributors_count":{"description":"Count of contributors to Github repository","name":"contributors_count","type":"number"},"sheet_id":{"description":"ID of the sheet","name":"sheet_id","type":"string"},"sheet_updated":{"description":"Is the sheet updated?","name":"sheet_updated","type":"boolean"},"contributor_profiles":{"name":"contributor_profiles","type":"array","items":{"type":"object"},"description":"Profiles of top 10 contributors"}},"type":"object"}input_schema (object) (required): Expected input json schema for the Notebook / Recipe. Please keep the schema simple, avoid nested objects and arrays. Types of all input fields should be string only. Each key of this schema will be a single environment variable input to your Notebook
Example: {"properties":{"repo_owner":{"description":"GitHub repository owner username","name":"repo_owner","required":true,"type":"string"},"repo_name":{"description":"GitHub repository name","name":"repo_name","required":true,"type":"string"},"google_sheet_url":{"description":"Google Sheet URL (e.g., https://docs.google.com/spreadsheets/d/SHEET_ID/edit)","name":"google_sheet_url","required":true,"type":"string"},"sheet_tab":{"description":"Sheet tab name to write data to","name":"sheet_tab","required":false,"type":"string"}},"type":"object"}workflow_code (string) (required): The Python code that implements the workflow, generated by the LLM based on the executed workflow. Should include all necessary imports, tool executions (via run_composio_tool), and proper error handling. Notebook should always end with output cell (not print)
Example: "import os\nimport re\nfrom datetime import datetime\n\nprint(f"[{datetime.utcnow().isoformat()}] Starting workflow")\n\nrepo_owner = os.environ.get("repo_owner")\nrepo_name = os.environ.get("repo_name")\ngoogle_sheet_url = os.environ.get("google_sheet_url")\n\nif not repo_owner or not repo_name or not google_sheet_url:\n raise ValueError("repo_owner, repo_name, and google_sheet_url are required")\n\n# Extract spreadsheet ID from URL\nif "docs.google.com" in google_sheet_url:\n match = re.search(r'/d/([a-zA-Z0-9-_]+)', google_sheet_url)\n spreadsheet_id = match.group(1) if match else google_sheet_url\nelse:\n spreadsheet_id = google_sheet_url\n\nprint(f"[{datetime.utcnow().isoformat()}] Fetching contributors from {repo_owner}/{repo_name}")\ngithub_result, error = run_composio_tool(\n "GITHUB_LIST_CONTRIBUTORS",\n {"owner": repo_owner, "repo": repo_name}\n)\n\nif error:\n raise Exception(f"Failed to fetch contributors: {error}")\n\n# Handle nested data\ndata = github_result.get("data", {})\nif "data" in data:\n data = data["data"]\n\ncontributors = data.get("contributors") or data if isinstance(data, list) else []\n\nif len(contributors) == 0:\n raise Exception(f"No contributors found for {repo_owner}/{repo_name}")\n\nprint(f"[{datetime.utcnow().isoformat()}] Found {len(contributors)} contributors")\n\n# Process data\nrows = []\nfor contributor in contributors:\n rows.append([\n contributor.get("login"),\n contributor.get("email", ""),\n contributor.get("location", ""),\n contributor.get("contributions", 0)\n ])\n\nprint(f"[{datetime.utcnow().isoformat()}] Adding {len(rows)} rows to sheet")\nsheets_result, sheets_error = run_composio_tool(\n "GOOGLESHEETS_APPEND_DATA",\n {\n "spreadsheet_id": spreadsheet_id,\n "range": "A1",\n "values": rows\n }\n)\n\nif sheets_error:\n raise Exception(f"Failed to update sheet: {sheets_error}")\n\nprint(f"[{datetime.utcnow().isoformat()}] Workflow completed")\n\noutput = {\n "contributors_count": len(contributors),\n "sheet_updated": True,\n "spreadsheet_id": spreadsheet_id\n}\noutput"defaults_for_required_parameters (object) (optional):
Defaults for required parameters of the notebook / recipe. We store those PII related separately after encryption.
Please ensure that the parameters you provide match the input schema for the recipe and all required inputs are covered. Fine to ignore optional parameters
Example: {"repo_owner":"composiohq","repo_name":"composio","sheet_id":"1234567890"}$HOME/.openclaw/skills/rube/scripts/rube.sh RUBE_CREATE_UPDATE_RECIPE '{"name":"<name>","description":"<description>","output_schema":"<output_schema>","input_schema":"<input_schema>","workflow_code":"<workflow_code>"}'
Executes a Recipe
Parameters:
recipe_id (string) (required): Recipe id to update (optional). If not provided, will create a new recipe
Example: "rcp_rBvLjfof_THF"input_data (object) (required): Input object to pass to the Recipe$HOME/.openclaw/skills/rube/scripts/rube.sh RUBE_EXECUTE_RECIPE '{"recipe_id":"<recipe_id>","input_data":"<input_data>"}'
Get the details of the existing recipe for a given recipe id.
Parameters:
recipe_id (string) (required): Recipe id to update (optional). If not provided, will create a new recipe
Example: "rcp_rBvLjfof_THF"$HOME/.openclaw/skills/rube/scripts/rube.sh RUBE_GET_RECIPE_DETAILS '{"recipe_id":"<recipe_id>"}'