Big News: Socket raises $60M Series C at a $1B valuation to secure software supply chains for AI-driven development.Announcement
Sign In

@bonnard/cli

Package Overview
Dependencies
Maintainers
1
Versions
49
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@bonnard/cli - npm Package Compare versions

Comparing version
0.2.11
to
0.2.12
+59
-76
dist/docs/topics/dashboards.examples.md

@@ -18,20 +18,17 @@ # Examples

` ``query total_revenue
cube: orders
measures: [total_revenue]
measures: [orders.total_revenue]
` ``
` ``query order_count
cube: orders
measures: [count]
measures: [orders.count]
` ``
` ``query avg_order
cube: orders
measures: [avg_order_value]
measures: [orders.avg_order_value]
` ``
<Grid cols="3">
<BigValue data={total_revenue} value="total_revenue" title="Total Revenue" />
<BigValue data={order_count} value="count" title="Orders" />
<BigValue data={avg_order} value="avg_order_value" title="Avg Order" />
<BigValue data={total_revenue} value="orders.total_revenue" title="Total Revenue" />
<BigValue data={order_count} value="orders.count" title="Orders" />
<BigValue data={avg_order} value="orders.avg_order_value" title="Avg Order" />
</Grid>

@@ -42,6 +39,5 @@

` ``query monthly_revenue
cube: orders
measures: [total_revenue]
measures: [orders.total_revenue]
timeDimension:
dimension: created_at
dimension: orders.created_at
granularity: month

@@ -51,3 +47,3 @@ dateRange: [2025-01-01, 2025-12-31]

<LineChart data={monthly_revenue} x="created_at" y="total_revenue" title="Monthly Revenue" />
<LineChart data={monthly_revenue} x="orders.created_at" y="orders.total_revenue" title="Monthly Revenue" />

@@ -57,10 +53,9 @@ ## By Category

` ``query by_category
cube: orders
measures: [total_revenue, count]
dimensions: [category]
measures: [orders.total_revenue, orders.count]
dimensions: [orders.category]
orderBy:
total_revenue: desc
orders.total_revenue: desc
` ``
<BarChart data={by_category} x="category" y="total_revenue" title="Revenue by Category" />
<BarChart data={by_category} x="orders.category" y="orders.total_revenue" title="Revenue by Category" />
<DataTable data={by_category} />

@@ -82,8 +77,7 @@ ```

` ``query by_status
cube: orders
measures: [count]
dimensions: [status]
measures: [orders.count]
dimensions: [orders.status]
` ``
<PieChart data={by_status} name="status" value="count" title="Order Status" />
<PieChart data={by_status} name="orders.status" value="orders.count" title="Order Status" />

@@ -93,11 +87,10 @@ ## Top Cities

` ``query top_cities
cube: orders
measures: [total_revenue, count]
dimensions: [city]
measures: [orders.total_revenue, orders.count]
dimensions: [orders.city]
orderBy:
total_revenue: desc
orders.total_revenue: desc
limit: 10
` ``
<BarChart data={top_cities} x="city" y="total_revenue" horizontal />
<BarChart data={top_cities} x="orders.city" y="orders.total_revenue" horizontal />
<DataTable data={top_cities} />

@@ -108,10 +101,9 @@

` ``query completed_trend
cube: orders
measures: [total_revenue]
measures: [orders.total_revenue]
timeDimension:
dimension: created_at
dimension: orders.created_at
granularity: week
dateRange: [2025-01-01, 2025-06-30]
filters:
- dimension: status
- dimension: orders.status
operator: equals

@@ -121,3 +113,3 @@ values: [completed]

<AreaChart data={completed_trend} x="created_at" y="total_revenue" title="Completed Order Revenue" />
<AreaChart data={completed_trend} x="orders.created_at" y="orders.total_revenue" title="Completed Order Revenue" />
```

@@ -138,7 +130,6 @@

