# ACTIVE.md - Syntax Library & Pre-Flight Checklist **Read the relevant section BEFORE using any tool. This is your syntax reference.** **Core Philosophy: Quality over speed. Thorough and correct beats fast and half-baked.** --- ## 📖 How to Use This File 1. **Identify the tool** you need to use 2. **Read that section completely** before writing any code 3. **Check the checklist** items one by one 4. **Verify against examples** - correct and wrong 5. **Execute only after validation** --- ## 🔧 `read` - Read File Contents ### Purpose Read contents of text files or view images (jpg, png, gif, webp). ### Parameters | Parameter | Type | Required | Description | |-----------|------|----------|-------------| | `file_path` | string | **YES** | Path to the file (absolute or relative) | | `offset` | integer | No | Line number to start from (1-indexed) | | `limit` | integer | No | Maximum lines to read | ### Instructions - **ALWAYS** use `file_path`, never `path` - **ALWAYS** provide the full path - Use `offset` + `limit` for files >100 lines - Images are sent as attachments automatically - Output truncated at 2000 lines or 50KB ### Correct Examples ```python # Basic read read({ file_path: "/root/.openclaw/workspace/ACTIVE.md" }) # Read with pagination read({ file_path: "/root/.openclaw/workspace/large_file.txt", offset: 1, limit: 50 }) # Read from specific line read({ file_path: "/var/log/syslog", offset: 100, limit: 25 }) ``` ### Wrong Examples ```python # ❌ WRONG - 'path' is incorrect parameter name read({ path: "/path/to/file" }) # ❌ WRONG - missing required file_path read({ offset: 1, limit: 50 }) # ❌ WRONG - empty call read({}) ``` ### Checklist - [ ] Using `file_path` (not `path`) - [ ] File path is complete - [ ] Using `offset`/`limit` for large files if needed --- ## ✏️ `edit` - Precise Text Replacement ### Purpose Edit a file by replacing exact text. The old_string must match exactly (including whitespace). ### Parameters | Parameter | Type | Required | Description | |-----------|------|----------|-------------| | `file_path` | string | **YES** | Path to the file | | `old_string` | string | **YES** | Exact text to find and replace | | `new_string` | string | **YES** | Replacement text | ### Critical Rules 1. **old_string must match EXACTLY** - including whitespace, newlines, indentation 2. **Parameter names are** `old_string` and `new_string` - NOT `oldText`/`newText` 3. **Both parameters required** - never provide only one 4. **Surgical edits only** - for precise changes, not large rewrites 5. **If edit fails 2+ times** - switch to `write` tool instead ### Instructions 1. Read the file first to see exact content 2. Copy the exact text you want to replace (including whitespace) 3. Provide both `old_string` and `new_string` 4. If edit fails, verify the exact match - or switch to `write` ### Correct Examples ```python # Simple replacement edit({ file_path: "/root/.openclaw/workspace/config.txt", old_string: "DEBUG = false", new_string: "DEBUG = true" }) # Multi-line replacement (preserve exact whitespace) edit({ file_path: "/root/.openclaw/workspace/script.py", old_string: """def old_function(): return 42""", new_string: """def new_function(): return 100""" }) # Adding to a list edit({ file_path: "/root/.openclaw/workspace/ACTIVE.md", old_string: "- Item 3", new_string: """- Item 3 - Item 4""" }) ``` ### Wrong Examples ```python # ❌ WRONG - missing new_string edit({ file_path: "/path/file", old_string: "text to replace" }) # ❌ WRONG - missing old_string edit({ file_path: "/path/file", new_string: "replacement text" }) # ❌ WRONG - wrong parameter names (newText/oldText) edit({ file_path: "/path/file", oldText: "old", newText: "new" }) # ❌ WRONG - whitespace mismatch (will fail) edit({ file_path: "/path/file", old_string: " indented", # two spaces new_string: " new" # four spaces - but old didn't match exactly }) ``` ### Recovery Strategy ```python # If edit fails twice, use write instead: # 1. Read the full file content = read({ file_path: "/path/to/file" }) # 2. Modify content in your mind/code new_content = content.replace("old", "new") # 3. Rewrite entire file write({ file_path: "/path/to/file", content: new_content }) ``` ### Checklist - [ ] Using `old_string` and `new_string` (not newText/oldText) - [ ] Both parameters provided - [ ] old_string matches EXACTLY (copy-paste from read output) - [ ] Considered if `write` would be better - [ ] Plan to switch to `write` if this fails twice --- ## 📝 `write` - Create or Overwrite File ### Purpose Write content to a file. Creates if doesn't exist, overwrites if it does. ### Parameters | Parameter | Type | Required | Description | |-----------|------|----------|-------------| | `file_path` | string | **YES*** | Path to the file | | `path` | string | **YES*** | Alternative parameter name (skills legacy) | | `content` | string | **YES** | Content to write | *Use `file_path` for standard operations, `path` for skill files ### Critical Rules 1. **Overwrites entire file** - no partial writes 2. **Creates parent directories** automatically 3. **Must have complete content** ready before calling 4. **Use after 2-3 failed `edit` attempts** instead of continuing to fail ### When to Use - Creating new files - Rewriting entire file after failed edits - Major refactors where most content changes - When exact text matching for `edit` is too difficult ### Instructions 1. Have the COMPLETE file content ready 2. Double-check the file path 3. For skills: use `path` parameter (legacy support) 4. Verify content includes everything needed ### Correct Examples ```python # Create new file write({ file_path: "/root/.openclaw/workspace/new_file.txt", content: "This is the complete content of the new file." }) # Overwrite existing (after failed edits) write({ file_path: "/root/.openclaw/workspace/ACTIVE.md", content: """# ACTIVE.md - New Content Complete file content here... All sections included... """ }) # For skill files (uses 'path' instead of 'file_path') write({ path: "/root/.openclaw/workspace/skills/my-skill/SKILL.md", content: "# Skill Documentation..." }) ``` ### Wrong Examples ```python # ❌ WRONG - missing content write({ file_path: "/path/file" }) # ❌ WRONG - missing path write({ content: "text" }) # ❌ WRONG - partial content thinking it will append write({ file_path: "/path/file", content: "new line" # This REPLACES entire file, not appends! }) ``` ### Checklist - [ ] Have COMPLETE content ready - [ ] Using `file_path` (or `path` for skills) - [ ] Aware this OVERWRITES entire file - [ ] All content included in the call --- ## ⚡ `exec` - Execute Shell Commands ### Purpose Execute shell commands with background continuation support. ### Parameters | Parameter | Type | Required | Description | |-----------|------|----------|-------------| | `command` | string | **YES** | Shell command to execute | | `workdir` | string | No | Working directory (defaults to cwd) | | `timeout` | integer | No | Timeout in seconds | | `env` | object | No | Environment variables | | `pty` | boolean | No | Run in pseudo-terminal (for TTY UIs) | | `host` | string | No | Host: sandbox, gateway, or node | | `node` | string | No | Node name when host=node | | `elevated` | boolean | No | Run with elevated permissions | ### Critical Rules for Cron Scripts 1. **ALWAYS exit with code 0** - `sys.exit(0)` 2. **Never use exit codes 1 or 2** - these log as "exec failed" 3. **Use output to signal significance** - print for notifications, silent for nothing 4. **For Python scripts:** use `sys.exit(0)` not bare `exit()` ### Instructions 1. **For cron jobs:** Script must ALWAYS return exit code 0 2. Use `sys.exit(0)` explicitly at end of Python scripts 3. Use stdout presence/absence to signal significance 4. Check `timeout` for long-running commands ### Correct Examples ```python # Simple command exec({ command: "ls -la /root/.openclaw/workspace" }) # With working directory exec({ command: "python3 script.py", workdir: "/root/.openclaw/workspace/skills/my-skill" }) # With timeout exec({ command: "long_running_task", timeout: 300 }) # Cron script example (MUST exit 0) # In your Python script: import sys if significant_update: print("Notification: Important update found!") sys.exit(0) # ✅ Output present = notification sent else: sys.exit(0) # ✅ No output = silent success ``` ### Wrong Examples ```python # ❌ WRONG - missing command exec({ workdir: "/tmp" }) # ❌ WRONG - cron script with non-zero exit # In Python script: if no_updates: sys.exit(1) # ❌ Logs as "exec failed" error! if not important: sys.exit(2) # ❌ Also logs as error, even if intentional! ``` ### Python Cron Script Template ```python #!/usr/bin/env python3 import sys def main(): # Do work here result = check_something() if result["significant"]: print("📊 Significant Update Found") print(result["details"]) # Output will trigger notification # ALWAYS exit 0 sys.exit(0) if __name__ == "__main__": main() ``` ### Checklist - [ ] `command` provided - [ ] **If cron script:** MUST `sys.exit(0)` always - [ ] Using output presence for significance (not exit codes) - [ ] Appropriate `timeout` set if needed - [ ] `workdir` specified if not using cwd --- ## 🌐 `browser` - Browser Control ### Purpose Control browser via OpenClaw's browser control server. ### Parameters | Parameter | Type | Required | Description | |-----------|------|----------|-------------| | `action` | string | **YES** | Action: status, start, stop, profiles, tabs, open, snapshot, screenshot, navigate, act, etc. | | `profile` | string | No | "chrome" for extension relay, "openclaw" for isolated | | `targetUrl` | string | No | URL to navigate to | | `targetId` | string | No | Tab target ID from snapshot | | `request` | object | No | Action request details (for act) | | `refs` | string | No | "role" or "aria" for snapshot refs | ### Critical Rules 1. **Chrome extension must be attached** - User clicks OpenClaw toolbar icon 2. **Use `profile: "chrome"`** for extension relay 3. **Check gateway status** first if unsure 4. **Fallback to curl** if browser unavailable ### Instructions 1. Verify gateway is running: `openclaw gateway status` 2. Ensure Chrome extension is attached (badge ON) 3. Use `profile: "chrome"` for existing tabs 4. Use `snapshot` to get current page state 5. Use `act` with refs from snapshot for interactions ### Correct Examples ```python # Check status first exec({ command: "openclaw gateway status" }) # Open a URL browser({ action: "open", targetUrl: "https://example.com", profile: "chrome" }) # Get page snapshot browser({ action: "snapshot", profile: "chrome", refs: "aria" }) # Click an element (using ref from snapshot) browser({ action: "act", profile: "chrome", request: { kind: "click", ref: "e12" # ref from snapshot } }) # Type text browser({ action: "act", profile: "chrome", request: { kind: "type", ref: "e5", text: "Hello world" } }) # Screenshot browser({ action: "screenshot", profile: "chrome", fullPage: true }) ``` ### Fallback When Browser Unavailable ```python # If browser not available, use curl instead exec({ command: "curl -s https://example.com" }) # For POST requests exec({ command: 'curl -s -X POST -H "Content-Type: application/json" -d \'{"key":"value"}\' https://api.example.com' }) ``` ### Checklist - [ ] Gateway running (`openclaw gateway status`) - [ ] Chrome extension attached (user clicked icon) - [ ] Using `profile: "chrome"` for relay - [ ] Using refs from snapshot for interactions - [ ] Fallback plan (curl) if browser fails --- ## ⏰ `openclaw cron` - Scheduled Tasks ### Purpose Manage scheduled tasks via OpenClaw's cron system. ### CLI Commands | Command | Purpose | |---------|---------| | `openclaw cron list` | List all cron jobs | | `openclaw cron add` | Add a new job | | `openclaw cron remove ` | Remove a job | | `openclaw cron enable ` | Enable a job | | `openclaw cron disable ` | Disable a job | ### Critical Rules 1. **Use `--cron`** for the schedule expression (NOT `--schedule`) 2. **No `--enabled` flag** - jobs enabled by default 3. **Use `--disabled`** if you need job disabled initially 4. **Scripts MUST always exit with code 0** ### Parameters for `cron add` | Parameter | Description | |-----------|-------------| | `--name` | Job identifier (required) | | `--cron` | Cron expression like "0 11 * * *" (required) | | `--message` | Task description | | `--model` | Model to use for this job | | `--channel` | Channel for output (e.g., "telegram:12345") | | `--system-event` | For main session background jobs | | `--disabled` | Create as disabled | ### Instructions 1. Always check `openclaw cron list` first when user asks about cron 2. Use `--cron` for the time expression 3. Ensure scripts exit with code 0 4. Use appropriate channel for notifications ### Correct Examples ```bash # Add daily monitoring job openclaw cron add \ --name "monitor-openclaw" \ --cron "0 11 * * *" \ --message "Check OpenClaw repo for updates" \ --channel "telegram:1544075739" # List all jobs openclaw cron list # Remove a job openclaw cron remove "monitor-openclaw" # Disable temporarily openclaw cron disable "monitor-openclaw" ``` ### Wrong Examples ```bash # ❌ WRONG - using --schedule instead of --cron openclaw cron add --name "job" --schedule "0 11 * * *" # ❌ WRONG - using --enabled (not a valid flag) openclaw cron add --name "job" --cron "0 11 * * *" --enabled # ❌ WRONG - script with exit code 1 # (In the script being called) if error_occurred: sys.exit(1) # This will log as "exec failed" ``` ### Checklist - [ ] Using `--cron` (not `--schedule`) - [ ] No `--enabled` flag used - [ ] Script being called exits with code 0 - [ ] Checked `openclaw cron list` first --- ## 🔍 General Workflow Rules ### 1. Discuss Before Building - [ ] Confirmed approach with user? - [ ] User said "yes do it" or equivalent? - [ ] Wait for explicit confirmation, even if straightforward ### 2. Search-First Error Handling ``` Error encountered: ↓ Check knowledge base first (memory files, TOOLS.md) ↓ Still stuck? → Web search for solutions ↓ Simple syntax error? → Fix immediately (no search needed) ``` ### 3. Verify Tools Exist Before using any tool, ensure it exists: ```bash openclaw tools list # Check available tools ``` **Known undocumented:** `searx_search` is documented in skills but NOT enabled. Use `curl` to SearXNG instead. ### 4. Memory Updates After completing work: - `memory/YYYY-MM-DD.md` - Daily log of what happened - `MEMORY.md` - Key learnings (main session only) - `SKILL.md` - Tool/usage patterns for skills - `ACTIVE.md` - If new mistake pattern discovered ### 5. Take Your Time - [ ] Quality over speed - [ ] Thorough and correct beats fast and half-baked - [ ] Verify parameters before executing - [ ] Check examples in this file --- ## 🚨 My Common Mistakes Reference | Tool | My Common Error | Correct Approach | |------|-----------------|------------------| | `read` | Using `path` instead of `file_path` | Always `file_path` | | `edit` | Using `newText`/`oldText` instead of `new_string`/`old_string` | Use `_string` suffix | | `edit` | Partial edit, missing one param | Always provide BOTH | | `edit` | Retrying 3+ times on failure | Switch to `write` after 2 failures | | `exec` | Non-zero exit codes for cron | Always `sys.exit(0)` | | `cron` | Using `--schedule` | Use `--cron` | | `cron` | Using `--enabled` flag | Not needed (default enabled) | | General | Acting without confirmation | Wait for explicit "yes" | | General | Writing before discussing | Confirm approach first | | General | Rushing for speed | Take time, verify | | Tools | Using tools not in `openclaw tools list` | Verify availability first | --- ## 📋 Quick Reference: All Parameter Names | Tool | Required Parameters | Optional Parameters | |------|---------------------|---------------------| | `read` | `file_path` | `offset`, `limit` | | `edit` | `file_path`, `old_string`, `new_string` | - | | `write` | `file_path` (or `path`), `content` | - | | `exec` | `command` | `workdir`, `timeout`, `env`, `pty`, `host`, `node` | | `browser` | `action` | `profile`, `targetUrl`, `targetId`, `request`, `refs` | --- ## 📚 Reference Files Guide | File | Purpose | When to Read | |------|---------|--------------| | `SOUL.md` | Who I am | Every session start | | `USER.md` | Who I'm helping | Every session start | | `AGENTS.md` | Workspace rules | Every session start | | `ACTIVE.md` | This file - tool syntax | **BEFORE every tool use** | | `TOOLS.md` | Tool patterns, SSH hosts, preferences | When tool errors occur | | `SKILL.md` | Skill-specific documentation | Before using a skill | | `MEMORY.md` | Long-term memory | Main session only | --- ## 🆘 Emergency Recovery ### When `edit` keeps failing ```python # 1. Read full file file_content = read({ file_path: "/path/to/file" }) # 2. Calculate changes mentally or with code new_content = file_content.replace("old_text", "new_text") # 3. Write complete file write({ file_path: "/path/to/file", content: new_content }) ``` ### When tool parameters are unclear 1. Check this ACTIVE.md section for that tool 2. Check `openclaw tools list` for available tools 3. Search knowledge base for previous usage 4. Read the file you need to modify first --- **Last Updated:** 2026-02-05 **Check the relevant section BEFORE every tool use** **Remember: Quality over speed. Verify before executing. Get it right.**