Initial commit: workspace setup with skills, memory, config

This commit is contained in:
root
2026-02-10 14:37:49 -06:00
commit d1357c5463
77 changed files with 10822 additions and 0 deletions

653
ACTIVE.md Normal file
View File

@@ -0,0 +1,653 @@
# 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 <name>` | Remove a job |
| `openclaw cron enable <name>` | Enable a job |
| `openclaw cron disable <name>` | 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.**