Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 5 additions & 49 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,7 @@
Conductor CLI (`conductor`) is a command-line tool for managing Netflix Conductor workflows, executions, tasks, webhooks, and schedules. It connects to Conductor server instances for workflow orchestration.

It also runs a local Conductor server for development (`conductor server start`), runs task workers
(`conductor worker`), and manages AI agents and skills (`conductor agent`, `conductor skill`,
`conductor deploy`).
(`conductor worker`), and manages AI agents (`conductor agent`, `conductor deploy`).

## Installation

Expand Down Expand Up @@ -88,7 +87,7 @@ by hand.
## Command Reference

Commands are organized into three help groups:
- **Conductor Management** — `workflow`, `task`, `schedule`, `webhook`, `secret`, `api-gateway`, `agent`, `skill`, `worker`
- **Conductor Management** — `workflow`, `task`, `schedule`, `webhook`, `secret`, `api-gateway`, `agent`, `worker`
- **CLI Configuration** — `config`, `whoami`, `update`, `completion`
- **Development** — `server`, `code`, `deploy`, `doctor`

Expand Down Expand Up @@ -397,47 +396,6 @@ Columns: NAME, VERSION, TYPE, DESCRIPTION
**Table Output (agent execution):**
Columns: ID, AGENT, STATUS, START_TIME, DURATION

### Skill Commands

Package local skill directories (a directory containing `SKILL.md`) and run them as agents.

| Command | Description | Required Args | Optional Flags | Example |
|---------|-------------|---------------|----------------|---------|
| `skill register <path>` | Package and register a local skill | skill directory | `--version`, `--model`, `--agent-model` | `conductor skill register ./my-skill` |
| `skill load <path>` | Package a local skill and deploy it as an agent | skill directory | `--model` (required), `--agent-model`, `--search-path` | `conductor skill load ./my-skill --model claude-opus-5` |
| `skill run <path-or-name> <prompt>` | Run a local or registered skill and stream output | path or name, prompt | `--model` (required), `--agent-model`, `--param`, `--version`, `--search-path`, `--workspace`, `--no-workspace`, `--filesystem`, `--script-timeout`, `--script-output-limit`, `--workspace-file-limit` | `conductor skill run ./my-skill "summarize the logs" --model claude-opus-5` |
| `skill serve <path-or-name>` | Start local tool workers without running the skill | path or name | same as `skill run` (minus `--param`) | `conductor skill serve ./my-skill` |
| `skill list` | List registered skills | None | `--all-versions`, `--json`, `--csv` | `conductor skill list` |
| `skill get <name> [version]` | Get a registered skill | skill name | `--version` | `conductor skill get my-skill` |
| `skill pull <name> [destination]` | Download and extract a skill package | skill name | `--version` | `conductor skill pull my-skill ./out` |
| `skill delete <name> [version]` | Delete a registered skill version | skill name | `--version` | `conductor skill delete my-skill` |

**Flags:**
- `--model` - Orchestrator and default model (required for `load`, `run`, and `serve`)
- `--agent-model` - Sub-agent model override in `name=model` form (repeatable)
- `--param` - Skill parameter override in `key=value` form (repeatable)
- `--version` - Skill version or checksum prefix
- `--search-path` - Cross-skill search directory (repeatable)
- `--workspace` - Workspace directory exposed to workspace tools
- `--no-workspace` - Do not expose the current workspace
- `--filesystem` - Additional read-only filesystem root as `name=path` (repeatable)
- `--all-versions` - List all versions instead of only the latest
- `--script-timeout` - Skill script timeout in seconds
- `--script-output-limit` / `--workspace-file-limit` - Maximum bytes captured from script output / returned by workspace file tools

**`load` vs `run`:** `load` only publishes the agent (run it later with `agent run --name <skill>`); `run` starts local tool workers, launches the agent, and streams the execution. `serve` starts only the workers so the skill can be driven from elsewhere (e.g. the UI).

**Tool task types.** Each script in `scripts/` plus the built-in tools are served as the
Conductor task type `{skillName}__{tool}` — `read_skill_file`, and with a workspace enabled
`list_workspace_files`, `read_workspace_file`, `search_workspace`, `git_status`, `git_diff`.
`inputParameters.command` becomes the script's argv, stdout becomes `{"result": "<stdout>"}`,
and a non-zero exit fails the task. Script language is chosen by extension
(`.py .sh .js .mjs .ts .rb .go .bat .cmd`).

Because a tool is just a task type, a plain workflow can call one with no agent involved —
point a `SIMPLE` task at `{skillName}__{tool}` while `skill serve` is running. See
[WORKER_SKILL.md](./WORKER_SKILL.md).

### Worker Commands

Run task workers that poll Conductor and execute work locally.
Expand All @@ -463,23 +421,22 @@ Run task workers that poll Conductor and execute work locally.
- `--refresh` - Force refresh the worker from the registry, ignoring cache
- `--namespace` - Registry namespace to list workers from (default: `default`)

All flavours share one poll loop; they differ only in how user code runs and in the result
Both flavours share one poll loop; they differ only in how user code runs and in the result
shape it returns:

