Create, run, monitor, and manage Conductor workflows and tasks. Use when the user wants to define workflows, start executions, check status, pause/resume/terminate/retry workflows, or signal tasks. Uses the `conductor` CLI or falls back to bundled REST API script. Requires CONDUCTOR_SERVER_URL.
python3 -c for any purpose — not to construct JSON, parse output, format results, or post-process data. Instead:
conductor CLI proactively. If it's missing, run npm install -g @conductor-oss/conductor-cli yourself — do not just tell the user to do it. You must verify the CLI is unavailable (conductor --version) and that npm/Node.js cannot be installed (npm --version) before falling back to scripts/conductor_api.py. Never skip straight to the fallback — always attempt CLI installation first.--json flags when available to get structured output from the CLI, then summarize the results in your response text.--profile > CONDUCTOR_SERVER_URL > auto-detection. The CLI auto-detects a running local server (if started via conductor server start), CONDUCTOR_SERVER_URL overrides that, and --profile {env} overrides both. Most commands need no flags — the CLI finds the server automatically. Only append --profile {env} when the user mentions a named environment (e.g. dev, qa, prod, staging, uat). If unsure which profile exists, read ~/.conductor-cli/config.yaml and ask the user to confirm. Only create named profiles when the user explicitly wants to switch between multiple environments.If the user asks to update or upgrade Conductor skills, or if you suspect this skill may be outdated, run:
curl -sSL https://conductor-oss.github.io/conductor-skills/install.sh | bash -s -- --all --upgrade
On Windows:
irm https://conductor-oss.github.io/conductor-skills/install.ps1 -OutFile install.ps1; .\install.ps1 -All -Upgrade
This checks for a newer version and upgrades all installed agents.
When a user has nothing set up yet, follow every step below in order. Do not skip steps.
Check whether conductor is already installed:
conductor --version
If it is not installed, check for npm/Node.js:
npm --version
If npm is also missing, install Node.js first:
# macOS
brew install node
# Linux (Debian/Ubuntu)
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash - && sudo apt-get install -y nodejs
Then install the CLI — run this yourself, do not just tell the user to do it:
npm install -g @conductor-oss/conductor-cli
Verify success:
conductor --version
Fallback — You must attempt CLI installation before using the fallback. Even if the user says they cannot install Node.js/npm, still run conductor --version first to check if the CLI is already present, and then run npm --version to confirm npm is truly unavailable. Only after both checks fail and Node.js/npm genuinely cannot be installed (e.g. restricted environment, no package manager available) should you fall back to the bundled REST API script:
export CONDUCTOR_API="<path-to-this-skill>/scripts/conductor_api.py"
Ask the user whether they want to:
Do not assume one or the other — present both options and let the user decide.
Option A — Start a local server:
conductor server start
The CLI auto-detects the running server — no env var needed. To use a custom port:
conductor server start --port 3000
Verify it's running:
conductor server status
Option B — Connect to an existing server:
export CONDUCTOR_SERVER_URL="http://your-server:8080/api"
Test that the CLI can reach the server:
conductor workflow list
If this succeeds, the server does not require auth — proceed to Step 4.
If you get a 401 or 403 error, the server requires authentication. Only then ask the user for credentials, and set them via environment variables (never echo the actual values):
# Key + Secret (recommended for Orkes/Enterprise)
export CONDUCTOR_AUTH_KEY="<ask user>"
export CONDUCTOR_AUTH_SECRET="<ask user>"
# Or a pre-existing token
export CONDUCTOR_AUTH_TOKEN="<ask user>"
Then re-test: conductor workflow list
Confirm the CLI can communicate with the server:
conductor workflow list
Report the result to the user. Setup is complete.
Optional — named profiles for multiple environments:
If the user wants to switch between multiple servers (e.g. dev, staging, prod), save each as a named profile:
conductor config save --server https://dev.example.com/api --auth-key KEY --auth-secret SECRET --profile dev
conductor config save --server https://prod.example.com/api --auth-key KEY --auth-secret SECRET --profile prod
Then use --profile {env} on CLI commands to target a specific environment. Profiles are stored in ~/.conductor-cli/config.yaml. Never echo auth tokens, keys, or secrets in output.
Create and manage workflow definitions. See workflow-definition.md for JSON schema and task types.
conductor workflow list
# Fallback: python3 "$CONDUCTOR_API" list-workflows
conductor workflow get {name}
# Fallback: python3 "$CONDUCTOR_API" get-workflow --name {name} --version {version}
Step 1: Write the workflow JSON to a .json file using the Write tool (or cat << 'EOF' > workflow.json).
Step 2: Register the workflow:
conductor workflow create workflow.json
# Fallback: python3 "$CONDUCTOR_API" create-workflow --file workflow.json
Always write to a file first, then pass the file path to the CLI or script.
Step 3 (required): Check for missing workers. After registering, you must identify all SIMPLE tasks in the workflow and verify each has a task definition registered on the server:
conductor taskDef list
Compare the SIMPLE task names in the workflow against the returned task definitions. For each SIMPLE task whose name does not appear in the task definitions, inform the user that the task has no registered worker and offer to:
conductor taskDef create taskdef.jsonDo not skip this step. Workflows will get stuck on SIMPLE tasks with no worker polling for them.
conductor workflow update workflow.json
# Fallback: python3 "$CONDUCTOR_API" update-workflow --file workflow.json
conductor workflow delete {name} {version}
# Fallback: python3 "$CONDUCTOR_API" delete-workflow --name {name} --version {version}
Returns the workflow execution ID. Use -i for small inline JSON or -f for larger inputs:
conductor workflow start -w {name} -i '{"key": "value"}'
# For larger inputs, write a file first then use -f:
conductor workflow start -w {name} -f input.json
# Fallback: python3 "$CONDUCTOR_API" start-workflow --name {name} --input '{"key": "value"}'
conductor workflow start -w {name} --version {version} --correlation {correlationId} -i '{"key": "value"}'
# Fallback: python3 "$CONDUCTOR_API" start-workflow --name {name} --version {version} --correlation-id {correlationId} --input '{"key": "value"}'
Wait for the workflow to complete or reach a specific task:
conductor workflow start -w {name} -i '{"key": "value"}' --sync
# Wait until a specific task completes:
conductor workflow start -w {name} -i '{"key": "value"}' --sync -u {taskRefName}
conductor workflow start -w {name} -f input.json
conductor workflow get-execution {workflowId}
# Complete details with tasks:
conductor workflow get-execution {workflowId} -c
# Fallback: python3 "$CONDUCTOR_API" get-execution --id {workflowId} --include-tasks
# By status:
conductor workflow search -s RUNNING -c 20
# By workflow name and status:
conductor workflow search -w {name} -s FAILED -c 10
# By time range:
conductor workflow search -s COMPLETED --start-time-after "2024-01-01" --start-time-before "2024-01-31"
# Fallback: python3 "$CONDUCTOR_API" search-workflows --status RUNNING --size 20
Statuses: RUNNING, COMPLETED, FAILED, TIMED_OUT, TERMINATED, PAUSED
conductor workflow status {workflowId}
conductor workflow pause {workflowId}
conductor workflow resume {workflowId}
# Fallback: python3 "$CONDUCTOR_API" pause-workflow --id {workflowId}
# Fallback: python3 "$CONDUCTOR_API" resume-workflow --id {workflowId}
conductor workflow terminate {workflowId}
# Fallback: python3 "$CONDUCTOR_API" terminate-workflow --id {workflowId} --reason "terminated by agent"
conductor workflow restart {workflowId}
# Use latest workflow definition:
conductor workflow restart {workflowId} --use-latest
# Fallback: python3 "$CONDUCTOR_API" restart-workflow --id {workflowId}
conductor workflow retry {workflowId}
# Fallback: python3 "$CONDUCTOR_API" retry-workflow --id {workflowId}
conductor workflow rerun {workflowId} --task-id {taskId}
conductor workflow skip-task {workflowId} {taskRefName}
conductor workflow jump {workflowId} {taskRefName}
Signal tasks to advance workflow execution. Use for WAIT tasks, HUMAN tasks, or any task awaiting external input.
conductor task signal --workflow-id {workflowId} --task-ref {taskRefName} --status COMPLETED --output '{"result": "approved"}'
# Fallback: python3 "$CONDUCTOR_API" signal-task --workflow-id {workflowId} --task-ref {taskRefName} --status COMPLETED --output '{"result": "approved"}'
conductor task signal-sync --workflow-id {workflowId} --task-ref {taskRefName} --status COMPLETED --output '{"result": "done"}'
# Fallback: python3 "$CONDUCTOR_API" signal-task-sync --workflow-id {workflowId} --task-ref {taskRefName} --status COMPLETED --output '{"result": "done"}'
Task statuses: COMPLETED, FAILED, FAILED_WITH_TERMINAL_ERROR
conductor task poll {taskType} --count 5
# Fallback: python3 "$CONDUCTOR_API" poll-task --task-type {taskType} --count 5
conductor task update-execution --workflow-id {workflowId} --task-ref-name {taskRefName} --status COMPLETED --output '{"key": "value"}'
conductor task queue-size --task-type {taskType}
# Fallback: python3 "$CONDUCTOR_API" queue-size --task-type {taskType}
Start a local Conductor server for testing:
conductor server start
The CLI auto-detects the running server. To use a custom port:
conductor server start --port 3000
Other server commands:
conductor server status
conductor server logs -f
conductor server stop
Workers execute SIMPLE tasks in workflows. They poll the server, run business logic, and return results. See workers.md for full SDK examples.
SDKs available: Python (pip install conductor-python), JavaScript (npm install @io-orkes/conductor-javascript), Java (org.conductoross:conductor-client), Go, C#, Ruby, Rust — all at github.com/conductor-oss.
When a user asks to write a worker:
"name" of the SIMPLE task in the workflow definitionThese require Orkes Conductor (orkes.io):
conductor schedule list/create/update/delete/pause/resumeconductor secret list/get/put/deleteconductor webhook list/create/update/deleteGenerate a Mermaid flowchart when users ask to visualize a workflow, or after creating a workflow definition. This renders in any Markdown viewer (GitHub, VS Code, Codex).
flowchart TD for sequential workflows, flowchart LR for wide parallel flows--> arrows and -->|label| for labeled edgestitle, style, classDef, or special characters {}[]() in edge labelsfetch_data[HTTP: fetch_data]| Construct | Mermaid pattern |
|---|---|
| Sequential tasks | task1 --> task2 --> task3 |
| SWITCH (decision) | sw{Switch: ref} with `--> |
| FORK_JOIN (parallel) | fork[Fork] --> branch_a & branch_b then both --> join[Join] |
| DO_WHILE (loop) | loop[DO_WHILE: ref] --> body --> loop with `body --> |
| SUB_WORKFLOW | sub([Sub: workflow_name]) rounded node |
| WAIT / HUMAN | wait[/WAIT: ref/] parallelogram to indicate external input |
```mermaid
flowchart TD
start([Start]) --> fetch[HTTP: fetch_data]
fetch --> check{Switch: check_status}
check -->|case: ok| transform[INLINE: transform]
check -->|default| fail[TERMINATE: fail]
transform --> approve[/WAIT: approval/]
approve --> notify[HTTP: send_notification]
notify --> done([End])
```
If a Conductor server is running, link the user to the visual workflow editor:
{BASE_URL}/workflowDef/{workflowName}
Where BASE_URL is derived from CONDUCTOR_SERVER_URL by stripping the /api suffix. For example, if CONDUCTOR_SERVER_URL is http://localhost:8080/api, then the UI link is http://localhost:8080/workflowDef/order-processing. Always resolve the actual URL — never output a placeholder like {SERVER_UI_URL}.
npm install -g @conductor-oss/conductor-cli, or use the bundled scripts/conductor_api.py fallback.CONDUCTOR_SERVER_URL is correct and the server is running.CONDUCTOR_AUTH_TOKEN is set and valid.