
wren-usage
Wren Engine CLI workflow guide for AI agents. Answer data questions end-to-end using the wren CLI: gather schema context, recall past queries, write SQL through the MDL semantic layer, execute, and learn from confirmed results. Use when: user asks a data question, requests a report or analysis, asks about metrics, revenue, customers, orders, trends, or any business data; user says 'how many', 'show me', 'what is the', 'top N', 'compare', 'trend', 'growth', 'breakdown'; user wants to explore, analyze, filter, aggregate, or summarize data from a database; agent needs to query data, connect a data source, handle errors, or manage MDL changes via the wren CLI.
- Installs
- 250
- Last 24h
- —
- Trending rank
- —
- Security
- Not audited
Install
Works with every agent the skills CLI supports.
npx skills add https://github.com/canner/wrenai --skill wren-usage- 01
Install
Run the command in your project. The CLI asks which agents to install for.
- 02
Describe the task
Ask your agent for something this skill covers. It loads wren-usage automatically when relevant.
- 03
Review the result
The agent follows the SKILL.md steps, scripts and references bundled with the skill.
SKILL.md
The instructions your agent reads when the skill is triggered.
Wren Engine CLI — Agent Workflow Guide
Version check
Silently fetch https://raw.githubusercontent.com/Canner/WrenAI/main/skills/versions.json.
Compare the wren-usage key with this skill's version (from the frontmatter above).
If the remote version is newer, notify the user before proceeding:
A newer version of the wren-usage skill is available. Update with:
npx skills add Canner/WrenAI --skill wren-usageThe CLI auto-detects your installed agent. To target a specific one, add
--agent <name>(e.g.,claude-code,cursor,windsurf,cline).
Then continue with the workflow below regardless of update status.
Preflight — Verify environment and installation
Goal: Ensure the wren CLI is available before entering any workflow.
Step 1 — Check Python virtual environment
Run python -c "import sys; print(sys.prefix)" (or equivalent) to determine
whether a virtual environment is active.
- If no venv is active, warn the user and ask whether to:
- Create one (e.g.,
python -m venv .venv && source .venv/bin/activate) - Continue without a venv (not recommended — may pollute global packages)
- Create one (e.g.,
Step 2 — Check if the wren CLI is installed
Run wren --version. If the command is not found or errors:
-
Tell the user that the
wrenCLI is not installed. -
Ask if you should help install it.
-
If the user agrees, determine the datasource extra to install:
Auto-detect from project: Check whether the current directory is inside a wren project (look for
wren_project.ymlup to the repository root). If found, read the active profile withcat ~/.wren/profiles.ymlor look for a datasource hint in the project's profile configuration. Extract the datasource type from there.Ask the user: If no project is detected or no datasource can be inferred, ask the user which database they plan to connect to. Valid extras:
postgres(for Aurora Postgres),mysql(for Aurora MySQL),bigquery,snowflake,clickhouse,trino,mssql,databricks,redshift,spark,athena,oracle. DuckDB is included by default — no extra needed. -
Install with the detected or chosen extra:
# DuckDB (no extra needed) pip install "wrenai" # Other datasources pip install "wrenai[<datasource>]"To also enable semantic memory, interactive prompts, and web UI (recommended):
pip install "wrenai[<datasource>,main]" # or for DuckDB: pip install "wrenai[main]" -
Verify:
wren --version
If wren --version succeeds, proceed to the relevant workflow below.
The wren CLI queries databases through an MDL (Model Definition Language) semantic layer. You write SQL against model names, not raw tables. The engine translates to the target dialect.
Two things drive everything:
- Profile — database connection + datasource type, managed via
wren profile(stored in~/.wren/profiles.yml) - Project — MDL model definitions in YAML, compiled to
target/mdl.jsonviawren context build
The CLI reads the active profile for connection info and datasource. Use wren profile list to see which profile is active, wren profile switch <name> to change it. dry-plan also accepts --datasource / -d for transpile-only use without a profile.
For memory-specific decisions, see references/memory.md. For SQL syntax, CTE-based modeling, and error diagnosis, see references/wren-sql.md. For project structure, MDL field definitions, and CLI workflow details, see the documentation.
Workflow 1: Answering a data question
Step 1 — Gather context
| Situation | Command |
|---|---|
| Default | wren memory fetch -q "<question>" |
| Need specific model's columns | wren memory fetch -q "..." --model <name> --threshold 0 |
| Memory not installed | Read target/mdl.json in the project directory, or run wren context show |
If this is the first query in the conversation, also run:
wren context instructions
If it returns content, treat it as rules that override defaults — apply them to all subsequent queries in this session.
Step 2 — Recall past queries
wren memory recall -q "<question>" --limit 3
Use results as few-shot examples. Skip if empty.
Step 2.5 — Assess complexity (before writing SQL)
If the question involves any of the following, consider decomposing:
- Multiple metrics or aggregations (e.g., "churn rate AND expansion revenue")
- Multi-step calculations (e.g., "month-over-month growth rate")
- Comparisons across segments (e.g., "by plan tier, by region")
- Time-series analysis requiring baseline + change (e.g., "retention curve")
Decomposition strategy:
- Identify the sub-questions (e.g., "total subscribers at start" + "subscribers who cancelled" → churn rate)
- For each sub-question:
wren memory recall -q "<sub-question>"— check if a similar pattern exists- Write and execute a simple SQL
- Note the result
- Combine sub-results to answer the original question
When NOT to decompose:
- Single-table aggregation with GROUP BY — just write the SQL
- Simple JOINs that the MDL relationships already define
- Questions where
memory recallreturns a near-exact match
This is a judgment call, not a rigid rule. If you're confident in a single query, go ahead. Decompose when the SQL would be hard to debug if it fails.
Step 3 — Write, verify, and execute SQL
For simple queries (single table or simple MDL-defined JOINs, straightforward aggregation): Execute directly:
wren --sql 'SELECT c_name, SUM(o_totalprice) FROM orders
JOIN customer ON orders.o_custkey = customer.c_custkey
GROUP BY 1 ORDER BY 2 DESC LIMIT 5'
For complex queries (non-trivial JOINs not covered by MDL relationships, subqueries, multi-step logic): Verify first with dry-plan:
wren dry-plan --sql 'SELECT ...'
Check the expanded SQL output:
- Are the correct models and columns referenced?
- Do the JOINs match expected relationships?
- Are CTEs expanded correctly?
If the expanded SQL looks wrong, fix before executing. If it looks correct, proceed:
wren --sql 'SELECT ...'
SQL rules:
- Target MDL model names, not database tables
- Write dialect-neutral SQL — the engine translates
Step 4 — Store and continue
After successful execution, store the query by default:
wren memory store --nl "<user's original question>" --sql "<the SQL>"
Skip storing only when:
- The query failed or returned an error
- The user said the result is wrong
- The query is exploratory (
SELECT * ... LIMIT Nwithout analytical clauses) - There is no natural language question — just raw SQL
- The user explicitly asked not to store
The CLI auto-detects exploratory queries — if you see no store hint after execution, the query was classified as exploratory.
| Outcome | Action |
|---|---|
| User confirms correct | Store |
| User continues with follow-up | Store, then handle follow-up |
| User says nothing (but question had clear NL description) | Store |
| User says wrong | Do NOT store — fix the SQL |
| Query error | See Error recovery below |
Workflow 2: Error recovery
"table not found"
- Verify model name:
wren memory fetch -q "<name>" --type model --threshold 0 - Check MDL exists:
ls target/mdl.json(orwren context show) - Verify column:
wren memory fetch -q "<column>" --model <name> --threshold 0
Connection error
- Check active profile:
wren profile debug - Verify datasource and connection fields are correct
- Test:
wren --sql "SELECT 1" - Valid datasource values:
postgres(for Aurora Postgres),mysql(for Aurora MySQL),bigquery,snowflake,clickhouse,trino,mssql,databricks,redshift,spark,athena,oracle,duckdb - If no profile exists, create one:
wren profile add --ui(or--interactive/--from-file)
SQL syntax / planning error (enhanced)
Layer 1: Identify the failure point
wren dry-plan --sql "<failed SQL>"
| dry-plan result | Failure layer | Next step |
|---|---|---|
| dry-plan fails | MDL / semantic | → Layer 2A |
| dry-plan succeeds, execution fails | DB / dialect | → Layer 2B |
Layer 2A: MDL-level diagnosis (dry-plan failed)
The dry-plan error message tells you exactly what's wrong:
| Error pattern | Diagnosis | Fix |
|---|---|---|
column 'X' not found in model 'Y' | Wrong column name | wren memory fetch -q "X" --model Y --threshold 0 to find correct name |
model 'X' not found | Wrong model name | wren memory fetch -q "X" --type model --threshold 0 |
ambiguous column 'X' | Column exists in multiple models | Qualify with model name: ModelName.column |
| Planning error with JOIN | Relationship not defined in MDL | Check available relationships in context |
Key principle: Fix ONE issue at a time. Re-run dry-plan after each fix to see if new errors surface.
Layer 2B: DB-level diagnosis (dry-plan OK, execution failed)
The DB error + dry-plan output together pinpoint the issue:
- Read the dry-plan expanded SQL — this is what actually runs on the DB
- Compare with the DB error message:
| Error pattern | Diagnosis | Fix |
|---|---|---|
| Type mismatch | Column type differs from assumed | Check column type in context, add explicit CAST |
| Function not supported | Dialect-specific function | Use dialect-neutral alternative |
| Permission denied | Table/schema access | Check connection credentials |
| Timeout | Query too expensive | Simplify: reduce JOINs, add filters, LIMIT |
For small models: If the error message is unclear, try simplifying the query to the smallest failing fragment. Execute subqueries independently to isolate which part fails.
For the CTE rewrite pipeline and additional error patterns, see references/wren-sql.md.
Workflow 3: Connecting a new data source
- Add a profile:
wren profile add --ui(or--interactive/--from-file) - Test connection:
wren profile debug - Test query:
wren --sql "SELECT 1" - Initialize project:
wren context init - Build manifest:
wren context build - Index:
wren memory index - Verify:
wren --sql "SELECT * FROM <model> LIMIT 5"
Workflow 4: After MDL changes
When model YAML files are updated, rebuild and re-index:
# 1. Validate changes
wren context validate
# 2. Rebuild manifest
wren context build
# 3. Re-index schema memory
wren memory index
# 4. Verify
wren --sql "SELECT * FROM <changed_model> LIMIT 1"
Command decision tree
Get data back → wren --sql "..."
Aggregation across dims → wren cube query --cube <name> --measures <m> (if cube defined)
See translated SQL only → wren dry-plan --sql "..." (accepts -d <datasource> if no active profile)
Validate against DB → wren dry-run --sql "..."
Schema context → wren memory fetch -q "..."
Filter by type/model → wren memory fetch -q "..." --type T --model M --threshold 0
Store confirmed query → wren memory store --nl "..." --sql "..."
Few-shot examples → wren memory recall -q "..."
Index stats → wren memory status
Re-index after MDL change → wren memory index
Show project context → wren context show
Rebuild manifest → wren context build
Check profile → wren profile debug
Switch profile → wren profile switch <name>
Cube Query Workflow
When the user asks an aggregation question (e.g., "total revenue by month", "top customers"), check if the MDL defines cubes before writing raw SQL.
Step 1: Discover cubes
wren cube list
If cubes exist and cover the user's question, prefer cube query over raw SQL. Lower error rate, especially for small / local models — agents don't have to hand-write GROUP BY / DATE_TRUNC.
Step 2: Inspect cube structure
wren cube describe <cube_name>
Shows the cube's baseObject, measures (with expressions), dimensions, time dimensions, and hierarchies.
Step 3: Match user's question to cube measures + dimensions
| User phrase | Maps to |
|---|---|
| "total revenue" | --measures revenue |
| "by month" | --time-dimension "created_at:month" |
| "in 2024" | --time-dimension "created_at:month:2024-01-01,2025-01-01" |
| "for completed orders" | --filter "status:eq:completed" |
| "top N customers" | --dimensions customer --limit N |
Step 4: Execute via CLI flags OR JSON input
CLI flags:
wren cube query \
--cube order_metrics \
--measures revenue,order_count \
--time-dimension "created_at:month:2024-01-01,2025-01-01" \
--filter "status:eq:completed" \
--limit 100
JSON input (good for agent-generated structured queries):
echo '{"cube":"order_metrics","measures":["revenue"]}' | wren cube query --from -
Add --sql-only to print the generated SQL without executing — useful for
verification before paying for execution on a remote warehouse.
Step 5: Error recovery
| Error | Action |
|---|---|
Unknown measure 'X' | wren cube describe <cube> for available measures |
Unknown dimension 'X' | wren cube describe <cube> for available dimensions |
Cube 'X' not found | wren cube list |
Circular dependency detected | Derived measure references itself — inspect the cube YAML |
When NOT to use cube query
Fall back to wren --sql when:
- Custom JOINs across multiple models
- Window functions, CTEs, or subqueries
- Queries with no aggregation
- No cubes defined in the MDL
Aggregation decision tree
User question → Is it an aggregation question?
(SUM, COUNT, AVG, GROUP BY, "by month", "per customer", ...)
├── Yes → Are cubes defined? (`wren cube list` once at start of session)
│ ├── Yes → Does a cube cover the question? (`wren cube describe`)
│ │ ├── Yes → Use `wren cube query` (preferred — lower error rate)
│ │ └── No → Write raw SQL with `wren --sql`
│ └── No → Write raw SQL with `wren --sql`
└── No → Write raw SQL with `wren --sql` (look for memory recall first)
Things to avoid
- Do not guess model or column names — check context first
- Do not store failed queries or queries the user said are wrong
- Do not skip storing successful queries with a clear NL question — default is to store
- Do not re-index before every query — once per MDL change
- Do not pass passwords via
--connection-infoif shell history is shared — use profiles (wren profile add) or--connection-file
FAQ
What does the wren-usage skill do?
Wren Engine CLI workflow guide for AI agents. Answer data questions end-to-end using the wren CLI: gather schema context, recall past queries, write SQL through the MDL semantic layer, execute, and learn from confirmed results. Use when: user asks a data question, requests a report or analysis, asks about metrics, revenue, customers, orders, trends, or any business data; user says 'how many', 'show me', 'what is the', 'top N', 'compare', 'trend', 'growth', 'breakdown'; user wants to explore, analyze, filter, aggregate, or summarize data from a database; agent needs to query data, connect a data source, handle errors, or manage MDL changes via the wren CLI.
How do I install wren-usage?
Run npx skills add https://github.com/canner/wrenai --skill wren-usage in your project. The skills CLI detects the agents you use and copies the skill into the right folder. For Claude Code you can also place the skill folder at ~/.claude/skills/wren-usage/ (personal) or .claude/skills/wren-usage/ (project).
Which AI agents can use wren-usage?
Any agent that supports the open Agent Skills format (a folder with a SKILL.md file), including Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, Windsurf, Cline, OpenCode and more.
Is wren-usage safe to install?
No partner security audit is available yet. Skills can run commands and scripts, so read the SKILL.md and any bundled files before installing.
Who maintains wren-usage?
It is published by canner in canner/wrenai. It has 250 recorded installs.
More from canner/wrenai
wren
canner/wrenai
Wren CLI for AI agents — a semantic SQL layer over 22+ databases (Postgres, MySQL, BigQuery, Snowflake, Spark, …). The actual workflow guides live inside the wren CLI itself; this is just a discovery stub. Use whenever the user asks a data question (how many, show me, top N, compare, trend, breakdown, metric, revenue, customers, orders), wants to install / set up Wren Engine, connect a new database, connect SaaS data via dlt (HubSpot, Stripe, Salesforce, GitHub, Slack), generate or regenerate an MDL project from a database schema, enrich a project with business context (enum meanings, units, cubes like ARR / DAU / churn), or turn a project's context layer into a shareable GenBI web app / dashboard and deploy it to Vercel or Cloudflare. Triggers: 'install wren', 'set up wren engine', 'connect database to wren', 'connect SaaS to wren', 'load hubspot / stripe / salesforce data', 'generate mdl', 'scaffold wren project', 'enrich wren context', 'augment my project', 'add cubes', 'build a d
wren-dlt-connector
canner/wrenai
Connect SaaS data (HubSpot, Stripe, Salesforce, GitHub, Slack, etc.) to Wren Engine for SQL analysis. Guides the user through the full flow: install dlt, pick a SaaS source, set up credentials, run the data pipeline into DuckDB, then auto-generate a Wren semantic project from the loaded data. Use this skill whenever the user mentions: connecting SaaS data, importing data from an API, dlt pipelines, loading HubSpot/Stripe/Salesforce/GitHub/Slack data, querying SaaS data with SQL, or setting up a new data source from a REST API. Also trigger when the user already has a dlt-produced DuckDB file and wants to create a Wren project from it.
wren-enrich-context
canner/wrenai
Augment a Wren project with business context that DB schema cannot carry — enum value meanings, units (USD vs cents, ms vs sec), NULL semantics, magic sentinels (-1 = unknown), soft-delete default filters, business synonyms, time-grain / TZ conventions, cross-system identifiers, currency rules, canonical-table preferences, AND named aggregation metrics (ARR, churn, DAU, WAU, NRR) proposed as cubes. Runs in one of two modes selected at session start: grill (one question at a time, user-driven) or auto-pilot (agent infers and applies, escalates only on conflicts and high-blast-radius additions like new cubes / views / relationships). Reads everything under /raw/ (PDFs, glossaries, handbooks, code, data dictionaries) and optionally samples low-cardinality columns from the live DB (grill mode), compares against the current MDL / cubes / instructions.md / queries.yml / memory pairs, then fills gaps via the ten-category gap catalog and the cube proposal flow. Confirmed findings
Popular data & databases skills
supabase-postgres-best-practices
supabase/agent-skills
Postgres best practices maintained by Supabase, for Postgres running anywhere. Load this skill BEFORE writing or changing anything that lives in a Postgres database: creating or altering tables and columns (including choosing column types), schema design, migrations and declarative schema files, RLS policies and the tests that verify them, indexes, triggers, database functions, queues and scheduled jobs (pgcron, pgmq), vector/semantic search (pgvector), and restoring dumps (pgrestore) or importing data. Also load it when diagnosing slow queries, high CPU, timeouts, EXPLAIN plans, connection exhaustion, locking, bloat, or rows visible to the wrong user or tenant. This is not just a performance guide — schema, migration, security, and SQL authoring tasks need these rules too, even for a one-column change or a single query.
prisma-client-api
prisma/skills
Prisma Client API reference covering model queries, filters, operators, and client methods. Use when writing database queries, using CRUD operations, filtering data, or configuring Prisma Client. Triggers on "prisma query", "findMany", "create", "update", "delete", "$transaction".
prisma-database-setup
prisma/skills
Deprecated compatibility name for prisma-orm-setup. Use only when a user or existing integration explicitly invokes prisma-database-setup; otherwise select prisma-orm-setup.
prisma-cli
prisma/skills
Prisma ORM 7 CLI reference for existing Prisma 7 applications or explicitly selected Prisma 7 workflows. Covers prisma init, generate, migrate, db, dev, studio, and mcp. For setup, connection repair, or Prisma 8, use prisma-orm-setup; not the Prisma Platform CLI.
prisma-postgres
prisma/skills
Deprecated compatibility name for prisma-postgres-setup. Use only when a user or existing integration explicitly invokes prisma-postgres; otherwise select prisma-postgres-setup.
prisma-driver-adapter-implementation
prisma/skills
Required reference for Prisma ORM 7 SQL driver adapter work. Use when implementing or modifying adapters, adding database drivers, or touching SqlDriverAdapter, Transaction, savepoint, result mapping, or DriverAdapterError behavior. Covers current transaction lifecycle, optional savepoint hooks, original database-error preservation, and verification.