workflow-create — Claude Code skill: workflow orchestration
Skill to author workflows: MCP templates with pause-and-resume gates, or native JS scripts with subagent fan-out. For long pipelines and complex audits.
npx skills add ruvnet/ruflo --skill workflow-create -a claude-codeWhat workflow-create does
workflow-create offers two surfaces for orchestration. MCP templates are persisted definitions with a pause/resume lifecycle—fit for long-lived, human-gated pipelines. Call MCP endpoints to list available templates, create one with steps and conditions, check status, or delete.
For large-scale fan-out (audits, migrations, research), write .claude/workflows/*.js—an imperative script with injected hooks: agent() spawns subagents, parallel() runs a barrier, pipeline() streams each item through stages. Script metadata must be a pure literal; the body runs inside an async wrapper. Invoke via the workflow-run skill or Workflow({ name: '...' }).
Both paths support attaching ADR decisions to the first step (requires ruflo-console 0.39.0+) and recording decisions in the last if you need them in project history. Validate JS syntax via node --check after transforming the export.
What it helps with
- Orchestrate a long pipeline with approval gates
- Parallelize audit or migration across many objects
- Aggregate results from multiple subagents into structured output
- Link workflow to project decisions (ADR)
- Set conditional branching based on step results
Example prompts for the agent
- Create an MCP workflow template for code review before merge
- Write a JS orchestration that runs testers on every module in parallel
- Show me all workflows I've created and their status
How to install workflow-create
1Skills CLI (Vercel)
npx skills add ruvnet/ruflo --skill workflow-create -a claude-code2Manually: put the files in place
~/.claude/skills/workflow-create/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/workflow-create/
1Skills CLI (Vercel)
npx skills add ruvnet/ruflo --skill workflow-create -a codex2Manually: put the files in place
.agents/skills/workflow-create/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add ruvnet/ruflo --skill workflow-create -a cursor2Manually: put the files in place
.cursor/skills/workflow-create/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install ruvnet/ruflo workflow-create2Manually: put the files in place
.github/skills/workflow-create/SKILL.md1Skills CLI (Vercel)
npx skills add ruvnet/ruflo --skill workflow-create -a gemini-cli2Platform CLI
gemini skills install https://github.com/ruvnet/ruflo --path plugins/ruflo-workflows/skills/workflow-createManually: put the files in place
.devin/skills/workflow-create/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add ruvnet/ruflo --skill workflow-create -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
From the same set104
The whole set →Similar
Questions about workflow-create
How do I install workflow-create in Claude Code?
Run npx skills add ruvnet/ruflo --skill workflow-create -a claude-code, then open ~/.claude/skills/workflow-create/SKILL.md.
What's the difference between MCP templates and native JS orchestration?
MCP templates are persisted with pause/resume and approval gates, suited for long pipelines. JS scripts are imperative with subagent fan-out, better for large-scale parallelism and result aggregation.
What hooks are available in `.claude/workflows/*.js`?
agent(prompt, opts) spawns a subagent, parallel(thunks) runs with a barrier, pipeline(items, ...stages) streams items through stages, phase(title) groups progress.
Source text
SKILL.md · MIT
---
name: workflow-create
description: Author a workflow — either an MCP workflow template (persisted, lifecycle) or a native .claude/workflows/*.js orchestration script (agent/parallel/pipeline fan-out)
argument-hint: "<name> [--native] [--steps N]"
allowed-tools: mcp__plugin_ruflo-core_ruflo__workflow_create mcp__plugin_ruflo-core_ruflo__workflow_template mcp__plugin_ruflo-core_ruflo__workflow_list mcp__plugin_ruflo-core_ruflo__workflow_status mcp__plugin_ruflo-core_ruflo__workflow_delete Write Read Edit Bash
---
# Workflow Create
Author a workflow on whichever surface fits the job.
## Pick a surface
- **MCP workflow template** — a persisted definition with a pause/resume lifecycle. Use for long-lived, human-gated, resumable pipelines.
- **Native `.claude/workflows/*.js`** — an imperative orchestration script that fans subagents out. Use for comprehensive fan-out (review, audit, migration, research) where you aggregate structured results in code.
## A — MCP workflow template
1. **List templates** — call `mcp__plugin_ruflo-core_ruflo__workflow_template` to see available templates
2. **Create workflow** — call `mcp__plugin_ruflo-core_ruflo__workflow_create` with steps, conditions, and execution order
3. **List workflows** — call `mcp__plugin_ruflo-core_ruflo__workflow_list` to see all defined workflows
4. **Check status** — call `mcp__plugin_ruflo-core_ruflo__workflow_status` to monitor a workflow
5. **Clean up** — call `mcp__plugin_ruflo-core_ruflo__workflow_delete` to remove unused workflows
Features: sequential/parallel steps, conditional branching, template inheritance, pause/resume approval gates.
## ADR steps (with ruflo-console 0.39.0 or later)
Neither surface above has a step *type* for decisions, and ruflo-console owns no workflow engine (its Workflows page only reads runs), so these are two ordinary steps, not an engine feature. They use the ADRs of the project you run in, not ruflo's own.
- **requires ADR** (first step): attach the ADRs that govern the area to the console mission (ADRs page, or `/ruflo run adr-attach <n>`); the console puts the accepted decisions in the prompt of every step and spawned agent. Name the ones the step touches before it edits anything.
- **records ADR** (last step): when the workflow made a decision a person should keep, `/ruflo run adr-propose <title>` (or the page's *draft an ADR from this mission*). It writes a *proposed* record only after the person's Yes on the exact file; a person writes the decision and accepts it.
The console's scope check compares changed file paths with the paths the attached accepted ADRs name and records a warning; it does not prove a step follows a decision.
## B — Native `.claude/workflows/*.js`
Write a `.js` file under `.claude/workflows/`. It MUST begin with a **pure-literal** `export const meta` block; the body runs inside an async wrapper (top-level `await`/`return` are legal) with these hooks injected:
| Hook | Purpose |
|------|---------|
| `agent(prompt, opts)` | Spawn one subagent; pass `opts.schema` (JSON Schema) to get validated structured output back |
| `parallel(thunks)` | Run thunks concurrently with a **barrier** — `.filter(Boolean)` the results |
| `pipeline(items, ...stages)` | Stream each item through stages independently — **prefer this** over a barrier |
| `phase(title)` / `log(msg)` | Progress grouping / narration |
```js
export const meta = {
name: 'my-workflow', // becomes the invocable name — must be a pure literal
description: 'one line',
phases: [{ title: 'Find' }, { title: 'Verify' }],
}
const SCHEMA = { type: 'object', required: ['ok'], properties: { ok: { type: 'boolean' } }, additionalProperties: false }
phase('Find')
const found = await agent('find the things', { schema: SCHEMA, agentType: 'tester' })
phase('Verify')
const checked = await parallel((found.items || []).map((it) => () =>
agent(`verify ${it}`, { schema: SCHEMA })))
return { found, checked: checked.filter(Boolean) }
```
Rules: `meta` is a pure literal (no variables/calls/interpolation); default to `pipeline` over `parallel`; never use `Date.now()`/`Math.random()` (they throw — vary by index instead). Validate syntax (the body is ESM-in-async-wrapper, not a bare module):
```bash
node -e 'const fs=require("fs");let s=fs.readFileSync(".claude/workflows/my-workflow.js","utf8").replace(/^export\s+const\s+meta/m,"const meta");fs.writeFileSync("/tmp/wf.mjs","let agent,parallel,pipeline,phase,log,args,budget,workflow;async function __wf(){\n"+s+"\n}")' \
&& node --check /tmp/wf.mjs && echo OK
```
Run it with the `workflow-run` skill or `Workflow({ name: 'my-workflow' })`. Reference: `.claude/workflows/plugin-contract-audit.js`. See [ADR-0002](../../docs/adrs/0002-native-workflow-orchestration.md).
© ruvnet · MIT · ruvnet/ruflo