` ``query revenue_by_channel
cube: orders
measures: [total_revenue]
dimensions: [channel]
measures: [orders.total_revenue]
dimensions: [orders.channel]
timeDimension:
dimension: created_at
dimension: orders.created_at
granularity: month

@@ -150,7 +141,7 @@ dateRange: [2025-01-01, 2025-12-31]

<BarChart data={revenue_by_channel} x="created_at" y="total_revenue" series="channel" title="Revenue by Channel" />
<BarChart data={revenue_by_channel} x="orders.created_at" y="orders.total_revenue" series="orders.channel" title="Revenue by Channel" />
## Grouped Bar
<BarChart data={revenue_by_channel} x="created_at" y="total_revenue" series="channel" type="grouped" title="Revenue by Channel (Grouped)" />
<BarChart data={revenue_by_channel} x="orders.created_at" y="orders.total_revenue" series="orders.channel" type="grouped" title="Revenue by Channel (Grouped)" />

@@ -160,6 +151,5 @@ ## Multi-Line

` ``query trend
cube: orders
measures: [total_revenue, count]
measures: [orders.total_revenue, orders.count]
timeDimension:
dimension: created_at
dimension: orders.created_at
granularity: month

@@ -169,7 +159,7 @@ dateRange: [2025-01-01, 2025-12-31]

<LineChart data={trend} x="created_at" y="total_revenue,count" title="Revenue vs Orders" />
<LineChart data={trend} x="orders.created_at" y="orders.total_revenue,orders.count" title="Revenue vs Orders" />
## Stacked Area by Channel
<AreaChart data={revenue_by_channel} x="created_at" y="total_revenue" series="channel" type="stacked" title="Revenue by Channel" />
<AreaChart data={revenue_by_channel} x="orders.created_at" y="orders.total_revenue" series="orders.channel" type="stacked" title="Revenue by Channel" />
```

@@ -190,10 +180,9 @@

` ``query totals
cube: orders
measures: [total_revenue, count, avg_order_value]
measures: [orders.total_revenue, orders.count, orders.avg_order_value]
` ``
<Grid cols="3">
<BigValue data={totals} value="total_revenue" title="Revenue" fmt="eur2" />
<BigValue data={totals} value="count" title="Orders" fmt="num0" />
<BigValue data={totals} value="avg_order_value" title="Avg Order" fmt="eur2" />
<BigValue data={totals} value="orders.total_revenue" title="Revenue" fmt="eur2" />
<BigValue data={totals} value="orders.count" title="Orders" fmt="num0" />
<BigValue data={totals} value="orders.avg_order_value" title="Avg Order" fmt="eur2" />
</Grid>

@@ -204,6 +193,5 @@

` ``query monthly
cube: orders
measures: [total_revenue]
measures: [orders.total_revenue]
timeDimension:
dimension: created_at
dimension: orders.created_at
granularity: month

@@ -213,3 +201,3 @@ dateRange: [2025-01-01, 2025-12-31]

<LineChart data={monthly} x="created_at" y="total_revenue" title="Monthly Revenue" yFmt="eur" />
<LineChart data={monthly} x="orders.created_at" y="orders.total_revenue" title="Monthly Revenue" yFmt="eur" />

@@ -219,10 +207,9 @@ ## Detail Table

