add-ecosystem
Add a new ecosystem and base model to basemodel.constants.ts. Use when onboarding a new model…
Create and manage Metabase questions, dashboards, and public links. Use when the user wants to build metrics dashboards, create saved questions with SQL queries, or share analytics publicly.
$ npx -y skills add civitai/civitai --skill metabase --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/metabaseContext preview
The summary Claude sees to decide when to auto-load this skill.
Create and manage Metabase questions, dashboards, and public links. Use when the user wants to build metrics dashboards, create saved questions with SQL queries, or share analytics publicly.
name: metabase description: Create and manage Metabase questions, dashboards, and public links. Use when the user wants to build metrics dashboards, create saved questions with SQL queries, or share analytics publicly.
Create questions, dashboards, and public links on Civitai's Metabase instance.
node .claude/skills/metabase/metabase.mjs <command> [options]
**A value that starts with `--` needs `--flag=value`.** Every flag except `--required` and `--json` takes a value, and a bare `--flag` (or one whose value begins with `--`) is an error rather than a silent `true`. This bites most often with SQL opening on a `--` comment line:
--query="-- daily totals SELECT ..."
`create-question` reads the card back after creating it and fails if the stored SQL is not what was sent.
node .claude/skills/metabase/metabase.mjs run-query --database 3 --query "SELECT count() FROM views"
Variables are auto-detected from `{{variable}}` syntax in the query, or can be specified explicitly.
# Auto-detected variables
node .claude/skills/metabase/metabase.mjs create-question \
--name "Challenge Review Purchases" \
--database 3 \
--collection 232 \
--query "SELECT * FROM buzzTransactions WHERE description LIKE 'Challenge review:%' AND toDate(date) >= {{start_date}}" \
--description "Tracks guaranteed review buzz purchases"
# Explicit variable definitions (for types like date, number, etc.)
node .claude/skills/metabase/metabase.mjs create-question \
--name "User Activity" \
--database 3 \
--query "SELECT * FROM views WHERE userId = {{user_id}}" \
--variables '{"user_id":{"id":"user_id","name":"user_id","display-name":"User ID","type":"number"}}'**Variable types:** `text`, `number`, `date`, `date/single`, `date/range`, `date/month-year`, `date/quarter-year`, `date/relative`, `date/all-options`
`run-query` runs ad-hoc SQL, which does **not** tell you whether a saved card works: a card whose parameters are mis-wired stores the right SQL and still returns nothing. Run the card itself to check.
node .claude/skills/metabase/metabase.mjs run-card --id 3301 --params '{"from":"2026-09-09","to":"2026-10-01"}'
node .claude/skills/metabase/metabase.mjs run-card --id 3303 # no parametersNames in `--params` are `{{variable}}` names; an unknown one is an error rather than a silently ignored filter.
# Replace the SQL (reads the card back and fails if the stored query differs)
node .claude/skills/metabase/metabase.mjs update-question --id 123 --query "SELECT 1" --variables '{"from":{"id":"f","name":"from","display-name":"From","type":"date"}}'
# Description, or retire a superseded card
node .claude/skills/metabase/metabase.mjs update-question --id 123 --description "..."
node .claude/skills/metabase/metabase.mjs update-question --id 123 --archived true
# Change to bar chart
node .claude/skills/metabase/metabase.mjs update-question --id 123 --display bar
# Change to line chart with custom settings
node .claude/skills/metabase/metabase.mjs update-question --id 123 --display line \
--visualization '{"graph.dimensions":["date"],"graph.metrics":["count"]}'**Pass real SQL as `--query-file`, not `--query`.** A query with a comment header does not survive a shell argument intact, and a swallowed value is parsed as boolean `true` — which writes a card with no query and reports success. `create-question` and `run-query` take `--query-file` too.
An empty or whitespace-only `--query-file` is refused, because a file's emptiness is invisible to the caller — the program opened it, not them. An inline `--query " "` is still accepted: it was typed deliberately by someone who can see what they typed.
A write that contains a `{{snippet: ...}}` reference also verifies the snippet tag landed, not just the SQL. The two fail independently: a dropped tag leaves the query byte-identical and the card unrunnable.
Write a reference as `{{snippet: name}}`, lowercase. `{{snippet:name}}` is fine — Metabase normalises the missing space — but it does **not** normalise a space *before* the colon, and it **preserves the case of the prefix**. Both `{{snippet : name}}` and `{{SNIPPET: name}}` are references Metabase demands a tag for under that exact spelling, which this tool does not write, so the card cannot run. Both are refused rather than written.
🔴 **A comment line whose only content is `--` breaks parameter binding for the whole query** on the ClickHouse driver: every variable fails with *"we got more parameters than we can handle"*, which points at neither the line nor the cause. **Indentation does not save it** — an indented `--`, the usual form inside a CTE, breaks binding the same way. A trailing space or tab is the fix.
`create-question`, `update-question`, `run-query`, `create-snippet` and `update-snippet` all refuse text containing one. **No test can catch this**: the query runs clean until a variable is *bound*, so an unparameterised run and a card that merely exists both look correct. The guard is the only check that reaches it.
**Display types:** `table`, `bar`, `line`, `area`, `pie`, `scalar`, `row`, `funnel`, `map`, `scatter`, `waterfall`, `combo`, `smartscalar`, `progress`, `gauge`, `pivot`
node .claude/skills/metabase/metabase.mjs create-dashboard \ --name "Challenge Metrics" \ --collection 232 \ --description "Overview of challenge engagement and revenue"
# Add 3 cards in a 2-column layout node .claude/skills/metabase/metabase.mjs add-to-dashboard \ --dashboard 456 \ --cards "101,102,103" \ --cols 2
The `--co
Repo: civitai/civitai
Add a new ecosystem and base model to basemodel.constants.ts. Use when onboarding a new model…
Wire an existing ecosystem into the generation system. Adds generation support to…
Author a prompt-enhancement system prompt for a new ecosystem and register/update it on the…
Add a new trainable base model to BOTH trainers end-to-end — the in-app trainer (main Next.js…
Wire an existing ecosystem into the LoRA training system so it appears as a trainable base…
Deterministically drive a first-party Civitai App Block in the operator's browser and produce…