From bino-report
The disciplined loop for authoring bino report manifests (YAML + SQL) through the bino MCP server — read the live schema, learn a dataset's columns, draft, validate_draft, write, then validate_project and build. Use whenever creating, editing, or wiring bino manifests (DataSource, DataSet, Table, Text, Tree, ChartTime, ChartStructure, LayoutPage, ReportArtefact, …) or fixing validation diagnostics. Pairs with bino-ibcs for the report semantics.
How this skill is triggered — by the user, by Claude, or both
Slash command
/bino:bino-authoringThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
bino is **Report-as-Code**: a report is a set of YAML manifests (each typed by a `kind`) plus SQL.
bino is Report-as-Code: a report is a set of YAML manifests (each typed by a kind) plus SQL.
bino's JSON Schema and validators tell you precisely whether what you wrote is correct — they are
your guardrails. Lean on them; never guess structure.
Always read structure from the running server. Never recall or hard-code a manifest's fields. The schema is the source of truth and it evolves.
list_kinds → every available kind and its capability category (data / layout / embeddable
/ artefact / config). Plugins can add kinds, so always check.describe_kind(kind) (or the bino://schema/{kind} resource) → the self-contained spec schema for
one kind, with $defs. Read it before drafting that kind.describe_project() / bino://documents → every document already in the project.If you find yourself writing a field you didn't see in describe_kind, stop and re-read the schema.
For every manifest you create:
describe_kind("Table") (or whichever kind).${data…} binding, call get_columns("sales")
to get the real column names (prefix $ to force a DataSource: get_columns("$raw")). Use
get_rows("sales", 20) to ground values you'll reference in narrative.validate_draft(yaml) before touching disk. Fix every diagnostic and
re-validate until clean. This is the pre-write guardrail; use it on every draft.create_manifest(kind, name, spec, …) to create a new manifest (it builds the
apiVersion/kind/metadata/spec envelope, validates, and places the file by convention), or
write_manifest(file, yaml, append?) for a full document / a multi-doc file.validate_project() to catch cross-document and reference problems
that an in-memory draft can't see. Resolve diagnostics (see Fixing below).build(artefacts?) only when the project validates. It renders PDFs via headless
Chrome: slow, and it writes files. A clean validate_project does not guarantee a good-looking
PDF — a human still needs to look at it.The MCP server's own instructions summarize this loop; this skill is the disciplined version of it.
A report is a small dependency graph. Build it from the leaves up so every reference resolves at the moment you write it:
DataSource (raw input), then DataSet (typed SQL over sources).Table, Text, Tree, ChartTime, ChartStructure — each binding to a
dataset by name.LayoutPage / LayoutCard / Grid arranging the embeddables.ReportArtefact referencing the pages.References are by metadata.name (and $ref where the schema uses it). After wiring, use
graph_deps(kind, name, direction?) to confirm dependencies (out) and dependents (in) resolve.
edit_manifest(file, position?, patch) for surgical fixes: it applies dotted-path edits
(e.g. {"spec.title": "Q3", "spec.columns[0]": "region"}) in place, preserving comments and key
order, and validates before writing. Reach for it before rewriting a whole document.validate_project() and confirm the specific diagnostic is gone — don't
assume a fix worked.describe_kind every time.get_columns confirms the column names.build before validate_project is clean.npx claudepluginhub bino-bi/bino-cli --plugin binoProvides CDSS development patterns for drug interaction checking, dose validation, clinical scoring (NEWS2, qSOFA), and alert classification integrated into EMR workflows.