` ``query details
cube: orders
measures: [total_revenue, count]
dimensions: [category]
measures: [orders.total_revenue, orders.count]
dimensions: [orders.category]
orderBy:
total_revenue: desc
orders.total_revenue: desc
` ``
<DataTable data={details} fmt="total_revenue:eur2,count:num0" />
<DataTable data={details} fmt="orders.total_revenue:eur2,orders.count:num0" />
```

@@ -243,17 +230,15 @@

<DateRange name="period" default="last-6-months" label="Time Period" />
<Dropdown name="channel" dimension="channel" data={channels} queries="trend,by_city" label="Channel" />
<Dropdown name="channel" dimension="orders.channel" data={channels} queries="trend,by_city" label="Channel" />
` ``query channels
cube: orders
dimensions: [channel]
dimensions: [orders.channel]
` ``
` ``query kpis
cube: orders
measures: [total_revenue, count]
measures: [orders.total_revenue, orders.count]
` ``
<Grid cols="2">
<BigValue data={kpis} value="total_revenue" title="Revenue" fmt="eur2" />
<BigValue data={kpis} value="count" title="Orders" fmt="num0" />
<BigValue data={kpis} value="orders.total_revenue" title="Revenue" fmt="eur2" />
<BigValue data={kpis} value="orders.count" title="Orders" fmt="num0" />
</Grid>

@@ -264,10 +249,9 @@

` ``query trend
cube: orders
measures: [total_revenue]
measures: [orders.total_revenue]
timeDimension:
dimension: created_at
dimension: orders.created_at
granularity: month
` ``
<LineChart data={trend} x="created_at" y="total_revenue" title="Monthly Revenue" yFmt="eur" />
<LineChart data={trend} x="orders.created_at" y="orders.total_revenue" title="Monthly Revenue" yFmt="eur" />

@@ -277,11 +261,10 @@ ## By City

` ``query by_city
cube: orders
measures: [total_revenue]
dimensions: [city]
measures: [orders.total_revenue]
dimensions: [orders.city]
orderBy:
total_revenue: desc
orders.total_revenue: desc
limit: 10
` ``
<BarChart data={by_city} x="city" y="total_revenue" title="Top Cities" yFmt="eur" />
<BarChart data={by_city} x="orders.city" y="orders.total_revenue" title="Top Cities" yFmt="eur" />
```

@@ -295,8 +278,8 @@

- **One query per chart**: Each component gets its own query — keep them focused
- **Use views**: Prefer view names over cube names when available for cleaner field names
- **Use views**: Prefer view names over cube names when available
- **Name queries descriptively**: `monthly_revenue` is better than `q1`
- **Limit large datasets**: Add `limit` to dimension queries to avoid oversized charts
- **Time series**: Always use `timeDimension` with `granularity` for time-based charts
- **Multi-series**: Use `series="column"` to split data by a dimension. For bars, default is stacked; use `type="grouped"` for side-by-side
- **Multiple y columns**: Use comma-separated values like `y="revenue,cases"` to show multiple measures on one chart
- **Multi-series**: Use `series="cube.column"` to split data by a dimension. For bars, default is stacked; use `type="grouped"` for side-by-side
- **Multiple y columns**: Use comma-separated values like `y="orders.revenue,orders.cases"` to show multiple measures on one chart

@@ -303,0 +286,0 @@ ## See Also

@@ -57,3 +57,3 @@ # Inputs

```markdown
<Dropdown name="channel" dimension="channel" data={channels} queries="main,trend" label="Channel" />
<Dropdown name="channel" dimension="orders.channel" data={channels} queries="main,trend" label="Channel" />
```

@@ -90,10 +90,9 @@

` ``query monthly_revenue
cube: orders
measures: [total_revenue]
measures: [orders.total_revenue]
timeDimension:
dimension: created_at
dimension: orders.created_at
granularity: month
` ``
<LineChart data={monthly_revenue} x="created_at" y="total_revenue" />
<LineChart data={monthly_revenue} x="orders.created_at" y="orders.total_revenue" />
```

@@ -111,15 +110,13 @@

` ``query channels
cube: orders
dimensions: [channel]
dimensions: [orders.channel]
` ``
<Dropdown name="ch" dimension="channel" data={channels} queries="main" label="Channel" />
<Dropdown name="ch" dimension="orders.channel" data={channels} queries="main" label="Channel" />
` ``query main
cube: orders
measures: [total_revenue]
dimensions: [city]
measures: [orders.total_revenue]
dimensions: [orders.city]
` ``
<BarChart data={main} x="city" y="total_revenue" />
<BarChart data={main} x="orders.city" y="orders.total_revenue" />
```

@@ -135,26 +132,23 @@