| Flavour | Worker returns | Failure carries |
|---------|----------------|-----------------|
| `stdio` | `{"status","output","logs","reason"}` on stdout | `reasonForIncompletion` + logs |
| `js` | `{status, body}` from the script; `$.task` holds the task | `output.error` |
| skill tools | bare stdout, wrapped as `{"result": ...}` | `reasonForIncompletion` |

Workers exit on Ctrl-C/SIGTERM once the in-flight batch finishes — a running task is left
to complete and report its real result rather than being killed, which would report a
failure the worker inflicted on itself and consume one of the task's retries. A second
signal exits immediately. Child processes receive `TASK_TYPE`, `TASK_ID`, `WORKFLOW_ID`, `EXECUTION_ID`,
`POLL_DOMAIN`, and the CLI's own `CONDUCTOR_SERVER_URL` and credentials.

See [WORKER_JS.md](./WORKER_JS.md), [WORKER_STDIO.md](./WORKER_STDIO.md) and
[WORKER_SKILL.md](./WORKER_SKILL.md) for the worker protocols.
See [WORKER_JS.md](./WORKER_JS.md) and [WORKER_STDIO.md](./WORKER_STDIO.md) for the worker
protocols.

### Development Commands

Expand Down Expand Up @@ -540,7 +497,6 @@ See [WORKER_JS.md](./WORKER_JS.md), [WORKER_STDIO.md](./WORKER_STDIO.md) and
- `webhook list` - Table with NAME, WEBHOOK ID, WORKFLOWS, URL (or `--json`)
- `secret list` - Table with KEY, or KEY and TAGS with `--with-tags` (or `--json`)
- `agent list` - Table with NAME, VERSION, TYPE, DESCRIPTION (or `--json`/`--csv`)
- `skill list` - Table of registered skills (or `--json`/`--csv`)

**Important:** To parse output reliably, redirect stderr to `/dev/null` to suppress update notifications and warnings:
```bash
Expand Down
16 changes: 1 addition & 15 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,6 @@ After installing, you'll get tab completion when typing `conductor <TAB>`.
* [Workers](#workers)
* [Stdio Workers](#stdio-workers)
* [JavaScript Workers (Built-in)](#javascript-workers--built-in-)
* [Skill Workers](#skill-workers)
* [Remote Workers (Registry-based)](#remote-workers--registry-based-)
* [Exit Codes](#exit-codes)
* [Error Handling](#error-handling)
Expand Down Expand Up @@ -853,7 +852,7 @@ conductor --config /path/to/my-config.yaml workflow list

⚠️ **EXPERIMENTAL FEATURES**

The CLI supports several types of workers for processing Conductor tasks:
The CLI supports these types of workers for processing Conductor tasks:

### Stdio Workers

Expand Down Expand Up @@ -888,19 +887,6 @@ conductor worker js --type greet_task worker.js

👉 **[Complete JavaScript Worker Documentation →](WORKER_JS.md)**

### Skill Workers

A skill directory (`SKILL.md` plus `scripts/`) serves each of its scripts as a
Conductor task type via `conductor skill serve`. Scripts take their arguments from
`inputParameters.command` and return bare stdout, so there is no result envelope to
emit. Works with or without an agent.

```bash
conductor skill serve ./myskill
```

👉 **[Complete Skill Worker Documentation →](WORKER_SKILL.md)**

### Remote Workers (Registry-based)

⚠️ **EXPERIMENTAL** - Download and execute workers directly from your Conductor Conductor instance without managing local files.
Expand Down
2 changes: 1 addition & 1 deletion WORKER_JS.md
Original file line number Diff line number Diff line change
Expand Up @@ -879,4 +879,4 @@ if (parsed.error) {

The JavaScript worker is designed for lightweight task processing with HTTP integration. For heavy processing or complex dependencies, consider calling external services that have full library support.

See also [Stdio Workers](WORKER_STDIO.md) and [Skill Workers](WORKER_SKILL.md).
See also [Stdio Workers](WORKER_STDIO.md).
152 changes: 0 additions & 152 deletions WORKER_SKILL.md

This file was deleted.

2 changes: 0 additions & 2 deletions WORKER_STDIO.md
Original file line number Diff line number Diff line change
Expand Up @@ -271,5 +271,3 @@ func main() {
| HTTP Calls | Use language's HTTP library | Built-in `http` object |
| File System | Full access | No access |
| Best For | Complex logic, heavy dependencies | Lightweight tasks, quick scripts |

See also [Skill Workers](WORKER_SKILL.md), which run a script with no result envelope at all.
2 changes: 1 addition & 1 deletion cmd/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -222,7 +222,7 @@ var rootCmd = &cobra.Command{

internal.SetAPIClient(apiClient)

// Share the same server URL and auth with the agent/skill transport, whose
// Share the same server URL and auth with the agent transport, whose
// endpoints are not part of the conductor-go SDK. agentTokens is nil when no
// credentials are configured (anonymous access).
internal.SetTransport(transport.Config{
Expand Down
Loading
Loading