From duckdb-skills
Attaches DuckDB database file, validates it, explores schema (tables, columns, row counts up to 20 tables), and creates SQL state file for session restore in subsequent queries.
npx claudepluginhub duckdb/duckdb-skills --plugin duckdb-skillsThis skill is limited to using the following tools:
You are helping the user attach a DuckDB database file for interactive querying.
Executes raw SQL or natural language queries against attached DuckDB databases or ad-hoc files. Manages session state, schema retrieval, and result size estimation.
Execute DuckDB CLI commands for SQL queries on CSV/Parquet/JSON files, data conversion (CSV to Parquet, JSON to Parquet), persistent database management, and schema inspection.
Guides DuckDB SQL writing, analytical queries, CSV/Parquet/JSON ingestion, ETL pipelines, client APIs for Python/Node/Rust/Java/Go, extensions, configuration, and performance tuning.
Share bugs, ideas, or general feedback.
You are helping the user attach a DuckDB database file for interactive querying.
Database path given: $0
Follow these steps in order, stopping and reporting clearly if any step fails.
State file convention: see the "Resolve state directory" section below. All skills share a single state.sql file per project. Once resolved, any skill can use it with duckdb -init "$STATE_DIR/state.sql" -c "<QUERY>".
If $0 is a relative path, resolve it against $PWD to get an absolute path (RESOLVED_PATH).
RESOLVED_PATH="$(cd "$(dirname "$0")" 2>/dev/null && pwd)/$(basename "$0")"
Check the file exists:
test -f "$RESOLVED_PATH"
command -v duckdb
If not found, delegate to /duckdb-skills:install-duckdb and then continue.
duckdb "$RESOLVED_PATH" -c "PRAGMA version;"
First, list all tables:
duckdb "$RESOLVED_PATH" -csv -c "
SELECT table_name, estimated_size
FROM duckdb_tables()
ORDER BY table_name;
"
If the database has no tables, note that it is empty and skip to Step 5.
For each table discovered (up to 20), run:
duckdb "$RESOLVED_PATH" -csv -c "
DESCRIBE <table_name>;
SELECT count() AS row_count FROM <table_name>;
"
Collect the column definitions and row counts for the summary.
Check if a state file already exists in either location:
# Option 1: in the project directory
test -f .duckdb-skills/state.sql && STATE_DIR=".duckdb-skills"
# Option 2: in the home directory, scoped by project root path
PROJECT_ROOT="$(git rev-parse --show-toplevel 2>/dev/null || echo "$PWD")"
PROJECT_ID="$(echo "$PROJECT_ROOT" | tr '/' '-')"
test -f "$HOME/.duckdb-skills/$PROJECT_ID/state.sql" && STATE_DIR="$HOME/.duckdb-skills/$PROJECT_ID"
If neither exists, ask the user:
Where would you like to store the DuckDB session state for this project?
- In the project directory (
.duckdb-skills/state.sql) — colocated with the project, easy to find. You can choose to gitignore it.- In your home directory (
~/.duckdb-skills/<project-id>/state.sql) — keeps the project directory clean.
Based on their choice:
Option 1:
STATE_DIR=".duckdb-skills"
mkdir -p "$STATE_DIR"
Then ask: "Would you like to gitignore .duckdb-skills/?" If yes:
echo '.duckdb-skills/' >> .gitignore
Option 2:
PROJECT_ROOT="$(git rev-parse --show-toplevel 2>/dev/null || echo "$PWD")"
PROJECT_ID="$(echo "$PROJECT_ROOT" | tr '/' '-')"
STATE_DIR="$HOME/.duckdb-skills/$PROJECT_ID"
mkdir -p "$STATE_DIR"
state.sql is a shared, accumulative init file used by all duckdb-skills. It may already contain macros, LOAD statements, secrets, or other ATTACH statements written by other skills. Never overwrite it — always check for duplicates and append.
Derive the database alias from the filename without extension (e.g. my_data.duckdb → my_data). Check if this ATTACH already exists:
grep -q "ATTACH.*RESOLVED_PATH" "$STATE_DIR/state.sql" 2>/dev/null
If not already present, append:
cat >> "$STATE_DIR/state.sql" <<'STATESQL'
ATTACH IF NOT EXISTS 'RESOLVED_PATH' AS my_data;
USE my_data;
STATESQL
Replace RESOLVED_PATH and my_data with the actual values. If the alias would conflict with an existing one in the file, ask the user for a name.
duckdb -init "$STATE_DIR/state.sql" -c "SHOW TABLES;"
If this fails, fix the state file and retry.
Summarize for the user:
STATE_DIR/state.sql path/duckdb-skills:queryIf the database is empty, suggest creating tables or importing data.