<DateRange name="period" default="last-6-months" label="Time Period" />
<Dropdown name="channel" dimension="channel" data={channels} queries="trend,by_city" label="Channel" />
<Dropdown name="channel" dimension="orders.channel" data={channels} queries="trend,by_city" label="Channel" />
` ``query channels
cube: orders
dimensions: [channel]
dimensions: [orders.channel]
` ``
` ``query trend
cube: orders
measures: [total_revenue]
measures: [orders.total_revenue]
timeDimension:
dimension: created_at
dimension: orders.created_at
granularity: month
` ``
<LineChart data={trend} x="created_at" y="total_revenue" />
<LineChart data={trend} x="orders.created_at" y="orders.total_revenue" />
` ``query by_city
cube: orders
measures: [total_revenue]
dimensions: [city]
measures: [orders.total_revenue]
dimensions: [orders.city]
` ``
<BarChart data={by_city} x="city" y="total_revenue" />
<BarChart data={by_city} x="orders.city" y="orders.total_revenue" />
```

@@ -161,0 +155,0 @@

@@ -30,15 +30,13 @@ # Dashboards

` ``query order_count
cube: orders
measures: [count]
measures: [orders.count]
` ``
<BigValue data={order_count} value="count" title="Total Orders" />
<BigValue data={order_count} value="orders.count" title="Total Orders" />
` ``query by_status
cube: orders
measures: [count]
dimensions: [status]
measures: [orders.count]
dimensions: [orders.status]
` ``
<BarChart data={by_status} x="status" y="count" />
<BarChart data={by_status} x="orders.status" y="orders.count" />
```

@@ -45,0 +43,0 @@

@@ -9,3 +9,3 @@ # Queries

Query blocks have a unique name and map to a `QueryOptions` shape. Components reference them using `data={query_name}`. Field names are unqualified — use `count` not `orders.count` — because the `cube` property provides the context.
Query blocks have a unique name and map to a `QueryOptions` shape. Components reference them using `data={query_name}`. All field names must be fully qualified with the cube or view name (e.g. `orders.count`, `orders.created_at`).

@@ -18,6 +18,5 @@ ## Syntax

```query revenue_trend
cube: orders
measures: [total_revenue]
measures: [orders.total_revenue]
timeDimension:
dimension: created_at
dimension: orders.created_at
granularity: month

@@ -32,8 +31,7 @@ dateRange: [2025-01-01, 2025-12-31]

|----------|------|----------|-------------|
| `cube` | string | Yes | The cube or view to query (e.g. `orders`) |
| `measures` | string[] | No | Measures to aggregate (e.g. `[count, total_revenue]`) |
| `dimensions` | string[] | No | Dimensions to group by (e.g. `[status, city]`) |
| `measures` | string[] | No | Fully qualified measures to aggregate (e.g. `[orders.count, orders.total_revenue]`) |
| `dimensions` | string[] | No | Fully qualified dimensions to group by (e.g. `[orders.status, orders.city]`) |
| `filters` | Filter[] | No | Row-level filters |
| `timeDimension` | object | No | Time-based grouping and date range |
| `orderBy` | object | No | Sort specification (e.g. `{total_revenue: desc}`) |
| `orderBy` | object | No | Sort specification (e.g. `{orders.total_revenue: desc}`) |
| `limit` | number | No | Maximum rows to return |

@@ -45,3 +43,3 @@

|----------|------|----------|-------------|
| `dimension` | string | Yes | Time dimension name (e.g. `created_at`) |
| `dimension` | string | Yes | Fully qualified time dimension name (e.g. `orders.created_at`) |
| `granularity` | string | No | `day`, `week`, `month`, `quarter`, or `year` |

@@ -66,4 +64,3 @@ | `dateRange` | string[] | No | `[start, end]` in `YYYY-MM-DD` format |

```query total_orders
cube: orders
measures: [count]
measures: [orders.count]
```

@@ -76,7 +73,6 @@ ````

```query revenue_by_city
cube: orders
measures: [total_revenue]
dimensions: [city]
measures: [orders.total_revenue]
dimensions: [orders.city]
orderBy:
total_revenue: desc
orders.total_revenue: desc
limit: 10

@@ -90,6 +86,5 @@ ```

```query monthly_revenue
cube: orders
measures: [total_revenue]
measures: [orders.total_revenue]
timeDimension:
dimension: created_at
dimension: orders.created_at
granularity: month

