Code Implementation
apache/shardingsphere
Implement, fix, refactor, or remove repository code under required scope, non-regression, verification, and review gates.
Build semantic models with Malloy for the Malloy Publisher. An agent skill from malloydata/publisher.
$ npx skills add malloydata/publisher --skill malloy-modeling -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install malloydata/publisher malloy-modeling --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/malloydata/publisher.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/malloy-modeling .claude/skills/malloy-modeling && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "malloy-modeling" agent skill from https://github.com/malloydata/publisher/tree/main/skills/malloy-modeling into .claude/skills/malloy-modeling/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "malloy-modeling", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/malloydata/publisher/tree/main/skills/malloy-modelingType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add malloydata/publisher --skill malloy-modeling -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install malloydata/publisher malloy-modeling --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/malloydata/publisher.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/malloy-modeling .agents/skills/malloy-modeling && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "malloy-modeling" agent skill from https://github.com/malloydata/publisher/tree/main/skills/malloy-modeling into .agents/skills/malloy-modeling/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "malloy-modeling", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add malloydata/publisher --skill malloy-modeling -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install malloydata/publisher malloy-modeling --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/malloydata/publisher.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/malloy-modeling .cursor/skills/malloy-modeling && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "malloy-modeling" agent skill from https://github.com/malloydata/publisher/tree/main/skills/malloy-modeling into .cursor/skills/malloy-modeling/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "malloy-modeling", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/malloydata/publisher.git --path skills/malloy-modeling--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add malloydata/publisher --skill malloy-modeling -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install malloydata/publisher malloy-modeling --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/malloydata/publisher.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/malloy-modeling .gemini/skills/malloy-modeling && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "malloy-modeling" agent skill from https://github.com/malloydata/publisher/tree/main/skills/malloy-modeling into .gemini/skills/malloy-modeling/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "malloy-modeling", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install malloydata/publisher malloy-modelingInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add malloydata/publisher --skill malloy-modeling -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/malloydata/publisher.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/malloy-modeling .github/skills/malloy-modeling && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "malloy-modeling" agent skill from https://github.com/malloydata/publisher/tree/main/skills/malloy-modeling into .github/skills/malloy-modeling/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "malloy-modeling", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add malloydata/publisher --skill malloy-modeling -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install malloydata/publisher malloy-modeling --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/malloydata/publisher.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/malloy-modeling .opencode/skills/malloy-modeling && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "malloy-modeling" agent skill from https://github.com/malloydata/publisher/tree/main/skills/malloy-modeling into .opencode/skills/malloy-modeling/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "malloy-modeling", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
malloy-modelingBuild semantic models with Malloy for the Malloy Publisher. An agent skill from malloydata/publisher.
Malloy Modeling is an agent skill from malloydata/publisher. Build semantic models with Malloy for the Malloy Publisher. Read this skill whenever the user asks about modeling data or specifically mentions Malloy.
Its SKILL.md is about 4.6k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Databases. The repository describes itself as: Publisher is the open-source analytics engine for Malloy. It lets you define data models once — and use them everywhere. The licence is MIT.
5 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 39a546f. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
npmFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use npm, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Malloy Modeling loads about 4.6k tokens when it runs. Until then it costs about 42 tokens; SKILL.md has 2,286 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from malloydata/publisher at commit 39a546f, republished under its MIT licence (© malloydata). 2,286 words, ~4,569 tokens.
.claude/skills/malloy-modeling/SKILL.md (or your agent's skills folder).<!--
Copyright (c) Credible Data Inc.
SPDX-License-Identifier: MIT
-->
AI AGENTS: You MUST review this file before writing Malloy code. Cross-skill references below use logical
skill:names; load the referenced skill before acting. Before writing code, also read the gotcha skills:skill:malloy-gotchas-modeling,skill:malloy-queries, andskill:malloy-charts.
get_context returns that package's sources, views, and fields (with their docs).get_context has nothing to return, so use search_database_schema instead. It walks the connection's schemas and tables, ranks them against a plain-English description, and gives you each table's columns plus the source: line to start from. Take those names verbatim into step 5.
Never guess field names either way.search_malloy_docs BEFORE writing unfamiliar patterns (window functions, query-based sources, pipelines). Don't guess. Malloy syntax is specific and SQL intuition is often wrong.search_malloy_docs takes plain topics such as "window functions", "comparing timeframes", "cohort analysis", "percent of total", "histogram", "nesting", "rendering".skill:malloy-gotchas-modeling, skill:malloy-queries, and skill:malloy-charts prevent the most common mistakes.Quick syntax reminders:
`Date`, `Hour`, `Timestamp`, `Type`, `number`, `source`having: for aggregate filters: not where: on measuresgroup_by if using them in order_bycount() counts rows; count(x) counts distinct values of x: count(distinct x) is deprecated, write count(x)# label="Revenue" and # currency on separate lines# currency not # currency=usd0mavg(score::number) not avg(score)= true not = 'true' (no quotes!).csv, .parquet, .json, .ndjson, and .xlsx all work as-is through duckdb.table('data/file.ext'). Never convert a file to another format first, and never read one with python or jq to "have a look" first: query it. For .xlsx, check the row count before trusting it: a workbook with a title row or a blank spacer reads short and reports no error. (Per-format quirks: skill:malloy-gotchas-modeling)modeling-notes.mdIf the IDE has a native plan mode, use it for the high-level approach: do data exploration during planning, then present a concrete plan for user approval before writing any files.
modeling-notes.md is an expected output of the workflow, not an optional extra. Start it at step 2 (Propose Scope) and grow it as you work: it persists alongside the model, and its value is as the thing the user argues with at step 3, before source files exist; written after the build it can only document decisions already baked in. Record findings and problems as they are found during discovery (skill:malloy-discover), and every unconfirmed decision as an open item. Only when there is no writable workspace do the notes live in the conversation instead.
Keep it compact, with these sections:
# Modeling notes - <package>
## Scope what was confirmed, what the model is FOR, skip list with reasons
## Grain and keys proven by query, not by column name
## Coverage coverage cliffs; columns excluded for nullity
## Decisions each with its evidence
## Open decisions ASSUMPTIONS, NOT CONFIRMED: every threshold or definition the user
has not settled, one entry each, mirrored by a hedge in its #(doc)
## Validation reconciliation checks performed, and their resultsThe agent orchestrates all steps. Steps marked (user) pause for input. Each step has a dedicated skill with full instructions. Read each step's skill before starting that step, including the decision skills for steps 1–4 (skill:malloy-discover, skill:malloy-define). They govern what the model says; skipping them to reach the build skills is how unreviewed business logic ships.
A field is not complete until it has its definition, #(doc) tag, and rendering tags, and any threshold or business convention in it is user-confirmed, distribution-derived, or explicitly flagged in its #(doc) (see skill:malloy-document § Mark conventions as conventions). Documentation is part of defining a field, not a separate activity. Read skill:malloy-document for full documentation standards (doc string writing, tag ordering).
DISCOVER → SCOPE → SOURCES → DEFINITIONS → BUILD BASE → BUILD JOINED → REVIEW → CURATE
(silent) (user) (user) (user) (agent) (agent) (user) (user)| Step | Skill | What Happens |
|---|---|---|
| 1. Discover | skill:malloy-discover | Read the model and data; scan sources, fields, distributions; detect prior art. With no package yet, start from search_database_schema to find the tables in the connection |
| 2. Propose Scope | skill:malloy-define (Propose the analytical scope) | Present findings, user selects focus |
| 3. Propose Sources | skill:malloy-define | Propose source plan, user confirms architecture |
| 4. Propose Definitions | skill:malloy-define | Propose fields per base source, user confirms logic |
| 5. Build Base Sources | skill:malloy-model | Write fully documented base source files (one per table), check diagnostics. Read skill:malloy-document for doc standards. |
| 6. Build Joined Sources | skill:malloy-model | Write fully documented joined source files, validate. Read skill:malloy-document for doc standards. |
| 7. Review | (none) | Present the review checklist below; user confirms or corrects |
| 8. Curate | skill:malloy-model | Propose the published surface (an index.malloy with export { ... }) and access controls (access modifiers, gates); always propose, the user decides whether to apply |
These are governed semantic models: the business decisions in them must be confirmed by a human subject-matter expert, and the (user) steps exist to collect that confirmation. They are real stops, not progress reports. A model can be complete, compiling, and fully documented and still be wrong everywhere it guessed; a capable agent can build the whole thing without pausing once, which is exactly the failure mode this workflow exists to prevent.
When a decision goes unanswered (the user explicitly declines to decide, or nobody is there to ask), do not silently proceed as if it were settled. Take your best-supported position, label it an assumption in the field's own #(doc) (see skill:malloy-document § Mark conventions as conventions), record it under "Open decisions" in modeling-notes.md, and raise it again at Review. An unlabeled assumption is indistinguishable from a confirmed fact, and misleads everyone downstream.
Present these to the user, with answers:
#(doc) hedge that marks it.The user confirming this checklist is what makes the model governed. A summary of what you built is not a checkpoint.
Publishing is out of scope for open-source v1. Self-hosters move a finished model into a served package via git and the host's publish path; see skill:malloy-publish for the local-to-served handoff.
Two paths to a model: both produce the same fully documented result:
skill:malloy-model-as-you-go. It answers the question with skill:malloy-analysis, then codifies what the answer assumed into the model, one question at a time, confirming binding decisions first. The model exists by the end; there is no separate formalize step.skill:malloy-analysis (its "no specific question" branch). If it turns into something worth keeping, formalize via skill:malloy-model (reference/analysis-to-model.md).Research before asking. Present proposals with evidence. Never ask open-ended questions: propose with data and let the user confirm.
Use business language. Say "I simplified the column name" not "reserved word replaced." Don't expose Malloy internals unless the user asks.
Describe what you're doing, not which step you're on. The user doesn't have the skill files open. Say "I'll propose which tables to include and how they relate" not "Steps 3 and 4." Say "Now I'll write the source files" not "Moving to Step 5." Explain the purpose of each phase in plain language before doing it.
Present choices as A/B/C. When asking the user to choose, use lettered options with one-line descriptions. Mark your recommendation.
Complete all workflow steps. Once modeling begins, complete through Review and propose Curate. A field without documentation is not finished. If you lose track, re-read the model and your notes. Every source you write gets a source-level #(doc) description and a stated grain (primary_key: or "one row per ..."), including intermediate steps such as a de-duplication or clean-up source. Or fold the clean-up into the one source it feeds, so there is nothing undescribed left in the package. Build a dashboard or notebook only when the user asks for one.
| User says... | Route to |
|---|---|
| "Model my data", "create a model" | 8-step workflow (skill:malloy-discover) |
| "Model from LookML" | 8-step with prior art via skill:malloy-lookml-review |
| "Explore this data", "what's interesting?", "show me the top X" | skill:malloy-analysis (no specific question) |
| "Build a dashboard", "create views" on existing model | skill:malloy-dashboards for a saved dashboard; skill:malloy-charts for views in the model. A notebook (skill:malloy-notebooks) only when the user asks for one or the package already has them |
| "Build a model but not sure what metrics" | skill:malloy-model-as-you-go: answer their first real question, codify what it assumed, repeat |
If the user's first message is a data question (not "build me a model"), route to skill:malloy-model-as-you-go. It answers with skill:malloy-analysis and grows the model from what each answer assumed, so there is nothing to formalize afterwards.
These supplemental skills may also be loaded as needed:
skill:malloy-getting-started: routing guide to the other Malloy skillsskill:malloy-gotchas-modeling: also the place to fix compile errors and read diagnosticsModeling needs these tools, or their REST equivalents when you run unattended; skill:malloy-getting-started section 0 covers both cases. No server yet? skill:malloy-getting-started covers setup, including the one-command scaffolder (npm create @malloy-publisher/malloy-package@latest <name>) and why local authoring needs --watch-env <env>: start the server without it and your saved edits are never read.
| Tool | Purpose |
|---|---|
get_context | Ground yourself in a package: its sources, views, and fields |
execute_query | Run ad-hoc queries for validation |
compile_model | Compile-check a change and get diagnostics back without running a query |
reload_package | Recompile a package from disk so a saved edit becomes queryable by name |
search_malloy_docs | Search Malloy docs (call BEFORE unfamiliar patterns) |
search_database_schema | Find the tables in a database connection by plain-English description, when modelling data that is not in a package yet. Returns each table's columns and the source: line to start from. Names and types only: no row value is returned |
Never guess field names. Ground yourself with get_context to see the sources and fields a package defines.
Publisher compiles each configured package at boot and serves that cached model, so a source or view you add afterwards is not queryable by name until you reload the package. The loop is:
compile_model, picking the scope that matches what you are doing:scope: "append") compiles your text in the model's namespace. Note its diagnostic positions land in the model-plus-your-text concatenation. Append checks your text against what the model already publishes, so it refuses text that declares its own data root -- import, connection.table(...) and connection.sql(...) are rejected. A source: line handed to you by search_database_schema is exactly that shape, so validate it at file or package scope instead.scope: "file", with the whole edited file as source. It compiles your text AS the file (append would collide with "Cannot redefine"), and diagnostics land at the true line numbers of your text.scope: "package" with the edited file as source runs reload's worker compiler over every .malloy and .malloynb file against your edit, so a rename that breaks an importer surfaces now instead of at reload. Each diagnostic carries model, the file it points at; files hidden from discovery can appear. If modelPath does not exactly match an existing file, a warning says the source was treated as new.reload_package.execute_query.A reload that fails to compile is safe: your files are left alone and the previously compiled model keeps serving, with the compile errors returned to you. Compile first anyway for faster feedback, and a scope: "package" dry-run with no source uses reload's compiler and file selection (imports across files, every .malloy and .malloynb file as saved) without touching the served model. Keep the source of truth outside publisher_data/, which is not version-controlled and is wiped by a --init restart. If these tools are missing, the Publisher you are connected to predates them; fall back to validating with a throwaway execute_query. An older Publisher that has compile_model but rejects scope supports only the append behavior.
| SQL | Malloy |
|---|---|
COUNT(*) | count() |
COUNT(DISTINCT x) | count(x) |
NOW() | now |
CASE WHEN...END | pick...when...else |
col IN ('a','b') | col ? 'a' | 'b' |
COALESCE(a,b) | a ?? b |
CAST(x AS type) | x::type |
DATEDIFF(day, a, b) | days(a to b) |
CONCAT(a, b) or a || b | concat(a, b) |
TIMESTAMP_DIFF(a, b, SECOND) | seconds(b to a) |
source:, dimension:, measure:, view:is not as: dimension: name is expressionrun: source -> { operations }join_one:, join_many:, join_cross:revenue / nullif(count, 0)measure: then indent fields beneathWRONG: source flights is ... RIGHT: source: flights is ...
WRONG: dimension: x as y RIGHT: dimension: y is x
WRONG: count(*) RIGHT: count()
WRONG: count(distinct x) RIGHT: count(x)
WRONG: revenue / order_count RIGHT: revenue / nullif(order_count, 0)
WRONG: run: src { ... } RIGHT: run: src -> { ... }Malloy has many reserved words. When in doubt, backtick it. Most likely to appear as column names:
date, time, day, month, year, quarter, week, hour, minute, second,
number, string, boolean, type, table, source, index, count, sum, avg, min, max,
true, false, null, is, on, with, all, from, by, in, to, for, select, order_by,
top, bottom, desc, asc, row, range, current, window, ranknumber: only the bare word needs backticking; account_number is finesource: reserved; use a different alias like traffic_sourcestring, boolean, true, false: backtick any column with these exact namesThe following skills contain detailed WRONG/RIGHT patterns that prevent the most common Malloy errors. Read them before writing code:
skill:malloy-gotchas-modeling: Reserved words, NULL checks, date functions, type casts, rename pitfalls, query-based source gotchas, conn.sql() anti-patternskill:malloy-queries: Syntax and the common compile errors: chart constraints, aggregate filters, joined field aliasing, method syntax, time truncation vs extractionskill:malloy-charts: Chart selection, tag syntax, scale rules, sparkline setup, big_value patterns© malloydata, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in skills/malloy-modeling of malloydata/publisher.
Open the folder on GitHubat commit 39a546f
Malloy Modeling next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Malloy Modeling this skillmalloydata/publisher | 116 | — | ~4.6k | Automated safety check: Pass | MIT | |
| Code Implementationapache/shardingsphere | 21k | — | ~1.2k | Automated safety check: Pass | Apache-2.0 | |
| Implement Commandredis/node-redis | 18k | — | ~5k | Automated safety check: Pass | MIT | |
| Clickhouse IohellangleZ/burn-in-cceverywhere-ralph | 112 | 14 repos | ~2.5k | Automated safety check: Pass | None | |
| Record Vhs Demobruin-data/bruin | 1.8k | — | ~1.3k | Automated safety check: Pass | Apache-2.0 | |
| Add Ingestr Sourcebruin-data/bruin | 1.8k | — | ~1.6k | Automated safety check: Pass | Apache-2.0 |
apache/shardingsphere
Implement, fix, refactor, or remove repository code under required scope, non-regression, verification, and review gates.
redis/node-redis
Add a new Redis command (or command variant) to node-redis end-to-end — the <NAME.ts Command file, its registration with JSDoc in the package commands/index.ts, and a co-located <NAME.spec.ts with…
hellangleZ/burn-in-cceverywhere-ralph
ClickHouse database patterns, query optimization, analytics, and data engineering best practices for high-performance analytical workloads.
bruin-data/bruin
Create, update, render, and visually verify polished Bruin CLI terminal demos with VHS.
bruin-data/bruin
Add Bruin CLI support for a new ingestr source. An agent skill from bruin-data/bruin.
bruin-data/bruin
A skill your agent uses when creating, editing, reviewing, or troubleshooting Bruin semantic layer models, semantic query CLI usage, metric and dimension definitions, joins, segments, filters…
malloydata/publisher
Score one analytical answer against a verified golden, and score which of the entities the golden depends on retrieval delivered to the answerer.
malloydata/publisher
Fix a CRITICAL Trivy finding that is failing CI in this repo (a vulnerability, misconfiguration, or secret from security-scan.yml or image-scan.yml), or add, review, or retire an entry in…
malloydata/publisher
Turn a list of questions into an eval set, whatever shape it arrived in: a JSONL a customer sent, a CSV, a spreadsheet export, a markdown doc, an email thread, or a pull from production logs.
malloydata/publisher
Conduct a local Publisher evaluation loop in five steps: scrape/run, eval, diagnose, improve, checkpoint.
malloydata/publisher
Make the smallest safe Malloy model edit that closes a diagnosed model-owned gap, with a probe receipt for every factual claim.
malloydata/publisher
Decide whether ONE answer matches its golden, and say whether you believe the golden.
Categories
Build semantic models with Malloy for the Malloy Publisher. An agent skill from malloydata/publisher. Malloy Modeling is an agent skill from malloydata/publisher. Build semantic models with Malloy for the Malloy Publisher.
Malloy Modeling fits situations like: databases work in your project.
Run `npx skills add malloydata/publisher --skill malloy-modeling -a claude-code`. Or copy the skill folder (skills/malloy-modeling in malloydata/publisher) into .claude/skills/malloy-modeling in your project. Claude Code loads it when a task matches its description.
Run `npx skills add malloydata/publisher --skill malloy-modeling -a codex`. Or copy the skill folder (skills/malloy-modeling in malloydata/publisher) into .agents/skills/malloy-modeling in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add malloydata/publisher --skill malloy-modeling -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/malloy-modeling, .gemini/skills/malloy-modeling, .github/skills/malloy-modeling and .opencode/skills/malloy-modeling in your project.
Going by SKILL.md and its folder, Malloy Modeling needs the command-line tools its instructions call (npm). Our summary lists: Python 3.
SKILL.md contains no URLs. Its commands use npm, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Malloy Modeling is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.6k tokens (SKILL.md is roughly 18k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Malloy Modeling: Code Implementation (apache/shardingsphere, 21k stars), Implement Command (redis/node-redis, 18k stars), Clickhouse Io (hellangleZ/burn-in-cceverywhere-ralph, 112 stars) and Record Vhs Demo (bruin-data/bruin, 1.8k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
malloydata (a GitHub organization) maintains it in malloydata/publisher, which has 116 GitHub stars. The repository holds 29 skills in this directory. The repository was last updated on October 8, 2026.
Source: malloydata/publisher on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.