Skip to main content

cube-build-model

Author and change a Cube semantic model — add or edit cubes, views, measures, dimensions, joins and pre-aggregations in YAML — on a dev-mode branch through the Cube MCP tools or the Cube CLI, then commit and build. Use whenever someone wants to add a metric, define a measure or dimension, create a cube or view, join two cubes, fix a model error, rename a field, or expose a field to business users. Triggers on "add a metric", "define revenue", "create a view for", "expose this field", "join orders to customers", "fix the model", "add a pre-aggregation". Read the model first with cube-explore-model. To run a query against the result use cube-run-query; to deploy or check build status use cube-deploy.

来源信息

仓库
cube-js/cube-agent-skills
最近来源活动
2026年9月23日 19:40
检测到的 SKILL.md 语言
英语
星标
2
分支
1

安装方式

默认使用会先检查来源的 Prompt;你也可以切换为直接命令,或下载本地副本。

检查来源文件

决定是否安装前,请先阅读 SKILL.md,以及 SkillsMP 当前展示的配套文件。

正在显示 SKILL.md

SKILL.md
来源说明 · 只读预览
name
cube-build-model
description
Author and change a Cube semantic model — add or edit cubes, views, measures, dimensions, joins and pre-aggregations in YAML — on a dev-mode branch through the Cube MCP tools or the Cube CLI, then commit and build. Use whenever someone wants to add a metric, define a measure or dimension, create a cube or view, join two cubes, fix a model error, rename a field, or expose a field to business users. Triggers on "add a metric", "define revenue", "create a view for", "expose this field", "join orders to customers", "fix the model", "add a pre-aggregation". Read the model first with cube-explore-model. To run a query against the result use cube-run-query; to deploy or check build status use cube-deploy.
license
Apache-2.0
compatibility
Needs the Cube MCP server (bundled in the Cube plugin, or the Cube connector) or the Cube CLI, and network access to Cube Cloud.
# Build and change a Cube semantic model Writes state. The API rejects file writes on any branch that is not a dev-mode branch, so the branch dance below is not optional ceremony — skip it and every write fails. ## Choose the path Cube MCP tools are written `cube:<tool>` below: the `cube` server this plugin bundles. Through the Cube connector, the same tools carry the connector's name. **If the Cube MCP tools are available** (this plugin's `cube` server or the Cube connector), use them. The loop: 1. `cube:startDataModelEdit` — returns the dev `branchName`. Pass it to every call below and reuse it; calling this again starts a new edit session. 2. `cube:listDataModelFiles`, `cube:readDataModelFile` — read before you write. 3. `cube:writeDataModelFile` — whole-file replacement. It recompiles and returns `valid` and any `validationError`; fix and write again until it is valid. 4. `cube:getDataModelChanges` — review the diff. 5. `cube:searchDataModel` and `cube:runQuery` with the same `branchName` — confirm the new member is exposed and returns the right number. 6. `cube:commitDataModelChanges` — until this runs, nobody else can see the work. Name the branch it reports and offer `cube:switchUserBranch`. 7. `cube:mergeToDefaultBranch` — **only** when the user explicitly asks to publish. It makes the change live for everyone. For a new pre-aggregation, check it with `cube:getPreAggregationStatus`, then `cube:buildPreAggregation` for that one rollup, passing the dev `branchName`. A build runs real queries against the warehouse. Use the CLI path when the MCP tools are not connected, or to deploy a whole local project with `cube deploy`. Reading first and the [conventions](#conventions) apply to both paths. ## Preflight (CLI) ```bash command -v cube >/dev/null || echo "Cube CLI not installed: curl -fsSL https://raw.githubusercontent.com/cube-js/cube/master/install-cli.sh | sh" cube whoami || echo "Not authenticated. Interactive: cube login. Headless: set CUBE_API_URL + CUBE_API_KEY." cube context list # confirm the tenant before writing anything ``` ## Read before you write Never author against an assumed model. Pull the current state first — over MCP with `cube:listDataModelFiles` and `cube:readDataModelFile`, or with the CLI: ```bash cube data-model list <deployment> --content --json > /tmp/model.json ``` Match the project's existing conventions — file layout, naming, whether measures live on cubes or views, how joins are declared. A correct cube that looks nothing like its neighbours is a bad contribution. ## The dev-mode workflow ```bash # 1. See what branches exist, and which one is the deploy branch cube data-model branches <deployment> # 2. Create a feature branch to work on cube data-model create-branch <deployment> <feature-branch> # 3. Enter dev mode on the feature branch. This forks a personal `dev-…` # branch and PRINTS ITS NAME. Capture it — writes must target it. cube data-model dev-mode <deployment> <feature-branch> # 4. Write files to the dev branch cube data-model put <deployment> model/cubes/orders.yml --file ./orders.yml --branch <dev-branch> cube data-model put <deployment> model/views/revenue.yml --content - --branch <dev-branch> # stdin # 5. Validate the uncommitted working copy; fix and repeat until it passes cube validate <deployment> --dev-mode # 6. Commit — this lands on <feature-branch>, not production cube data-model commit <deployment> -m "Add revenue view" --branch <dev-branch> # 7. Wait for the build; exits non-zero if it fails cube deployments build-status <deployment> --branch <dev-branch> --wait # 8. Leave dev mode when done cube data-model exit-dev-mode <deployment> ``` **Never enter dev mode directly on the deploy branch.** `commit` pushes into the branch dev mode was forked from, so a dev branch of the deploy branch commits straight to production. Step 2 is what keeps the change reviewable. Publishing is a separate step, and only when the user explicitly asks for it: ```bash cube data-model merge-to-default <deployment> --branch <feature-branch> -m "Add revenue view" ``` It merges into the deploy branch — live for everyone — and deletes the feature branch unless you pass `--keep-branch`. `--branch` defaults to your active dev-mode branch, so once step 3 has run you can usually omit it. Pass it explicitly anyway when you are working across more than one deployment in a session — the default is per-user, not per-command, and it is easy to write to the wrong place. Other file operations, same branch rules: ```bash cube data-model rename <deployment> model/cubes/old.yml model/cubes/new.yml --branch <dev-branch> cube data-model delete <deployment> model/cubes/dead.yml --branch <dev-branch> ``` ## Validate before you commit (CLI) ```bash cube validate <deployment> --dev-mode # your uncommitted working copy cube validate <deployment> --branch <branch> # any named branch ``` It compiles the model on that branch's own runtime and exits non-zero with the errors listed per file. Report them verbatim rather than guessing at the cause — Cube's model errors name the file and the member. After committing, `cube deployments build-status --wait` is the final word on the build. After a green build, confirm the change is actually queryable. A measure can compile and still not be exposed in any view: ```bash cube meta --selectors '[{"type":"cube","deploymentId":<id>,"environment":"<dev-branch>"}]' ``` Then hand off to `cube-run-query` to check the number is right. Compiling is not the same as being correct, and a measure whose SQL is wrong builds perfectly. ## Deploying a local project instead When the user has the project on disk rather than wanting file-by-file edits: ```bash cube deploy <deployment> -m "<message>" # uploads the local directory and builds ``` This is a different workflow from the dev-mode one above — it replaces the project from local files. It deploys to your active dev-mode branch if you have one, otherwise the deploy branch, and **deletes remote files that are not in the local directory** unless you pass `--keep-missing`. Say which branch it will land on before running it, and do not mix the two workflows in one task without saying so. ## Conventions - Cubes are the physical layer; views are what users query. New business metrics usually belong on a view, or on a cube and then exposed via a view. - Keep one cube per file, named after the cube. - Quote the user's own definition back when you write a `sql` expression. If they said "revenue excludes refunds", that belongs in the SQL and in a `description`, not just in the chat. ## When something fails | Symptom | Cause | | --- | --- | | Write rejected | Not on a dev-mode branch — run `cube data-model dev-mode` and use the branch it prints | | `validate` fails | Real model error — fix the named file and validate again before committing | | `not logged in` | Rerun the preflight; do not retry the write | | Build fails after commit | Real model error — read the build status output and fix the named file | | Change builds but is not queryable | Not exposed in a view; check `cube meta` |
在 GitHub 查看