| name | osmedeus-expert |
| description | Expert guide for the Osmedeus security automation workflow engine. Use when: (1) writing or editing YAML workflows (modules and flows), (2) running osmedeus CLI commands (scan, workflow management, installation, server), (3) configuring steps, runners, triggers, or template variables, (4) debugging workflow execution issues, (5) building security scanning pipelines, (6) working with agent/LLM step types, or (7) any question about osmedeus features, architecture, or best practices. |
Osmedeus Expert
Expert knowledge for writing YAML workflows and operating the Osmedeus security automation engine.
Quick Orientation
Osmedeus executes YAML-defined workflows with two kinds:
- module - Single execution unit containing steps (the building block)
- flow - Orchestrates multiple modules with dependency ordering
Template variables use {{Variable}} syntax. Foreach loop variables use [[variable]] to avoid conflicts.
Running Osmedeus
Essential Commands
osmedeus run -f <flow-name> -t <target>
osmedeus run -m <module-name> -t <target>
osmedeus run -m mod1 -m mod2 -t <target>
osmedeus run -m <module> -T targets.txt -c 5
osmedeus run -m <module> -t <target> -p threads=20 -p depth=2
osmedeus run -m <module> -t <target> -P params.yaml
osmedeus run -m <module> -t <target> --timeout 2h
osmedeus run -m <module> -t <target> --repeat --repeat-wait-time 30m
osmedeus run -m <module> -t <target> --dry-run
osmedeus run -m <module> -T targets.txt --chunk-size 100 --chunk-part 0
osmedeus run -m <module> -t <target> --distributed-run
Workflow Management
osmedeus workflow list
osmedeus workflow show <name>
osmedeus workflow lint <workflow-path>
Installation & Setup
osmedeus install base --preset
osmedeus install base --preset --keep-setting
osmedeus install workflow --preset
osmedeus install binary --all
osmedeus install binary --name <name>
osmedeus install binary --all --check
osmedeus install env
osmedeus install validate --preset
Server & Workers
osmedeus server
osmedeus server --master
osmedeus worker join
osmedeus worker join --get-public-ip
osmedeus worker status
osmedeus worker eval -e '<expr>'
osmedeus worker set <id> <field> <value>
osmedeus worker queue list
osmedeus worker queue new -f <flow> -t <target>
osmedeus worker queue run --concurrency 5
Cloud
osmedeus cloud config set <key> <value>
osmedeus cloud config list
osmedeus cloud create --instances N
osmedeus cloud list
osmedeus cloud run -f <flow> -t <target> --instances N
osmedeus cloud destroy <id>
osmedeus cloud setup 1.2.3.4 5.6.7.8
osmedeus cloud setup 1.2.3.4 --ansible
Other Commands
osmedeus func list
osmedeus func e 'log_info("test")'
osmedeus snapshot export <workspace>
osmedeus snapshot import <source>
osmedeus snapshot list
osmedeus update
osmedeus update --check
osmedeus assets
osmedeus assets -w <workspace>
osmedeus assets --source httpx --type web
osmedeus assets --stats
osmedeus assets --columns url,title,status_code
osmedeus assets --json
osmedeus query vulns
osmedeus query vulns --severity high -w example.com
osmedeus query runs --status running
osmedeus query steps --run <run-uuid>
osmedeus uninstall
osmedeus uninstall --clean
For complete CLI flags, see references/cli-flags.md.
Writing Workflows
Module Structure (Minimal)
name: my-module
kind: module
params:
- name: threads
default: "10"
steps:
- name: scan-target
type: bash
command: echo "Scanning {{Target}}"
exports:
result: "output.txt"
Flow Structure (Minimal)
name: my-flow
kind: flow
modules:
- name: enumeration
steps:
- name: find-subdomains
type: bash
command: subfinder -d {{Target}} -o {{Output}}/subs.txt
exports:
subdomains: "{{Output}}/subs.txt"
- name: scanning
depends_on: [enumeration]
condition: "file_length('{{subdomains}}') > 0"
steps:
- name: port-scan
type: bash
command: naabu -l {{subdomains}} -o {{Output}}/ports.txt
Step Types
| Type | Purpose | Key Fields |
|---|
bash | Shell commands | command, commands, parallel_commands |
function | JS utility functions | function, functions, parallel_functions |
parallel-steps | Run steps concurrently | parallel_steps: [Step list] |
foreach | Iterate over items | input, variable, threads, step |
remote-bash | Execute on docker/ssh runner | Same as bash + step_runner_config |
http | HTTP requests | url, method, headers, request_body |
llm | LLM API calls | messages, tools, llm_config |
agent | Agentic LLM with tool loop | query, agent_tools, max_iterations |
agent-acp | Delegate to external ACP agent | agent, messages, acp_config |
For complete field reference per step type, see references/step-types.md.
Common Step Fields (All Types)
- name: step-name
type: bash
pre_condition: "expr"
log: "Custom message"
timeout: 60
exports:
var_name: "value"
on_success: [{action: log, message: "done"}]
on_error: [{action: continue}]
decision:
switch: "{{var}}"
cases:
"val1": {goto: step-a}
default: {goto: _end}
depends_on: [other-step]
Template Variables
Built-in: {{Target}}, {{Output}}, {{Workspaces}}, {{RunUUID}}, {{WorkflowName}}
Platform: {{PlatformOS}}, {{PlatformArch}}, {{PlatformInDocker}}, {{PlatformInKubernetes}}, {{PlatformCloudProvider}}
Custom params defined in params: are accessed as {{param_name}}.
Foreach variables use double brackets: [[variable]].
For parameter generators and all variables, see references/template-variables.md.
Workflow Inheritance
extends: parent-workflow-name
override:
params:
threads: "5"
steps:
mode: append
add: [{name: extra, type: bash, command: "..."}]
remove: [step-to-remove]
For the complete inheritance system, see references/workflow-advanced.md.
Workflow Patterns
Pattern: Parallel Tool Execution
- name: parallel-enum
type: parallel-steps
parallel_steps:
- name: subfinder
type: bash
command: subfinder -d {{Target}} -o {{Output}}/subfinder.txt
timeout: 600
- name: amass
type: bash
command: amass enum -passive -d {{Target}} -o {{Output}}/amass.txt
timeout: 900
Pattern: Foreach with Concurrency
- name: scan-each-host
type: foreach
input: "{{hosts_file}}"
variable: host
threads: "{{threads}}"
step:
name: scan-host
type: bash
command: nmap -sV [[host]] -oX {{Output}}/nmap/[[host]].xml
timeout: 120
on_error: continue
Pattern: Conditional Branching (Switch/Case)
- name: check-depth
type: bash
command: echo "{{scan_depth}}"
decision:
switch: "{{scan_depth}}"
cases:
"quick": {goto: fast-scan}
"deep": {goto: full-scan}
default: {goto: standard-scan}
Pattern: Conditional Branching (Conditions)
- name: route-by-conditions
type: bash
command: echo "Evaluating conditions"
decision:
conditions:
- if: "file_length('{{inputFile}}') > 100"
goto: deep-analysis
- if: "file_length('{{inputFile}}') > 0"
function: "log_info('file has content')"
- if: "{{enableNmap}}"
commands:
- "nmap -sV {{Target}}"
Pattern: Agent-Powered Analysis
- name: analyze-findings
type: agent
query: "Analyze vulnerabilities in {{Output}}/vulns.json and prioritize by severity"
system_prompt: "You are a security analyst."
max_iterations: 10
agent_tools:
- preset: bash
- preset: read_file
- preset: grep_regex
- preset: save_content
memory:
max_messages: 30
persist_path: "{{Output}}/agent/conversation.json"
exports:
analysis: "{{agent_content}}"
Pattern: Flow with Module Dependencies
modules:
- name: recon
steps: [...]
- name: scanning
depends_on: [recon]
condition: "file_length('{{subdomains}}') > 0"
steps: [...]
- name: reporting
depends_on: [scanning]
steps: [...]
Reference Files
Debugging Tips
- Validate YAML before running:
osmedeus workflow lint <workflow-path>
- Dry run to see execution plan:
osmedeus run -m <module> -t test --dry-run
- Verbose output:
osmedeus run -m <module> -t <target> -v
- Check exports: each step's exports propagate to subsequent steps only
- Foreach uses
[[var]] not {{var}} - this is the most common mistake
- pre_condition uses JS expressions:
file_length('path') > 0, is_empty('{{var}}')
- on_error: continue prevents a failing step from stopping the workflow