一键导入
malloy-publish
Package Malloy models for serving by Malloy Publisher. Use when user asks to "publish", "package", "deploy", or wants to share models with others.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Package Malloy models for serving by Malloy Publisher. Use when user asks to "publish", "package", "deploy", or wants to share models with others.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Build or modify an in-package HTML data app for a Malloy Publisher package (a public/ directory the package serves). Use when the user wants a hand-authored HTML dashboard or web page backed by a package's Malloy models, with no build step.
Common data analysis pitfalls to watch for during query construction and result interpretation. Reference this checklist when verifying queries and results to catch errors before presenting an answer.
Combine validated Malloy queries into a notebook report or dashboard. Use when the user asks to "create a report", "build a dashboard", "combine these into a report", or wants a persistent multi-query artifact.
Workflow for answering data questions against Malloy semantic models over MCP - structured discovery with get_context, query construction with execute_query, verification, and answer delivery. Use whenever the user asks a data question, wants a metric, a breakdown, a trend, or a chart over a model.
Explore data for insights and build views/dashboards/notebooks. Use when user asks to "analyze this data", "find insights", "explore for patterns", "what's interesting", "what's driving X", "build a dashboard", "create views", or any analysis task. For EDA exploration, start at Step 1. For building views on an existing model, jump to View Patterns.
Chart selection guidance and renderer reference for Malloy views. Use when choosing visualization types, adding chart annotations, user asks "what chart should I use", "how should I visualize this", or when deciding between bar_chart, line_chart, scatter_chart, etc.
| name | malloy-publish |
| description | Package Malloy models for serving by Malloy Publisher. Use when user asks to "publish", "package", "deploy", or wants to share models with others. |
CRITICAL: Only package or prepare a release when the user explicitly asks. Making model changes, adding documentation, or building notebooks is NOT a publish request. Never auto-package after completing other tasks.
Automated publishing is not part of the open-source Malloy Publisher tool surface yet. There is no publish tool to call from this skill. What this skill does is get a package into a publishable shape: a valid publisher.json, a flat layout, and the right files in the package root.
Once the package is in shape, self-hosters publish it through their own host: commit the package to git, then run the host's publish path (for example, the deploy step that points a Publisher server at the package directory or repository). The mechanics of that path depend on how the Publisher instance is deployed, so confirm with the user how their instance is served rather than assuming a hosted control plane.
.malloy) and/or notebook (.malloynb) files readyCheck if publisher.json exists in the package root. If it does, proceed to Step 2.
If it doesn't exist, create one. Suggest a package name based on the model content, write a brief description, and default to version 0.0.1.
{
"name": "package-name",
"version": "0.0.1",
"description": "Brief description of the package"
}
Naming conventions:
name: lowercase, hyphens allowed (e.g., ecommerce, sales-analytics)version: semver format (e.g., 0.0.1, 1.2.3)By default a package exposes everything: every model is listed and every source is directly queryable. That's the right behavior for most packages, and it's the safe default: omit these fields and nothing changes. Reach for them when you have raw/staging/scaffolding sources that exist to build a curated entry point and you don't want agents landing on (or querying) them directly.
Two optional fields opt the package into curation:
{
"name": "ecommerce",
"version": "0.0.1",
"description": "Orders, customers, and revenue analysis",
"explores": ["order_analysis.malloy", "customer_health.malloy"],
"queryableSources": "declared"
}
explores (string[]) - an allowlist of model file paths (relative to the package root, not source or view names) whose models agents should discover and land on. Declaring it is the single opt-in for all discovery curation. With explores set, listings narrow to those files, and within each file to its export { ... } closure (below), so anything a listed file doesn't export is also dropped. Other files still compile, and can still be imported or joined, but are hidden from listings. Leaving explores absent or empty means every model is listed, unchanged from today, so existing packages don't break when this field is added. An entry that doesn't resolve to a real .malloy file surfaces in exploresWarnings; publishing a package that has any is rejected, so fix the path before publishing.queryableSources ("declared" | "all", default "declared") - the query boundary. Only takes effect once explores is set. "declared" makes queryable == discoverable: only the explores files and their export {} closure are valid top-level query targets; other sources still compile, import, and join, but a direct query against one is denied. "all" curates discovery only: every compiled source stays queryable even though explores narrows what's listed.About export { … }: explores filters which files are listed; export { … } (a Malloy statement) filters which sources within a file are exposed, the two compose. You usually don't write it: a file with no export exposes all of its own top-level sources. Add export { orders, customers } to a file to expose only those and keep imported/scaffolding helpers out of discovery (it must appear after the definitions it names). See Malloy: Imports & Exports.
Why curate here: declaring explores routes agents to the well-documented curated sources instead of raw tables, and queryableSources: "declared" keeps them from reaching the hidden sources by name. The two axes compose: list a file in explores for its models to be discoverable, and export a source within that file for it to be a landing point.
Not access control.
queryableSourcesgates the query surface (query / compile / MCP), not raw file retrieval by exact path, and it doesn't restrict who may query, only what is queryable by name. To gate access by caller-supplied identity/role, use#(authorize)on the source, seeskill:malloy-model§ Access Control anddocs/authorize.md. Discovery curation and#(authorize)are independent layers.
The manifest also carries a scope field ("package" | "version", default "package") controlling whether persisted/materialized artifacts are shared across published versions or owned by a single version, and a materialization field configuring that persistence policy (a cron schedule or a freshness window). Both are unrelated to discovery curation; there is no per-source sharing or schedule field, that was retired in favor of the single package-level scope and materialization.
With a valid publisher.json in place, confirm the package is in the flat, publishable shape described below. There is no publish tool to call in open-source v1; hand the package off to the host's publish path (git plus the deploy step for your Publisher instance).
All .malloy files must be in the package root (flat layout: the publisher does not support cross-directory imports yet).
<package-name>/
publisher.json
customers.malloy # Base source file
orders.malloy # Base source file
user_order_facts.malloy # Computed source
order_analysis.malloy # Source file (joins base sources)
customer_health.malloy # Source file
monthly_report.malloynb # Notebook (optional)
Publishable contents:
.malloy files - Semantic model definitions (base sources + joined sources).malloynb files - Notebooks for exploration/documentation (see skill:malloy-notebooks)publisher.json when you cut a new release, or if a publish step rejects a version that already exists.publisher.json exists; if not, create it (suggest name from model content, default 0.0.1)..malloy files in the package root.publisher.json and retry..malloy files into the package root; the publisher uses a flat layout.publisher.json before re-publishing.Step complete. Output: package is in publishable shape (valid publisher.json, flat layout), ready for the host's publish path.