diff --git a/skills/dench/SKILL.md b/skills/dench/SKILL.md index cfb96641f31..02fe82daa37 100644 --- a/skills/dench/SKILL.md +++ b/skills/dench/SKILL.md @@ -1,20 +1,20 @@ --- name: database-crm-system -description: Manage Database and everything else in the workspace - objects, fields, entries via DuckDB and documents as markdown files in a nested knowledge tree. Acts as your second brain. +description: Manage Database, Surfing web using Browser and everything else in the workspace - objects, fields, entries via DuckDB and documents as markdown files in a nested knowledge tree. Acts as your second brain. metadata: { "openclaw": { "inject": true, "always": true, "emoji": "📊" } } --- # CRM / Database in Workspace / Guide on handling any data -You manage a Dench workspace stored at `~/.openclaw/workspace`. -All structured data lives in **DuckDB**. The primary database is `~/.openclaw/workspace/workspace.duckdb`, but subdirectories may contain their own `workspace.duckdb` that is authoritative for objects in that subtree (hierarchical DB discovery). Shallower databases take priority when objects share the same name. Documents are **markdown files** in `~/.openclaw/workspace/**`. Organization context will be in `~/.openclaw/workspace/workspace_context.yaml` if an organisation exists (READ-ONLY). +You manage a Dench workspace stored at `~/.openclaw-ironclaw/workspace`. +All structured data lives in **DuckDB**. The primary database is `~/.openclaw-ironclaw/workspace/workspace.duckdb`, but subdirectories may contain their own `workspace.duckdb` that is authoritative for objects in that subtree (hierarchical DB discovery). Shallower databases take priority when objects share the same name. Documents are **markdown files** in `~/.openclaw-ironclaw/workspace/**`. Organization context will be in `~/.openclaw-ironclaw/workspace/workspace_context.yaml` if an organisation exists (READ-ONLY). -All actions should look into / edit and work on `~/.openclaw/workspace/**` by default unless told otherwise. Exceptions to this are the `SOUL.md`, `skills/`, `memory/`, `USER.md`, `IDENTITY.md`, `TOOLS.md`, `AGENTS.md` and `MEMORY.md` and other such files. +All actions should look into / edit and work on `~/.openclaw-ironclaw/workspace/**` by default unless told otherwise. Exceptions to this are the `SOUL.md`, `skills/`, `memory/`, `USER.md`, `IDENTITY.md`, `TOOLS.md`, `AGENTS.md` and `MEMORY.md` and other such files. ## Workspace Structure ``` -~/.openclaw/workspace/ +~/.openclaw-ironclaw/workspace/ workspace_context.yaml # READ-ONLY org context (members, integrations, protected objects) workspace.duckdb # DuckDB database — sole source of truth for structured data people/ # Object directory @@ -163,20 +163,20 @@ Generate by querying DuckDB then writing the file: ```bash # 1. Query object + fields from DuckDB -duckdb ~/.openclaw/workspace/workspace.duckdb -json " +duckdb ~/.openclaw-ironclaw/workspace/workspace.duckdb -json " SELECT o.id, o.name, o.description, o.icon, o.default_view, (SELECT COUNT(*) FROM entries WHERE object_id = o.id) as entry_count FROM objects o WHERE o.name = 'lead' " -duckdb ~/.openclaw/workspace/workspace.duckdb -json " +duckdb ~/.openclaw-ironclaw/workspace/workspace.duckdb -json " SELECT name, type, required, enum_values FROM fields WHERE object_id = (SELECT id FROM objects WHERE name = 'lead') ORDER BY sort_order " # 2. Write .object.yaml from the query results -mkdir -p ~/.openclaw/workspace/lead -cat > ~/.openclaw/workspace/lead/.object.yaml << 'YAML' +mkdir -p ~/.openclaw-ironclaw/workspace/lead +cat > ~/.openclaw-ironclaw/workspace/lead/.object.yaml << 'YAML' id: "AbCdEfGh..." name: "lead" description: "Sales leads tracking" @@ -204,9 +204,9 @@ YAML On every conversation: -1. Read `~/.openclaw/workspace/workspace_context.yaml` for org context, members, integrations, protected objects. **NEVER modify this file.** +1. Read `~/.openclaw-ironclaw/workspace/workspace_context.yaml` for org context, members, integrations, protected objects. **NEVER modify this file.** 2. Install duckdb if it doesn't exist: `curl https://install.duckdb.org | sh` -3. If `~/.openclaw/workspace/workspace.duckdb` does not exist, initialize it with the schema below. +3. If `~/.openclaw-ironclaw/workspace/workspace.duckdb` does not exist, initialize it with the schema below. ## workspace_context.yaml (READ-ONLY) @@ -222,7 +222,7 @@ This file is generated by Dench and synced via S3. It contains: ## DuckDB Schema -Initialize via `exec` with `duckdb ~/.openclaw/workspace/workspace.duckdb`: +Initialize via `exec` with `duckdb ~/.openclaw-ironclaw/workspace/workspace.duckdb`: ```sql -- Nanoid 32 macro: generates IDs matching Dench's Supabase nanoid format @@ -345,7 +345,7 @@ SELECT * FROM v_leads WHERE "Email Address" LIKE '%@gmail.com'; ## SQL Operations Reference -All operations use `exec` with `duckdb ~/.openclaw/workspace/workspace.duckdb`. Batch related SQL in a single exec call with transactions. +All operations use `exec` with `duckdb ~/.openclaw-ironclaw/workspace/workspace.duckdb`. Batch related SQL in a single exec call with transactions. ### Create Object @@ -430,13 +430,13 @@ DELETE FROM objects WHERE id = '' AND immutable = false; ### Bulk Import from CSV ```sql -COPY entries FROM '~/.openclaw/workspace/exports/import.csv' (AUTO_DETECT true); +COPY entries FROM '~/.openclaw-ironclaw/workspace/exports/import.csv' (AUTO_DETECT true); ``` ### Export to CSV ```sql -COPY (SELECT * FROM v_leads) TO '~/.openclaw/workspace/exports/leads.csv' (HEADER true); +COPY (SELECT * FROM v_leads) TO '~/.openclaw-ironclaw/workspace/exports/leads.csv' (HEADER true); ``` ## Full Workflow: Create CRM Structure in One Shot @@ -487,13 +487,13 @@ COMMIT; **Step 2 — Filesystem: Create object directory + .object.yaml** (exec call): ```bash -mkdir -p ~/.openclaw/workspace/lead +mkdir -p ~/.openclaw-ironclaw/workspace/lead # Query the object metadata from DuckDB to build .object.yaml -OBJ_ID=$(duckdb ~/.openclaw/workspace/workspace.duckdb -noheader -list "SELECT id FROM objects WHERE name = 'lead'") -ENTRY_COUNT=$(duckdb ~/.openclaw/workspace/workspace.duckdb -noheader -list "SELECT COUNT(*) FROM entries WHERE object_id = '$OBJ_ID'") +OBJ_ID=$(duckdb ~/.openclaw-ironclaw/workspace/workspace.duckdb -noheader -list "SELECT id FROM objects WHERE name = 'lead'") +ENTRY_COUNT=$(duckdb ~/.openclaw-ironclaw/workspace/workspace.duckdb -noheader -list "SELECT COUNT(*) FROM entries WHERE object_id = '$OBJ_ID'") -cat > ~/.openclaw/workspace/lead/.object.yaml << 'YAML' +cat > ~/.openclaw-ironclaw/workspace/lead/.object.yaml << 'YAML' id: "" name: "lead" description: "Sales leads tracking" @@ -526,9 +526,9 @@ YAML ```bash # Verify view works -duckdb ~/.openclaw/workspace/workspace.duckdb "SELECT COUNT(*) FROM v_lead" +duckdb ~/.openclaw-ironclaw/workspace/workspace.duckdb "SELECT COUNT(*) FROM v_lead" # Verify .object.yaml exists -cat ~/.openclaw/workspace/lead/.object.yaml +cat ~/.openclaw-ironclaw/workspace/lead/.object.yaml ``` ## Kanban Boards @@ -578,8 +578,8 @@ COMMIT; **Step 2 — Filesystem (MANDATORY):** ```bash -mkdir -p ~/.openclaw/workspace/task -cat > ~/.openclaw/workspace/task/.object.yaml << 'YAML' +mkdir -p ~/.openclaw-ironclaw/workspace/task +cat > ~/.openclaw-ironclaw/workspace/task/.object.yaml << 'YAML' id: "" name: "task" description: "Task tracking board" @@ -595,7 +595,7 @@ fields: YAML ``` -**Step 3 — Verify:** `duckdb ~/.openclaw/workspace/workspace.duckdb "SELECT COUNT(*) FROM v_task"` and `cat ~/.openclaw/workspace/task/.object.yaml`. +**Step 3 — Verify:** `duckdb ~/.openclaw-ironclaw/workspace/workspace.duckdb "SELECT COUNT(*) FROM v_task"` and `cat ~/.openclaw-ironclaw/workspace/task/.object.yaml`. ## Field Types Reference @@ -657,11 +657,11 @@ YAML ## Document Management -Documents are markdown files in `~/.openclaw/workspace/**`. The DuckDB `documents` table tracks metadata only; the `.md` file IS the content. +Documents are markdown files in `~/.openclaw-ironclaw/workspace/**`. The DuckDB `documents` table tracks metadata only; the `.md` file IS the content. ### Create Document -1. Write the `.md` file: `write ~/.openclaw/workspace/projects/roadmap.md` +1. Write the `.md` file: `write ~/.openclaw-ironclaw/workspace/projects/roadmap.md` 2. Insert metadata into DuckDB: ```sql @@ -708,8 +708,8 @@ You MUST complete ALL steps below after ANY schema mutation (create/update/delet ### After creating or modifying an OBJECT or its FIELDS: - [ ] `CREATE OR REPLACE VIEW v_{object_name}` — regenerate the PIVOT view -- [ ] `mkdir -p ~/.openclaw/workspace/{object_name}/` — create the object directory -- [ ] Write `~/.openclaw/workspace/{object_name}/.object.yaml` — metadata projection with id, name, description, icon, default_view, entry_count, and full field list +- [ ] `mkdir -p ~/.openclaw-ironclaw/workspace/{object_name}/` — create the object directory +- [ ] Write `~/.openclaw-ironclaw/workspace/{object_name}/.object.yaml` — metadata projection with id, name, description, icon, default_view, entry_count, and full field list - [ ] If object has a `parent_document_id`, place directory inside the parent document's directory - [ ] Update `WORKSPACE.md` if it exists @@ -721,12 +721,12 @@ You MUST complete ALL steps below after ANY schema mutation (create/update/delet ### After deleting an OBJECT: - [ ] `DROP VIEW IF EXISTS v_{object_name}` — remove the view -- [ ] `rm -rf ~/.openclaw/workspace/{object_name}/` — remove the directory (unless it contains nested documents that need relocating) +- [ ] `rm -rf ~/.openclaw-ironclaw/workspace/{object_name}/` — remove the directory (unless it contains nested documents that need relocating) - [ ] Update `WORKSPACE.md` ### After creating or modifying a DOCUMENT: -- [ ] Write the `.md` file to the correct path in `~/.openclaw/workspace/**` +- [ ] Write the `.md` file to the correct path in `~/.openclaw-ironclaw/workspace/**` - [ ] `INSERT INTO documents` — ensure metadata row exists with correct `file_path`, `parent_id`, or `parent_object_id` These steps ensure the filesystem always mirrors DuckDB. The sidebar depends on `.object.yaml` files — if they are missing, objects will not appear. @@ -737,7 +737,7 @@ Reports are JSON config files (`.report.json`) that the web app renders as live ### Report file format -Store reports as `.report.json` files in `~/.openclaw/workspace/**` (wherever appropriate / create directories if you need for better structure). The JSON schema: +Store reports as `.report.json` files in `~/.openclaw-ironclaw/workspace/**` (wherever appropriate / create directories if you need for better structure). The JSON schema: ```json { @@ -881,8 +881,8 @@ The user can then "Pin" the inline report to save it as a `.report.json` file. After creating a `.report.json` file: - [ ] Verify the report JSON is valid and all SQL queries work: test each panel's SQL individually -- [ ] Choose which directory the report should be created in `~/.openclaw/workspace` based on the context of the conversation, if nothing vert relevant, create/use the `~/.openclaw/workspace/reports/` directory. -- [ ] Write the file: `~/.openclaw/workspace/**/{slug}.report.json` +- [ ] Choose which directory the report should be created in `~/.openclaw-ironclaw/workspace` based on the context of the conversation, if nothing vert relevant, create/use the `~/.openclaw-ironclaw/workspace/reports/` directory. +- [ ] Write the file: `~/.openclaw-ironclaw/workspace/**/{slug}.report.json` - [ ] Tell the user they can view it in the workspace sidebar under whichever directory it was rightfully placed in based on the context. ### Choosing the right chart type