# Introduction
Vibe Action is a command router that executes shell commands and LLM prompts via simple YAML pipelines.
## Why Vibe Action
- โก **One command = complex pipeline** โ chain shell scripts and LLM calls into a single action
- ๐ **Tag system** โ connect steps via `{tag}` references with automatic dependency graph
- ๐ง **Modifiers** โ 20+ inline value transformations with arguments
- ๐ **When/Then** โ conditional execution in YAML without shell scripts
- ๐ณ **AST parsing** โ `{tag|ast}` auto-detects language from file, `{tag|ast:rs}` for explicit
- ๐ฅ๏ธ **System tags** โ 13 built-in tags: `{system_dir_pwd}`, `{system_os}`, `{system_user}` and more
- ๐ฅ **Unified Input** โ `{query}` tag seamlessly handles text, files, images, and interactive prompts from CLI or IDE
- ๐๏ธ **Vision support** โ screenshot description, person identification, image from URL or clipboard
- ๐ **Fetch** โ load and summarize web pages, PDFs, images via `load` and `text` modifiers
- ๐ฆ **Scan** โ scan codebase and export AST as structured JSON
- ๐งช **Benchmarks** โ automatic testing of all actions with timing and output validation
- โก **Action cache** โ instant startup via snapshot-based validation
- ๐ค **Batch LLM** โ parallel execution across cluster nodes with role-based routing (tiny, small, medium, large, vision)
- โ
**Type-safe** โ validate outputs with `expect: string | list` and regex `check`
- ๐ **Notifications** โ optional desktop notifications on completion
- ๐ **Confirmations** โ ask before executing dangerous commands
- ๐ฌ **Self-documenting** โ built-in `faq` command answers questions about Vibe Action itself
- ๐ฏ **CLI-first** โ no browser, no context switching. Everything in the terminal
- ๐ **IDE Integration** โ built-in `api` block for seamless VS Code and IntelliJ plugin support
- โฑ๏ธ **Process Guard** โ new runs automatically supersede previous ones, keeping state predictable
- ๐ **Open & Flexible** โ open source. Use local models via Ollama or cloud APIs (DeepSeek, Qwen, Kimi, Zhipu)
- ๐ฆ **Fast** โ built in Rust
## Key Concepts
### YAML Pipelines
Describe your workflow in YAML, not code:
```yaml
name: extract
about: Extract matching lines from text and logs
args:
- name: file
short: f
input: string
help: Path to the log or text file
api:
output: replace
input: query|prompt
actions:
- tag: tag_lines
run: cmd
expect: list
action: cat {file}
- tag: tag_content
run: small
expect: string
action: |
[Task]
If the line matches the query โ output the EXACT line unchanged.
If it does not match โ output only a single dash: "-"
Do NOT skip lines. Process every line.
[Query]
{query|prompt}
[Line]
{tag_lines}
- tag: tag_clean
run: value
expect: string
action: '{tag_content|trim:-}'
- tag: tag_extract
run: value
expect: string
action: '{tag_clean|uniq|join}'
```
### When/Then Conditions
Use `when/then` for conditional logic without shell scripts:
```yaml
- tag: tag_result
run: cmd
expect: string
action:
- when: '{tag_check|contains:DIRTY}'
then: echo "{tag_content}"
- when: '{tag_check|contains:CLEAR}'
then: echo "No errors found."
```
### System Tags
Access environment context anywhere in your pipelines:
```yaml
- tag: tag_info
run: value
expect: string
action: |
User: {system_user}
OS: {system_os}
PWD: {system_dir_pwd}
Date: {system_date}
```
## How It Works
1. **You write a YAML file** describing your workflow โ steps, types, dependencies
2. **The engine parses it** and builds a dependency graph from `{tag}` references
3. **Steps execute in order** โ shell commands run locally, LLM prompts go to your cluster
4. **Results are validated** against expected types and optional regex patterns
5. **Final output** is displayed on screen, copied to clipboard, or sent as notification