@@ -104,7 +99,6 @@ dateRange: [2025-01-01, 2025-12-31]

```query completed_orders
cube: orders
measures: [count, total_revenue]
dimensions: [category]
measures: [orders.count, orders.total_revenue]
dimensions: [orders.category]
filters:
- dimension: status
- dimension: orders.status
operator: equals

@@ -119,4 +113,3 @@ values: [completed]

- Query names must be unique within a dashboard
- Every query must specify a `cube`
- Field names are unqualified (use `count` not `orders.count`) — the `cube` provides the context
- All field names must be fully qualified with the cube or view name (e.g. `orders.count`, not `count`)
- Components reference queries by name: `data={query_name}`

@@ -123,0 +116,0 @@

@@ -21,7 +21,6 @@ # SDK

const result = await bonnard.query({
cube: 'orders',
measures: ['revenue', 'count'],
dimensions: ['status'],
measures: ['orders.revenue', 'orders.count'],
dimensions: ['orders.status'],
timeDimension: {
dimension: 'created_at',
dimension: 'orders.created_at',
granularity: 'month',

@@ -28,0 +27,0 @@ dateRange: ['2025-01-01', '2025-12-31'],

{
"name": "@bonnard/cli",
"version": "0.2.11",
"version": "0.2.12",
"type": "module",

@@ -5,0 +5,0 @@ "bin": {

+166
-51

@@ -1,18 +0,50 @@

# @bonnard/cli
<p align="center">
<a href="https://www.bonnard.dev">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="./assets/banner-dark.png" />
<source media="(prefers-color-scheme: light)" srcset="./assets/banner-light.png" />
<img alt="Bonnard -the semantic engine for MCP clients, AI agents, and data teams" src="./assets/banner-light.png" width="100%" />
</picture>
</a>
</p>
The Bonnard CLI (`bon`) takes you from zero to a deployed semantic layer in minutes. Define metrics in YAML, validate locally, deploy, and query — from your terminal or AI coding agent.
<p align="center">
<strong>The semantic engine for MCP clients. Define metrics once, query from anywhere.</strong>
</p>
**Open source** — [view source on GitHub](https://github.com/meal-inc/bonnard-cli)
<p align="center">
<a href="https://www.npmjs.com/package/@bonnard/cli"><img src="https://img.shields.io/npm/v/@bonnard/cli?style=flat-square&color=0891b2" alt="npm version" /></a>
<a href="https://github.com/meal-inc/bonnard-cli/blob/main/LICENSE"><img src="https://img.shields.io/github/license/meal-inc/bonnard-cli?style=flat-square" alt="MIT License" /></a>
<a href="https://discord.com/invite/RQuvjGRz"><img src="https://img.shields.io/badge/Discord-Join%20us-5865F2?style=flat-square&logo=discord&logoColor=white" alt="Discord" /></a>
</p>
## Quick start
<p align="center">
<a href="https://docs.bonnard.dev/docs/">Docs</a> &middot;
<a href="https://docs.bonnard.dev/docs/getting-started">Getting Started</a> &middot;
<a href="https://docs.bonnard.dev/docs/changelog">Changelog</a> &middot;
<a href="https://discord.com/invite/RQuvjGRz">Discord</a> &middot;
<a href="https://www.bonnard.dev">Website</a>
</p>
---
Bonnard is an agent-native semantic layer CLI. Deploy an MCP server and governed analytics API in minutes -for AI agents, BI tools, and data teams. Define metrics and dimensions in YAML, validate locally, and ship to production. Works with Snowflake, BigQuery, Databricks, and PostgreSQL. Ships with native integrations for Claude Code, Cursor, and Codex. Built with TypeScript.
## Why Bonnard?
Most semantic layers were built for dashboards and retrofitted for AI. Bonnard was built the other way around -agent-native from day one with Model Context Protocol (MCP) as a core feature, not a plugin. One CLI takes you from an empty directory to a production semantic layer serving AI agents, BI tools, and human analysts through a single governed API.
<p align="center">
<img src="./assets/architecture.png" alt="Bonnard architecture -data sources flow through the semantic layer to AI agents, BI tools, and MCP clients" width="100%" />
</p>
## Quick Start
No install required. Run directly with npx:
```bash
npx @bonnard/cli init # Create project structure + agent templates
bon datasource add --demo # Add demo dataset (no warehouse needed)
bon validate # Check syntax
bon login # Authenticate with Bonnard
bon deploy -m "Initial deploy" # Deploy to Bonnard
npx @bonnard/cli init
```
No install needed — `npx` runs the CLI directly. Or install globally for shorter commands:
Or install globally:

@@ -23,51 +55,96 @@ ```bash

Then follow the setup flow:
```bash
bon init # Scaffold project + agent configs
bon datasource add # Connect your warehouse
bon validate # Check your models locally
bon login # Authenticate
bon deploy # Ship it
```
No warehouse yet? Start exploring with a full retail demo dataset:
```bash
bon datasource add --demo
```
Requires Node.js 20+.
## Commands
## Agent-Native from Day One
| Command | Description |
|---------|-------------|
| `bon init` | Create project structure and AI agent templates |
| `bon login` | Authenticate with Bonnard |
| `bon logout` | Remove stored credentials |
| `bon whoami` | Show current login status |
| `bon datasource add` | Add a data source (interactive) |
| `bon datasource add --demo` | Add read-only demo dataset |
| `bon datasource add --from-dbt` | Import from dbt profiles |
| `bon datasource list` | List configured data sources |
| `bon datasource remove <name>` | Remove a data source |
| `bon validate` | Validate cube and view YAML |
| `bon deploy -m "message"` | Deploy to Bonnard |
| `bon deployments` | List deployment history |
| `bon diff <id>` | View changes in a deployment |
| `bon annotate <id>` | Add context to deployment changes |
| `bon query '{"measures":["orders.count"]}'` | Query the semantic layer (JSON) |
| `bon query "SELECT ..." --sql` | Query the semantic layer (SQL) |
| `bon mcp` | MCP setup instructions for AI agents |
| `bon mcp test` | Test MCP server connectivity |
| `bon docs [topic]` | Browse modeling documentation |
| `bon docs --search "joins"` | Search documentation |
When you run `bon init`, Bonnard generates context files so AI coding agents understand your semantic layer from the first prompt:
## Agent-ready from the start
```
you@work my-project % bon init
`bon init` generates context files for your AI coding tools:
Initialised Bonnard project
Core files:
bon.yaml
bonnard/cubes/
bonnard/views/
Agent support:
.claude/rules/bonnard.md
.claude/skills/bonnard-get-started/
.cursor/rules/bonnard.mdc
AGENTS.md
```
- **Claude Code** — `.claude/rules/` + get-started skill
- **Cursor** — `.cursor/rules/` with auto-apply frontmatter
- **Codex** — `AGENTS.md` + skills folder
| Agent | What gets generated |
| --- | --- |
| **Claude Code** | `.claude/rules/bonnard.md` + skill templates in `.claude/skills/` |
| **Cursor** | `.cursor/rules/bonnard.mdc` with frontmatter configuration |
| **Codex** | `AGENTS.md` + skills directory |
Your agent understands Bonnard's modeling language from the first prompt.
Set up your MCP server so agents can query your semantic layer directly:
## Project structure
```bash
bon mcp setup # Configure MCP server
bon mcp test # Verify the connection
```
After `bon init`:
## Auto-Detected from Your Project
<p align="center">
<img src="./assets/datasources.png" alt="Auto-detected warehouses and data tools -Snowflake, BigQuery, PostgreSQL, Databricks, DuckDB, dbt, Dagster, Prefect, Airflow, Looker, Cube, Evidence, SQLMesh, Soda, Great Expectations" width="100%" />
</p>
Bonnard automatically detects your warehouses and data tools. Point it at your project and it discovers schemas, tables, and relationships.
- **Snowflake** -full support including Snowpark
- **Google BigQuery** -native integration
- **Databricks** -SQL warehouses and Unity Catalog
- **PostgreSQL** -including cloud-hosted variants (Supabase, Neon, RDS)
- **DuckDB** -local development and testing
- **dbt** -model and profile import
- **Dagster, Prefect, Airflow** -orchestration tools
- **Looker, Cube, Evidence** -existing BI layers
- **SQLMesh, Soda, Great Expectations** -data quality and transformation
## Querying
Query your semantic layer from the terminal using JSON or SQL syntax:
```bash
# JSON query
bon query --measures revenue,order_count --dimensions product_category --time-dimension created_at
# SQL query
bon query --sql "SELECT product_category, MEASURE(revenue) FROM orders GROUP BY 1"
```
Agents connected via MCP can run the same queries programmatically, with full access to your governed metric definitions.
## Project Structure
```
my-project/
├── bon.yaml # Project configuration
├── bonnard/
│ ├── cubes/ # Cube definitions (measures, dimensions, joins)
│ └── views/ # View definitions (curated query interfaces)
└── .bon/ # Local config (gitignored)
└── datasources.yaml # Data source credentials
│ ├── cubes/ # Metric and dimension definitions
│ └── views/ # Curated query interfaces
├── .bon/ # Local credentials (gitignored)
├── .claude/ # Claude Code agent context
├── .cursor/ # Cursor agent context
└── AGENTS.md # Codex agent context
```

@@ -77,13 +154,51 @@

Deploy from your pipeline with the `--ci` flag for non-interactive mode:
```bash
bon deploy --ci -m "CI deploy"
bon deploy --ci
```
Non-interactive mode for pipelines. Datasources are synced automatically.
Handles automatic datasource synchronisation and skips interactive prompts. Fits into GitHub Actions, GitLab CI, or any pipeline that runs Node.js.
## Commands
| Command | Description |
| --- | --- |
| `bon init` | Scaffold a new project with agent configs |
| `bon datasource add` | Connect a data source (or `--demo` for sample data) |
| `bon datasource add --from-dbt` | Import from dbt profiles |
| `bon datasource list` | List connected data sources |
| `bon validate` | Validate models locally before deploying |
| `bon deploy` | Deploy semantic layer to production |
| `bon deployments` | List active deployments |
| `bon diff` | Preview changes before deploying |
| `bon annotate` | Add metadata and descriptions to models |
| `bon query` | Run queries from the terminal (JSON or SQL) |
| `bon mcp setup` | Configure MCP server for agent access |
| `bon mcp test` | Test MCP connection |
| `bon docs` | Browse or search documentation from the CLI |
| `bon login` / `bon logout` | Manage authentication |
| `bon whoami` | Check current session |
For the full CLI reference, see the [documentation](https://docs.bonnard.dev/docs/cli-reference).
## Documentation
- [Getting Started](https://docs.bonnard.dev/docs/getting-started)
- [CLI Reference](https://docs.bonnard.dev/docs/cli)
- [Modeling Guide](https://docs.bonnard.dev/docs/modeling/cubes)
- [Querying](https://docs.bonnard.dev/docs/querying)
- [Getting Started](https://docs.bonnard.dev/docs/getting-started) -from zero to deployed in minutes
- [CLI Reference](https://docs.bonnard.dev/docs/cli-reference) -every command, flag, and option
- [Modeling Guide](https://docs.bonnard.dev/docs/modeling) -cubes, views, metrics, and dimensions
- [Querying](https://docs.bonnard.dev/docs/querying) -JSON and SQL query syntax
- [Changelog](https://docs.bonnard.dev/docs/changelog) -what shipped and when
## Community
- [Discord](https://discord.com/invite/RQuvjGRz) -ask questions, share feedback, connect with the team
- [GitHub Issues](https://github.com/meal-inc/bonnard-cli/issues) -bug reports and feature requests
- [LinkedIn](https://www.linkedin.com/company/bonnarddev/) -follow for updates
- [Website](https://www.bonnard.dev) -learn more about Bonnard
Contributions are welcome. If you find a bug or have an idea, open an issue or submit a pull request.
## License
[MIT](./LICENSE)

Sorry, the diff of this file is too big to display